现在在做供应链项目,项目还是一套微服务架构体系。注册中心从之前用的eureka换到了consul。架构的理由估计是eureka不更新了吧。所以来学习一下consul的内容。
最近比较忙,我也不再单独查资料了,就把自己知道的写出来好了。如有错误请指正哈。
什么是consul
consul是一个spring cloud 中集成好的开源的分布式的服务注册发现中心。由Go语言编写。支持健康检查,多数据中心还支持k-v存储,采用RAFT一致性算法,保证强一致性,可用性。并且和docker完美兼容。
consul和eureka区别
Eureka优点是注册速度很快,不管同步到其他节点时是否有问题,只要服务注册到主节点既代表注册成功。牺牲了一致性,但是保证了高可用性和最终一致性。即使当前节点因为一些问题没有注册成功,那么也会通过其他节点找到当前服务,返回元数据。
和eureka相比,consul注册就稍慢一些了。上面提到了,consul是强一致性的,所以consul注册服务是先注册,然后同步到各节点,raft算法使consul在有一半以上的节点注册成功时才证明服务注册成功。这样保证了数据的一致性。但也因为这样,导致注册服务相对较慢,并且当主节点挂掉之后,重新选举时整个consul不可用。可以说是牺牲了一部分可用性换来的一致性。
那么如何选择呢?
还是看需求吧,目前eureka已经不再更新,不过功能已经够用。我觉得还是要看是要保证一致性还是可用性了。
consul使用
收线下载consul。地址:https://www.consul.io/downloads.html
然后我们使用一个bat启动一下consul。
@echo off
consul agent -dev -client 127.0.0.1 -ui
pause
这里使用consul给我们提供的dev模式,指定本机IP。
启动后访问:http://localhost:8500/ui/dc1/services
会看到这个页面:
这里我们的consul已经启动完成了。和eureka不同的是他不用使用idea启动,直接下载即可。
然后我们需要一个生产者和一个消费者,其实consul也是支持ribbon的。所以我们这里模拟2个生产者。一个消费者。看消费者会不会负载均衡的调用生产者。
这里就简单写了。回头会把源码上传一份。
spring boot版本2.1.5.release spring cloud 版本Greenwich.SR1.
配置一下要注册到consul的生产者依赖:
<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>
这里注意两点,一个是版本号要对应,spring boot 2.1.x以上版本要使用Greenwich版本的spring cloud 不然无法兼容。
第二个是注册consul要有两个依赖,之前看了一个资料写只需要spring-cloud-starter-consul-discovery。其实是不行的。
然后是yml:
server:
port: 8082
spring:
application:
name: consul-producer
cloud:
consul:
host: 127.0.0.1 #consul的IP
port: 8500 #consul启动端口默认8500
discovery:
healthCheckPath: /actuator/health #健康检查路径
healthCheckInterval: 15s #健康检查频率
hostname: 127.0.0.1 #注册服务所在IP
port: ${server.port} #注册服务所在端口
service-name: ${spring.application.name} #注册服务名
register: true #是否启动注册
register-health-check: true #是否启动健康检查
后面还是启动类添加注解:
@EnableDiscoveryClient
生产者和消费者都需要这么配置。
具体的测试代码我就不放出来了。服务间调用还是使用的openfeign做的。
我把内容放在下载里面。大家下载下来看一下就知道了。
测试时,需要注意的是,先打开IDEA的多端口启动,然后8081启动一个producer,8082启动一个producer。
重复请求consumer。会发现每次调用的producer是不一样的。而且控制台会打印出ribbon的日志。所以consul也是支持负载均衡的轮询方式的负载均衡的。