SpringCloud與Consul集成實現(xiàn)負載均衡功能
負載均衡(Load Balance,簡稱LB)是一種服務器或網絡設備的集群技術。負載均衡將特定的業(yè)務(網絡服務、網絡流量等)分擔給多個服務器或網絡設備,從而提高了業(yè)務處理能力,保證了業(yè)務的高可用性。負載均衡基本概念有:實服務、實服務組、虛服務、調度算法、持續(xù)性等,其常用應用場景主要是服務器負載均衡,鏈路負載均衡。
一、背景
SpringCloud微服務目前比較流行,其中大都在使用的服務注冊與發(fā)現(xiàn)是Eureka,最近研究了Consul的集群搭建,現(xiàn)使用Consul實現(xiàn)服務的負載均衡。其主要拓撲結構如下:
二、Consul集群環(huán)境搭建
本次搭建采用了三臺虛擬機,Linux系統(tǒng),從Consul官網下載安裝包,解壓即可使用。在每臺機器下建一個目錄/data/consul/data,這個目錄主要存放器群啟動后生成的一些數據。需要開啟的端口,8300, 8301, 8500, 8600。
分別在以下三個機器上執(zhí)行一下啟動命令。
機器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.100
./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 &
參數說明:
• server: 以server身份啟動。默認是client
• bootstrap-expect:集群要求的最少server數量,當低于這個數量,集群即失效。
• data-dir:data存放的目錄,更多信息請參閱consul數據同步機制
• node:節(jié)點id,在同一集群不能重復。
• bind:監(jiān)聽的ip地址。默認綁定0.0.0.0,可以不指定
• client: 客戶端的ip地址,0.0.0.0是指誰都可以訪問
• ui: 可以訪問UI界面
三臺機器上的服務啟動完成后,將兩臺機器添加到其中一臺機器上,組建成集群。
分別在機器2和機器3上執(zhí)行:./consul join 10.0.0.45,構成集群,同樣也可以再增加別的節(jié)點。
啟動成功后訪問任意一臺機器 http://10.0.0.45:8500,會看到如下界面,有3個健康的節(jié)點:
三、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節(jié)點IP port: 8500 #consul節(jié)點端口 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注冊節(jié)點IP port: 8500 #consul注冊節(jié)點端口 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
生產者和消費者存在了,就啟動可以了,接下來是啟動兩個生產者,一個消費者,為了直觀的區(qū)分兩個生產者,在調用生產者返回的string稍微做了區(qū)分,一個是返回“Hello, I'm producer”,而另一個則返回“Hello, I'm producer2”,為了實現(xiàn)負載均衡便于測試。
其中在本機上10.0.0.93分別啟動了程序consul-consumer和consul-producer,在另一臺機器10.0.0.191上啟動另一個生產者實例consul-producer
啟動之后在consul的界面上看到如下樣子:
四、測試負載功能
通過瀏覽器,Get請求消費者的controller,會看到“Hello, I'm producer”和“Hello, I'm producer2”在交替顯示,這也是fegin調用的特性,輪詢機制實現(xiàn)負載均衡。
五、總結
目前微服務框架比較流行,最近項目也是上線了一些Spring Cloud微服務架構的產品,同時也在探索其他可替代組件,因此對consul進行了相關學習,便整理成該文章,在consul的使用過程中也是存在一些不明白的地方,其中Eureka的注冊時可以配置多地址的,沒有發(fā)現(xiàn)consul怎么向多個節(jié)點進行注冊,希望有用過的大佬給指點一二,還在學習中,共勉。
以上所述是小編給大家介紹的SpringCloud與Consul集成實現(xiàn)負載均衡功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
淺談關于Mybatis的mapper-locations配置問題
MyBatis 是一款優(yōu)秀的半自動的ORM持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作,需要的朋友可以參考下2023-05-05java中javamail收發(fā)郵件實現(xiàn)方法
這篇文章主要為大家詳細介紹了java中javamail收發(fā)郵件實現(xiàn)方法,實例分析了javamail的使用方法與相關注意事項,非常具有實用價值,感興趣的小伙伴們可以參考一下2016-02-02springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權限認證
這篇文章主要介紹了springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權限認證的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06spring boot整合RabbitMQ(Direct模式)
springboot集成RabbitMQ非常簡單,如果只是簡單的使用配置非常少,springboot提供了spring-boot-starter-amqp項目對消息各種支持。下面通過本文給大家介紹下spring boot整合RabbitMQ(Direct模式),需要的朋友可以參考下2017-04-04