一、简述Consul 实现服务注册发现,配置中心,负载均衡
环境搭建
consul 版本:1.4.0
Spring Boot: 2.0.5.RELEASE
Spring Cloud: Finchley.SR2
数据库:H2
虚拟机搭建(这里我使用了三个虚拟机来模拟):centos 2 * X + 1 台
搭建步骤省略,在这里只专注于代码层面描述,大家参考网络上的文档
构建两个Spring Boot应用:
部署在三台consul虚拟机(服务器)上,应用启动时,注册到consul中
通过ConsulConfig统一管理应用配置
服务提供者:cloud-consul-producer
服务消费者:cloud-consul-consumer *在本机启动,用于测试服务发现和负载均衡
Spring官方文档介绍:
Service Discovery: instances can be registered with the Consul agent and clients can discover the instances using Spring-managed beans
Supports Ribbon, the client side load-balancer via Spring Cloud Netflix
Supports Zuul, a dynamic router and filter via Spring Cloud Netflix
Distributed Configuration: using the Consul Key/Value store
Control Bus: Distributed control events using Consul Events
URL:https://spring.io/projects/spring-cloud-consul
Spring Cloud Consul features:
二、服务提供者 cloud-consul-producer
依赖:
多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对它们的客户端是透明的,这样提供了更好的可扩展性。
开启服务发现客户端
@EnableDiscoveryClient基于spring-cloud-commons 实现的服务发现客户端
在Consul中注册了我们的应用,我们需要找到服务端,因此通过该注解来发现客户端服务来从Consul中获取可用的服务。
然后,我们可以将DiscoveryClient bean注入我们的控制器并访问实例:
相关配置(此处仅用于介绍,后面我们通过ConsulConfig配置中心来统一管理配置)
H2数据库配置文件(此处仅用于介绍,后面我们通过ConsulConfig配置中心来统一管理配置)
用于测试的Bean
上述完成了我们的服务提供者应用构建,在应用启动时会通过配置文件中的:
来找到cousul所在的位置,并将自己注册到consul服务中,下面来介绍ConsulConfig应用配置中心,目前我只使用到了KEY/VALUE方式,git2以后有需要再去研究
ConsulConfig 应用配置中心
依赖
此功能允许在所有服务之间同步配置。Consul将监视任何配置更改,然后触发所有服务的更新。
我们还需要将Consul和Spring应用程序名称的设置从application.yml文件移动到Spring首先加载的bootstrap.yml文件中。
然后,我们需要启用Spring Cloud Consul Config:
接下来需要在consul服务端配置KEY/VALUE
Spring Cloud Consul Config将默认在“/config/dobdop-dev”中查找data中的属性
这是因为上面的配置文件中配置的prefix、default-context、profile-separator等相关配置决定,详见上面的配置备注
如果没有*-dev则默认会查找/config/dobdop,不存在就会抛出异常,应用无法启动
配置文件中的路径是'/config/dobdop-dev',KEY是‘data'。VALUE则是我们application.yml中的配置
小坑:如果是手动配置Condul中的KEY/VALUE,请不要使用“TAB”键,必须使用空格来格式化配置
建议先在本地配置好yml直接复制到consul中
如果没有配置profile-separator则默认路径名称应该创建为:'config/dobdop,dev',默认以逗号来区分环境
配置好bootstrap.yml后我们就可以通过注解的形式来加载配置中心的值
更新配置
使用@RefreshScope注解注释的所有bean 将在配置更改后刷新,字段属性是MyProperties类具有@RefreshScope注解
三、服务消费者&负载均衡的初步实现:cloud-consul-consumer
依赖
服务发现不需要注册到consul中,因此我们不需要在启动类上添加注解:@EnableDiscoveryClient
同时配置文件也不需要开启服务发现:
定义配置类
consul中添加了Netflix 的 Ribbon等相关模块依赖,因此添加了consul的spring-cloud-starter-consul-discovery依赖后相关模块都会加载到应用中
RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应的类(来源于网络)
想要通过客户端RestTemplate去访问我们的微服务时候自带负载均衡,我们需要通过注解@LoadBalanced开启负载均衡
创建RestTemplate Bean时我们添加了注解@LoadBalanced只会,可以通过微服务名字从Consul上找到并访问相关服务,默认使用轮询算法
自定义负载均衡算法需要我们添加IRule Bean,这里我目前只测试了随机算法,见上面的代码
RestTemplate使用示例:
通过上面的代码,我们可以看到在调用服务提供者时,只需要定义URL:http://dobqop-consul-service-yml,RestTemplate组合注解@LoadBalanced实现了负载均衡
以下为本次应用截图:
领取专属 10元无门槛券
私享最新 技术干货