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怎麼向多個節點進行註冊,但願有用過的大佬給指點一二,還在學習中,共勉。