本节示例代码在: https://github.com/laolunsi/spring-boot-stack
在第一节 SpringCloud服务注册与发现之Eureka 中,讲述了基于Eureka的服务中心的构建,为什么还需要Consul呢?
当然是因为它更好用、更好看了!
Consul官网: https://www.consul.io/
Spring官网关于consul的描述: https://spring.io/projects/spring-cloud-consul
Spring Cloud Consul provides Consul integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms....The patterns provided include Service Discovery, Distributed Configuration and Control Bus.
Consul提供了一个快速开发SpringCloud的集成环境,支持服务注册、Ribbon与负载均衡、Zuul、分布式配置、控制总线。
要使用consul作为服务注册中心,首先需要下载它。
从官网下载consul: https://www.consul.io/
支持macOs/FreeBSD/Linux/Solaris/Windows,下载压缩包并解压后,会得到一个可执行文件(在win系统下是consul.exe文件)
选择对应版本,下载,解压,然后将它的地址添加到系统环境变量中(这一步自行百度即可)
然后使用命令 consul agent -dev
运行开发环境:
打开浏览器,输入consul默认的可视化地址 localhost:8500
:
到这一步,consul已经启动成功了。
下一步,我们更改在上一篇文章 服务调用之Feign 中的项目,将eureka的依赖和配置改成consul的即可。其他信息在此就不予赘述了。
这里我们修改一下上一篇文章 服务调用之Feign 中的项目。
引入 consul-discovery
依赖,代替 eureka-server
:
<properties> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 服务治理 consul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!-- 健康检查 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <dependencyManagement> <!-- 省略... --> </dependencyManagement>
修改application.yml配置文件:
server: port: 8505 spring: application: name: service-producer cloud: consul: host: localhost port: 8500 # consul默认端口 discovery: register: true instance-id: ${spring.application.name}:${server.port} service-name: ${spring.application.name} port: ${server.port}
然后在启动类上,只能使用 @EnableDiscoveryClient
注解来启用服务发现。
与服务提供者相同,引入consul配置即可。具体可以到git上看项目代码示例。
分别启动consul,service-producer, service-consumer,可以看到两个服务已经注册成功:
下面测试一下接口:
首先单独测试一下服务 service-producer
:
然后测试一下 service-consumer
去调用 service-producer
:
这里有一个问题,当使用Consul来进行服务治理时,如果SpringBoot和SpringCloud版本不匹配,可能会出现服务注册没有执行的情况,但是控制台不会有错误信息。
比如SpringBoot采用2.1.7.RELEASE版本,而SpringCloud采用Finchley.RELEASE版本,就会出现这个问题。
必须看到Spring项目控制台出现以下信息,才说明服务注册被启动了:
2019-08-28 15:33:52.881 INFO 11392 --- [ main] o.s.c.c.s.ConsulServiceRegistry : Registering service with consul: NewService{id='service-consumer-8506', name='service-consumer', tags=[secure=false], address='DESKTOP-V748F38', port=8506, enableTagOverride=null, check=Check{script='null', interval='10s', ttl='null', http='http://DESKTOP-V748F38:8506/actuator/health', tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null}
从上面的示例可以看出,consul比eureka更加方便,功能更加复杂。而eureka的使用必须要创建一个eureka服务,并且需要手动进行配置。
参考资料