一、什么是Spring Cloud Consul?
- Spring Cloud Consul 为 SpringBoot 应用提供了 Consul的支持,Consul既可以作为注册中心使用,也可以作为配置中心使用。
- Spring Cloud Consul 是HashiCorp公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。
- Spring Cloud Consul 的这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
二、支持哪些功能?
-
支持服务治理
Consul作为注册中心时,微服务中的应用可以向Consul注册自己,并且可以从Consul获取其他应用信息。
-
支持客户端负责均衡
包括Ribbon和Spring Cloud LoadBalancer。
-
支持Zuul
当Zuul作为网关时,可以从Consul中注册和发现应用。
-
支持分布式配置管理
Consul作为配置中心时,使用键值对来存储配置信息。
-
支持控制总线
可以在整个微服务系统中通过 Control Bus 分发事件消息。
三、常见注册中心对比
-
zookeeper
基于Zab协议,Zookeeper可以用于构建具备数据强一致性的服务注册与发现中心,而与此相对的是牺牲了服务的可用性和增加了注册服务所需要的时间。
-
eureka
Eureka中没有使用任何的数据强一致性算法保证不同集群间的Server数据一致,仅仅通过数据拷贝的方式实现注册中心数据的最终一致性,虽然放弃了数据的强一致性但是换来了Server的高可用性,降低了注册的代价,提高了集群运行的健壮性。
-
consul
它是基于Raft算法提供了数据强一致性的注册中心服务,但是由于Leader节点会承担所有的处理工作,所以加大了注册和发现的代价,降低了服务的可用性。通过Gossip协议,Consul可以很好地监控Consul集群的运行状态,同时可以方便通知各类事件到所有的服务节点。
四、搭建注册中心
-
服务端项目
-
下载
https://www.consul.io/downloads
-
运行
# 查看版本 consul --version # 启动服务 consul agent -dev
-
访问
http://localhost:8500
-
-
客户端项目
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--consul监控的必须依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
application.yml
server: port: 8081 spring: application: name: consul-service-8081 cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name}
-
测试
http://localhost:8500
-
五、搭建配置中心
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
-
添加配置
-
application.yml
spring: profiles: active: dev
-
bootstrap.yml
server: port: 9101 spring: application: name: consul-config-client cloud: consul: host: localhost port: 8500 discovery: serviceName: consul-config-client config: # 是否启用配置中心功能 enabled: true # 设置配置值的格式 format: yaml # 设置配置所在目录 prefix: config # 设置配置的分隔符 profile-separator: ':' # 配置key的名字,由于Consul是K/V存储,配置存储在对应K的V中 data-key: data
-
-
添加Controller
@RestController // 动态刷新(Consul使用其自带的Control Bus 实现了一种事件传递机制,从而实现了动态刷新功能) @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } }
-
Consul中心添加配置
# key config/consul-config-client:dev/data # value config: info: "config info for dev"
-
访问
http://localhost:9101/configInfo
会打印出我们配置的value信息: config info for dev
【源码地址】:GitHub