Consul 是一个分布式高可用的系统,它包含多个组件,但作为一个整体在微服务架构中提供服务发现和服务配置的工具。Spring Cloud Consul 项目是针对Consul的服务治理实现,是Eureka的替代方案,有比Consul跟全的功能:
Consul 角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯。
1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
2、Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
4、该临时表每隔10s会更新,只包含有通过了健康检查的 Producer
Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。
Consul与Eureka的区别
Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比:
下载完成后解压到对应目录,目录下只有一个consul.exe
的启动程序。
也可以通过doc命令启动,并配置一些参数:
//开发模式下监听任意地址的注册
consul agent -dev -client=0.0.0.0
Consul的后台管理界面的地址是:http://ip:8500
。
只能以开发者模式开启才能使用postman工具即可模拟注册与发现。
consul服务注册的地址是http://ip:8500/v1/catalog/register
,请求方式是``put```。
consul服务发现的地址是http://ip:8500/v1/catalog/services
,请求方式是get
。
通过postman工具可以模拟服务的注册与发现过程。实际运用是,注册与发现地址隐藏了。
spring-boot-starter-actuator
健康检查依赖于此包。
spring-cloud-starter-consul-discovery
Spring Cloud Consul 的支持。
Consul还支持kv存储:
如何在consul上注册服务?
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
<version>2.2.8.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
<version>2.6.6version>
dependency>
# 服务注册到注册中心
# 服务名称
spring.application.name=bill-service
# 配置服务端口
server.port=8081
# consul的相关配置
# consul所在的服务器的ip地址
spring.cloud.consul.host=127.0.0.1
# consul所在的服务器的端口
spring.cloud.consul.port=8500
# consul服务器实例相关配置
# 是否将自己注册
spring.cloud.consul.discovery.register=true
# 实例id
spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}
# 实例名称
spring.cloud.consul.discovery.service-name=${spring.application.name}
# 实例端口
spring.cloud.consul.discovery.port=${server.port}
# 是否指定ip注册
spring.cloud.consul.discovery.prefer-ip-address=true
# 当前服务的ip地址
spring.cloud.consul.discovery.ip-address=127.0.0.1
启动服务注意别忘了在启动类上加@EnableDiscoveryClient
注解。启动时还遇到了一个小错误Failed to introspect Class org.springframework.cloud.context.properties.ConfigurationPropertiesBean
5. 查看服务
服务已成功注册到注册中心。
相关配置详解
# 直接指定服务的 consul service id(即 instance id).
# 默认情况下为 spring.application.name + server.port, 如果在多个服务器上同一个服务, 因为应用名和端口都一致, 会导致service id 会重复, 所以一般情况都需要引入一个随机数避免重复 .
spring.cloud.consul.discovery.instance-id=${spring.application.name}-${random.value}
# 指定服务的 consul service name
spring.cloud.consul.discovery.service_name=some_name
# consul 服务器主机名
spring.cloud.consul.discovery.hostname=your_host
# consul 服务器端口
spring.cloud.consul.discovery.port=8500
# 维护 tags
$ 下面示例的 tag map 是: foo->bar 和 baz->baz
spring.cloud.consul.discovery.tags:foo=bar, baz
# 是否启用服务发现
spring.cloud.consul.discovery.enabled=true
# 使用 consul 服务器 IP, 而不是 hostname, 需要搭配 prefer-ip-address 属性
spring.cloud.consul.discovery.ip-address=127.0.0.1
# 在注册时使用 consul IP, 而不是 hostname
spring.cloud.consul.discovery.prefer-ip-address=false
#设定 consul acl token 值
spring.cloud.consul.discovery.acl-token=4efb1523-76a3-f476-e6d8-452220593089
# 健康检查的频率, 默认 10 秒
spring.cloud.consul.discovery.health-check-interval=10s
# actuator 健康检查的 url 路径
# 默认为 为${management.endpoints.web.base-path} +/health
spring.cloud.consul.discovery.health-check-path=
# 自定义健康检查的 url(适合于不适用 actuator 的场景)
spring.cloud.consul.discovery.health-check-url=
总结
**首先pom文件加载必须的依赖,一个使发现并连接Consul的依赖,一个健康信息检查的依赖;然后在配置注册中心,其中最重要的是consul服务器的ip和服务ip,主类启动时@EnableDiscoveryClient
的自动配置会根据导入的第一个依赖,完成配置,并根据conusl配置的服务器ip发现consul服务器并将服务注册到服务器,因此必须要先启动下载的consul服务器,注册的细节隐藏了。
如何从consul上获取服务列表?
基于Eureka的案例,从服务器获取服务都需要负载均衡的优先分配,同理consul作为注册中心时也需要。消费端获取服务只能从consul上,conusl是否集成了Ribbon呢?答案是肯定的毕竟咱spring 这么优秀!!!
既然集成了,那么只需要修改导入依赖和修改配置就可以使用!
导入依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
<version>3.0.3version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
配置文件:
# consul的相关配置
# consul所在的服务器的ip地址
spring.cloud.consul.host=127.0.0.1
# consul所在的服务器的端口
spring.cloud.consul.port=8500
# consul服务器实例相关配置
# 是否将自己注册
spring.cloud.consul.discovery.register=true
# 实例id
spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}
# 实例名称
spring.cloud.consul.discovery.service-name=${spring.application.name}
# 实例端口
spring.cloud.consul.discovery.port=${server.port}
# 是否指定ip注册
spring.cloud.consul.discovery.prefer-ip-address=true
# 当前服务的ip地址
spring.cloud.consul.discovery.ip-address=127.0.0.1
启动类添加注解和使用Ribbon
一样都是@EnableDiscoveryClient
和@LoadBalanced
:
@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
public class TestModuleApplication {
//java代码访问url获取返回值的对象
@LoadBalanced //spring cloud提供连接Ribbon的注解
@Bean
public RestTemplate getRestTemplate(){ return new RestTemplate(); }
public static void main(String[] args) {
SpringApplication.run(TestModuleApplication.class, args);
}
}
服务调用成功:
Consul注册中心也搭建完成了~。