Springcloud ribbon負載均衡演算法實現
一 前言
經過幾篇的cloud系列文章,我想大家都有一個堅實的基礎,後續的學習就會輕鬆很多,如果是剛剛來看的讀者需要有eureka基礎知識,或者查閱知識追尋者的cloud系列專欄;這篇文章主要講解如何使用ribbon實現web service客戶端呼叫,ribbon預設演算法實現負載均衡等!
二 ribbon簡介
ribbon是一個客戶端負載均衡器,其能夠整合不同的協議工具進行web service API 呼叫;
主要特色如下:
提供可插拔式的負載均衡整合服務發現故障彈性恢復cloud支援客戶端整合載入負載均衡
核心工程如下:
ribbon-core:整合其他模組實現負載均衡
ribbon-eureka: 基於 eureka client 實現 負載均衡
ribbon-httpclient: 包括JSR-311 實現REST 載入負載均衡
三 eureka-client
在之前的 eureka-client工程中建立controller包,並提供表現層介面,程式碼如下,然後啟動eureka-client例項2個,分別為8090埠,8091埠;
/** * @Author lsc * <p> 知識追尋者,ribbon provider the restful api</p> */ @RestController public class RibbonProvidderController { @GetMapping("zszxz/ribbon") public String testRibbon(){ return "hell i am zszxz"; } }
四 ribbon-client
4.1 pom.xml
在父工程低下新增新模組 ribbon-client;原來的start-web依賴在父工程中已經引入,故ribbon模組中不會再次引入該依賴;
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> </dependencies>
4.2 config
使用restTemplate進行客戶端呼叫,故需要進行配置,並且在方法上加 @LoadBalanced 註解表示開啟ribbon負載均衡;
/** * @Author lsc * <p> ribbon-restTemplate配置 </p> */ @Configuration public class RibbonConfig { @Bean @LoadBalanced//表示用於負載均衡 RestTemplate restTemplate(){ return new RestTemplate(); } }
4.3 service
建立service類,並且使用restTemplate進行HTTP API 呼叫;注意點是這邊不使用ip埠,而是直接使用服務的應用名稱 eureka-client ;
/** * @Author lsc * <p> </p> */ @Service public class RibbonService { @Autowired RestTemplate restTemplate; public String testRibbon(){ return restTemplate.getForObject("http://eureka-client/zszxz/ribbon",String.class); } }
4.4 controller
建立表現層類,用於瀏覽器訪問;
/** * @Author lsc * <p> </p> */ @RestController public class RibbonController { @Autowired RibbonService ribbonService; @GetMapping("ribbon/test") public String testRibbon(){ return ribbonService.testRibbon(); } }
4.5 ribbon啟動類
ribbon的啟動類也是作為 eureka 的客戶端故需要加上@EnableEurekaClient註解;
/** * @Author lsc * <p>知識追尋者 ribbon啟動類 </p> */ @SpringBootApplication @EnableEurekaClient public class RibbonApp { public static void main(String[] args) { SpringApplication.run(RibbonApp.class,args); } }
4.6 application.yml
application.yml 配置中使用埠8092,服務註冊地址分別是peer1,peer2,peer3;
server: port: 8092 spring: application: name: eureka-ribbon # 應用名稱 eureka: client: service-url: # 服務註冊地址 defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
4.7 啟動工程
分別啟動 client,server ; 如下圖
4.8 瀏覽器訪問結果
瀏覽器結果如下,說明我們在 eureka-ribbon 中使用 restTemplate 結合 ribbon 實現了HTTP 方式從 eureka-clinet 模組中呼叫API;
五 ribbon預設負載均衡
LoadBalancerClient 是 ribbon 的一個核心類,其能夠獲得 ribbon提供負載均衡的例項資訊;在 ribbon-client模組中的controller層新增 方法 ,方法主體是獲得例項的埠和主機;以便於於我們分析ribbon負載均衡演算法;
@Autowired LoadBalancerClient loadBalanced; @GetMapping("ribbon") public String ribbon(){ ServiceInstance choose = loadBalanced.choose("eureka-client"); String s = "host is :" + choose.getHost() + " port is :" + choose.getPort(); System.out.println(s); return s; }
重啟ribbon-client 工程,使用瀏覽器訪問,控制檯輸出如下,分別呼叫了8090,8091兩個 eureka-client例項API,說明ribbon預設的負載均衡機制是輪詢演算法;
host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090 host is :peer1 port is :8091 host is :peer1 port is :8090
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。