Consul简介
Consul是一个分布式高可用系统,包含多个组件,但整体上提供了微服务架构中服务发现和服务配置的工具。 Spring Cloud Consul项目是Consul的服务治理实现。它是Eureka的替代品,比Consul功能更齐全:
- 服务发现
- 健康检查
- 键/值存储
- 多个数据中心
领事角色
client:客户端,无状态,将HTTP和DNS接口请求转发到局域网内的服务器集群。
server:服务器,保存配置信息,高可用集群,在局域网内与本地客户端通信,通过广域网与其他数据中心通信。
1. Producer启动时,会向Consul发送post请求,并告诉Consul自己的IP和Port。
2、Consul收到Producer的注册后,会每隔10秒(默认)向Producer发送一次健康检查请求,检查Producer是否健康。
3、当Consumer向Producer发送GET请求/api/address时,会先从Consul获取一张存储服务IP和Port的临时表,从表中获取Producer的IP和Port,然后发送GET请求/ API /地址
4.临时表每10秒更新一次,仅包含通过健康检查的Producer。
Spring Cloud Consul项目是Consul的服务治理实现。 Consul是一个分布式高可用系统,包含多个组件,但作为一个整体,为我们微服务架构中的基础设施提供服务发现和服务配置工具。
Consul和Eureka的区别
Spring Cloud支持很多服务发现软件,Eureka只是其中之一。下面是Spring Cloud支持的服务发现软件及其特点对比:
Consul下载与安装
下载完成后解压到对应目录,目录下只有一个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上注册服务?
- 导入相关依赖
<!--spring cloud 提供对于consul服务发现的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<!--actuator健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.6.6</version>
</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
- 启动Consul服务器
- 启动服务
启动服务注意别忘了在启动类上加@EnableDiscoveryClient
注解。启动时还遇到了一个小错误无法自省类 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获得服务。 Consul是否集成了Ribbon?答案是肯定的,毕竟我们的春天真好! ! !
现在已经集成了,只需要修改导入依赖,修改配置就可以使用了!
导入依赖项:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<!--<version>2.6.6</version>-->
</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注册中心也搭建完成了~。