Spring Cloud-Ribbon 負載均衡

對此官網也有解釋說如果該配置放在主程序同包目錄下會發生未知異常,這是由於Spring boot的主程序會去掃描同一個層級目錄下的文件,這裡有兩種辦法可以解決

第一種:不將自定義配置類放在主程序同包或者其子包中

Spring Cloud-Ribbon 負載均衡

第二種可以添加一些註解避免主程序掃描到自定義配置類,各位可以搜下相關資料

3.多個服務自定義算法(自定義算法類實現)

首先做個簡單的測試啟動四個服務提供者,每兩個提供者掛載同一個服務名下面

第一個服務提供者

application.yml

server: port: 7900 #程序啟動後的端口,也就是tomcat的端口,可自定義spring: application: name: provider-usereureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/

UserController.java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import com.netflix.discovery.EurekaClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;/** * @author hzk * @date 2018/5/13 */@RestController("/")public class UserController { @Autowired private EurekaClient eurekaClient; @Value("${server.port}") private String port; @GetMapping("/user/{id}") public User getUser(@PathVariable Integer id){ return new User(id,"zs",20); } @GetMapping("/eureka/info") public String info(){ //InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false); //return instanceInfo.getHomePageUrl()+ ":" +instanceInfo.getPort(); return port; }}

第二個服務提供者

application.yml

server: port: 7901 #程序啟動後的端口,也就是tomcat的端口,可自定義spring: application: name: provider-usereureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/ 

第三個服務提供者

application.yml

server: port: 7902 #程序啟動後的端口,也就是tomcat的端口,可自定義spring: application: name: provider-user1eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/

第四個服務提供者

application.yml

server: port: 7903 #程序啟動後的端口,也就是tomcat的端口,可自定義spring: application: name: provider-user1eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/啟動這四個服務,消費服務和之前一樣,只修改接口獲取數據區分兩個服務名稱負載均衡算法

OrderController .java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import com.netflix.appinfo.InstanceInfo;import com.netflix.discovery.EurekaClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/** * @author hzk * @date 2018/5/13 */@RestControllerpublic class OrderController { //spring 提供用於訪問rest接口的模板對象 @Autowired private RestTemplate restTemplate; @Autowired private EurekaClient eurekaClient; @Value("${user.url}") private String url; @GetMapping("/order/{id}") public User getOrder(@PathVariable Integer id){ //訪問提供者 獲取數據 通過rest訪問獲取的json數據轉換為的User對象 //PROVIDER-USER 為eureka中提供者註冊服務名稱 InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false); //獲取接口項目地址 String homePageUrl = instanceInfo.getHomePageUrl(); User user = restTemplate.getForObject(homePageUrl+"/user/" +id, User.class); return user; } @GetMapping("/eureka/info") public String getInfo(){ String portInfo = restTemplate.getForObject("http://PROVIDER-USER/eureka/info", String.class); String portInfo1 = restTemplate.getForObject("http://PROVIDER-USER1/eureka/info", String.class); System.out.println("PROVIDER-USER:"+portInfo+"==================>PROVIDER-USER1:"+portInfo1); return portInfo; }}同樣多次請求消費服務,結果如下:
Spring Cloud-Ribbon 負載均衡

可以看出配置了自定義負載均衡算法的PROVIDER-USER仍然是隨機訪問,而未配置自定義算法的PROVIDER-USER1默認輪詢

4.多個服務自定義算法(配置文件實現)

上面講到我們可以通過自定義一個配置類去實現負載均衡算法的自定義設置,也可以通過配置文件實現這裡我們將上面的PROVIDER-USER1也變為隨機訪問

application.yml

server: port: 8900spring: application: name: consumer-order-ribbonuser: url: http://localhost:7900/user/eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/ instance: prefer-ip-address: true # 在Eureka中顯示IPPROVIDER-USER1: ribbon: NFLoadBalacerRuleClassName: com.netflix.loadbalancer.RandomRule #給指定服務配置負載均衡算法
Spring Cloud-Ribbon 負載均衡

這樣就實現了負載均衡算法的配置,相對還是很簡單的ps: 配置文件中還有一個配置可以禁用ribbonribbon: eureka: enabled: false #在Eureka中禁用riibon,禁用後需要自己負責負載均衡


分享到:


相關文章: