Consul简介
什么是Consul
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对. 命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品. 一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
优点:基于raft协议,简洁;支持健康检查使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper采用的是 Paxos, 而 etcd 使用的则是 Raft,同时支持HTTP和DNS协议,支持跨数据中心的WAN集群,提供了图形化界面;支持跨平台,支持Linux、Mac、Windows。 Consul的功能: 1. 实现服务注册发现,提供了了HTTP和DNS两种发现方式 2. 健康检测,支持多种方式,Http,Tcp,Docker,Shell脚本定制 3. KV存储 4. 支持多数据中心 5. 可视化Web界面
下载
下载地址:https://www.consul.io/downloads
中文使用教程
Consul中文使用教程:https://www.springcloud.cc/spring-cloud-consul.html
安装运行Consul
window系统
安装说明,下载完成后只有一个consul.exe文件,硬盘路径下双击运行,查看版本信息 运行 使用开发模式
consul agent -dev
启动成功后访问:http//localhost:8500
Centos8 docker
拉取镜像
docker pull consul:1.6.1
运行镜像
docker run --name consul -d -p 8500:8500 --restart always consul:1.6.1
访问
demo演示
服务提供者
新建cloud-provider-consul8004模块,pom.xml文件如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml配置文件。
server:
port: 8004
spring:
application:
name: consul-provider-payment
cloud:
consul: # consul注册中心地址
host: 192.168.110.129
port: 8500
discovery:
service-name: ${spring.application.name}
hostname: 192.168.22.125
启动类
package com.tianye;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author 田野上的风筝
* @version V1.0
* @Description: TODO
* @date 2020/8/22 9:49
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProviderMain8004 {
public static void main(String[] args) {
SpringApplication.run(ConsulProviderMain8004.class,args);
}
}
controller层
package com.tianye.order.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @author 田野上的风筝
* @version V1.0
* @Description: TODO
* @date 2020/8/22 9:55
*/
@RestController
@Slf4j
public class ConsulPaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "Spring Cloud Consul port:" +serverPort;
}
}
启动项目,浏览器访问http://localhost:8004/payment/consul,可以访问到内容。
服务消费者
新建cloud-consumer-cousl-80模块,pom文件如下 跟上面一致
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml配置文件 同样也需要将服务注册到consul中
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: 192.168.110.129 # consul注册中心地址
port: 8500
discovery:
hostname: 192.168.22.125
service-name: ${spring.application.name}
主启动类
package com.tianye;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author 田野上的风筝
* @version V1.0
* @Description: TODO
* @date 2020/8/22 10:15
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerMain80 {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerMain80.class,args);
}
}
config配置 新建一个配置文件 初始化RestTemplate @LoadBalanced注解在这篇文章有提及,提供负载均衡功能
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
controller层 使用RestTemplate 实现服务的调用
package com.tianye.order.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @author 田野上的风筝
* @version V1.0
* @Description: TODO
* @date 2020/8/22 10:23
*/
@RestController
public class ConsulConsumerOrderController {
private final String baseUrl = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/consul/get")
public String get(){
return "consumer"+ restTemplate.getForObject(baseUrl+"/payment/consul",String.class);
}
}
启动服务者和消费者,访问http://localhost/consumer/payment/consul可以看到成功调用了服务者的接口,在Consul的Web界面也可以看到注册进来的生产者服务和消费者服务的。
consul 在CAP理论中是满足CP的, 附上CAP Theorem 图