1、背景node
SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡。其主要拓扑结构以下:git
2、Consul集群环境搭建github
本次搭建采用了三台虚拟机,Linux系统,从Consul官网下载安装包,解压便可使用。在每台机器下建一个目录/data/consul/data,这个目录主要存放器群启动后生成的一些数据。须要开启的端口,8300, 8301, 8500, 8600。spring
分别在如下三个机器上执行一下启动命令。bootstrap
机器1:10.0.0.45浏览器
./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-1 -bind=10.0.0.45 -client=0.0.0.0 &架构
机器2:10.0.0.100app
./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-2 -bind=10.0.0.100 -client=0.0.0.0 &负载均衡
机器3:10.0.0.191框架
./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-3 -bind=10.0.0.191 -client=0.0.0.0 -ui &
参数说明:
三台机器上的服务启动完成后,将两台机器添加到其中一台机器上,组建成集群。
分别在机器2和机器3上执行:./consul join 10.0.0.45,构成集群,一样也能够再增长别的节点。
启动成功后访问任意一台机器 http://10.0.0.45:8500,会看到以下界面,有3个健康的节点:
3、SpringCloud服务注册
注册中心已经搭建完毕,接下来就是准备两个服务,一个是生产者consul-producer,一个是消费者consul-consumer。
3.1 生产者代码,代码很简单,就是RestAPI请求并返回一个字符串
@RestController public class ProducerController { @GetMapping("/producer") public String producer(){ System.out.println("I'm producer"); return "Hello, I'm producer"; } }
如下是生产者consul-producer的启动配置文件application.yml:
spring: application: name: consul-producer #程序名称 cloud: consul: host: 10.0.0.100 #consul节点IP port: 8500 #consul节点端口 discovery: instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} #实例ID health-check-path: /actuator/health #健康检查 health-check-interval: 10s server: port: 9091 #消费者服务端口
3.2 消费者代码,代码也很简单,使用你们熟悉分Feign,Controller接受请求,用过service调用消费者提供的服务
/** * 消费者 */ @RestController public class ConsumerController { @Autowired private ConsumerService consumerService; @GetMapping("/consumer") public String getProducer(){ return consumerService.consumer(); } }
如下是feign调用的接口声明:
/** * 调用生产者服务 */ @FeignClient("consul-producer") public interface ProducerRemote { @GetMapping("/producer") String producer(); }
如下是生产者consul-consumer的启动配置文件application.yml:
spring: application: name: consul-consumer #消费者名称 cloud: consul: host: 10.0.0.45 #consul注册节点IP port: 8500 #consul注册节点端口 discovery: instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} #实例ID health-check-path: /actuator/health #健康检查 health-check-interval: 10s server: port: 9092 #消费者服务端口
两部分的源码可在Github上查看https://github.com/liuzwei/consul-demo.git
生产者和消费者存在了,就启动能够了,接下来是启动两个生产者,一个消费者,为了直观的区分两个生产者,在调用生产者返回的string稍微作了区分,一个是返回“Hello, I'm producer”,而另外一个则返回“Hello, I'm producer2”,为了实现负载均衡便于测试。
其中在本机上10.0.0.93分别启动了程序consul-consumer和consul-producer,在另外一台机器10.0.0.191上启动另外一个生产者实例consul-producer
启动以后在consul的界面上看到以下样子:
4、测试负载功能
经过浏览器,Get请求消费者的controller,会看到“Hello, I'm producer”和“Hello, I'm producer2”在交替显示,这也是fegin调用的特性,轮询机制实现负载均衡。
5、总结
目前微服务框架比较流行,最近项目也是上线了一些Spring Cloud微服务架构的产品,同时也在探索其余可替代组件,所以对consul进行了相关学习,便整理成该文章,在consul的使用过程当中也是存在一些不明白的地方,其中Eureka的注册时能够配置多地址的,没有发现consul怎么向多个节点进行注册,但愿有用过的大佬给指点一二,还在学习中,共勉。