這篇文章主要介紹了Spring Cloud如何使用Ribbon,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
安福ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
為了本小節(jié)的測試做準備,按順序進行以下工作:
? 新建Eureka服務器端項目,命名為“cloud-server”,端口8761,
代碼目錄codes\04\4.4\cloud-server。
? 新建Eureka服務提供者項目,命名為“cloud-provider”,
代碼目錄codes\04\4.4\cloud-provider,該項目主要進行以下工作:
1. 在控制器里面,發(fā)布一個REST服務,地址為“/person/{personId}”,
請求后返回Person實例,其中Person的message為HTTP請求的URL。
2. 服務提供者需要啟動兩次,因此在控制臺中需要輸入啟動端口。
? 新建Eureka服務調用者項目,命名為“cloud-invoker”,對外端口為9000,
代碼目錄codes\04\4.4\cloud-invoker。本例的負載均衡配置主要針對服務調用者。
以上項目準備完成并啟動后,結構如圖4-2所示。
圖4-2 準備的項目結構圖
注意:Eureka相關項目的建立,可參見前面章節(jié)。
在前面章節(jié)講述了負載規(guī)則以及Ping,在Spring Cloud中,可將自定義的負載規(guī)則以及Ping類,放到服務調用者中,查看效果。新建自定義的IRule與IPing,兩個實現(xiàn)類請見代碼清單4-11。
代碼清單4-11:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\MyRule.java
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\MyPing.java
package org.crazyit.cloud; import java.util.List; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; public class MyRule implements IRule { private ILoadBalancer lb; public Server choose(Object key) { List<Server> servers = lb.getAllServers(); System.out.println("這是自定義服務器定規(guī)則類,輸出服務器信息:"); for(Server s : servers) { System.out.println(" " + s.getHostPort()); } return servers.get(0); } public void setLoadBalancer(ILoadBalancer lb) { this.lb = lb; } public ILoadBalancer getLoadBalancer() { return this.lb; } }
package org.crazyit.cloud; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.Server; public class MyPing implements IPing { public boolean isAlive(Server server) { System.out.println("自定義Ping類,服務器信息:" + server.getHostPort()); return true; } }
根據(jù)兩個自定義的IRule和IPing類可知,實際上跟4.3章節(jié)中的自定義實現(xiàn)類似,服務器選擇規(guī)則中只返回集合中的第一個實例,IPing實現(xiàn)僅僅是控制輸入服務器信息。接下來,新建配置類,返回規(guī)則與Ping的Bean,請見代碼清單4-12。
代碼清單4-12:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\config\MyConfig.java
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\config\CloudProviderConfig.java
package org.crazyit.cloud.config; import org.crazyit.cloud.MyPing; import org.crazyit.cloud.MyRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; public class MyConfig { @Bean public IRule getRule() { return new MyRule(); } @Bean public IPing getPing() { return new MyPing(); } }
package org.crazyit.cloud.config; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Configuration; @RibbonClient(name="cloud-provider", configuration=MyConfig.class) public class CloudProviderConfig { }
代碼清單4-12中,CloudProviderConfig配置類,使用了@RibbonClient注解,配置了RibbonClient的名稱為“cloud-provider”,對應的配置類為“MyConfig”,也就是名稱為“cloud-provider”的客戶端,將使用MyRule與MyPing兩個類。在服務調用者的控制器中,加入對外服務,服務中調用RestTemplate,如代碼清單4-13。
代碼清單4-13:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@RestController @Configuration public class InvokerController { @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } @RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String router() { RestTemplate restTpl = getRestTemplate(); // 根據(jù)名稱調用服務 String json = restTpl.getForObject("http://cloud-provider/person/1", String.class); return json; } }
以上的控制器中,為RestTemplate加入了@LoadBalanced修飾,與前面章節(jié)類似,在此不再贅述,關于RestTemplate的原理,將在本章后面章節(jié)講述。進行以下操作,查看本例效果:
? 啟動一個Eureka服務器(cloud-server)。
? 啟動兩次Eureka服務提供者(cloud-provider),分別輸入8080與8081端口。
? 啟動一個Eureka服務調用者(cloud-invoker)。
? 打開瀏覽器訪問http://localhost:9000/router,可以看到調用服務后返回的JSON字符串,不管刷新多少次,最終都只會訪問其中一個端口。
在前面使用Ribbon時,可以通過配置來定義各個屬性,在使用Spring Cloud時,這些屬性同樣可以配置到application.yml中,以下的配置同樣生效:
cloud-provider: ribbon: NFLoadBalancerRuleClassName: org.crazyit.cloud.MyRule NFLoadBalancerPingClassName: org.crazyit.cloud.MyPing listOfServers: http://localhost:8080/,http://localhost:8081/
為cloud-provider這個客戶端,配置了規(guī)則處理類、Ping類以及服務器列表,以同樣的方式運行本小節(jié)例子,可看到同樣的效果,在此不再贅述。
代碼與配置文件的方式進行配置,兩種方式的效果一致,但對比起來,明顯是配置文件的方式更加簡便。
注意:本案例的cloud-invoker模塊中,默認使用了代碼的方式來配置Ribbon,配置文件中的配置已被注釋。
Spring Cloud對Ribbon進行封裝,例如像負載客戶端、負載均衡器等,我們可以直接使用Spring的LoadBalancerClient來處理請求以及服務選擇。代碼清單4-14,在服務器調用者的控制器中使用LoadBalancerClient。
代碼清單4-14:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@Autowired private LoadBalancerClient loadBalancer; @RequestMapping(value = "/uselb", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceInstance uselb() { // 查找服務器實例 ServiceInstance si = loadBalancer.choose("cloud-provider"); return si; }
除了使用Spring封裝的負載客戶端外,還可以直接使用Ribbon的API,代碼4-15,直接獲取Spring Cloud默認環(huán)境中,各個Ribbon的實現(xiàn)類。
代碼清單4-15:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@Autowired private SpringClientFactory factory; @RequestMapping(value = "/defaultValue", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String defaultValue() { System.out.println("==== 輸出默認配置:"); // 獲取默認的配置 ZoneAwareLoadBalancer alb = (ZoneAwareLoadBalancer) factory .getLoadBalancer("default"); System.out.println(" IClientConfig: " + factory.getLoadBalancer("default").getClass().getName()); System.out.println(" IRule: " + alb.getRule().getClass().getName()); System.out.println(" IPing: " + alb.getPing().getClass().getName()); System.out.println(" ServerList: " + alb.getServerListImpl().getClass().getName()); System.out.println(" ServerListFilter: " + alb.getFilter().getClass().getName()); System.out.println(" ILoadBalancer: " + alb.getClass().getName()); System.out.println(" PingInterval: " + alb.getPingInterval()); System.out.println("==== 輸出 cloud-provider 配置:"); // 獲取 cloud-provider 的配置 ZoneAwareLoadBalancer alb2 = (ZoneAwareLoadBalancer) factory .getLoadBalancer("cloud-provider"); System.out.println(" IClientConfig: " + factory.getLoadBalancer("cloud-provider").getClass() .getName()); System.out.println(" IRule: " + alb2.getRule().getClass().getName()); System.out.println(" IPing: " + alb2.getPing().getClass().getName()); System.out.println(" ServerList: " + alb2.getServerListImpl().getClass().getName()); System.out.println(" ServerListFilter: " + alb2.getFilter().getClass().getName()); System.out.println(" ILoadBalancer: " + alb2.getClass().getName()); System.out.println(" PingInterval: " + alb2.getPingInterval()); return ""; }
代碼中使用了SpringClientFactory,通過該實例,可獲取各個默認的實現(xiàn)類以及配置,分別輸出了默認配置以及“cloud-provider”配置。運行代碼清單4-15,瀏覽器中訪問地址http://localhost:8080/defaultValue,可看到控制臺輸出如下:
==== 輸出默認配置: IClientConfig: com.netflix.loadbalancer.ZoneAwareLoadBalancer IRule: com.netflix.loadbalancer.ZoneAvoidanceRule IPing: com.netflix.niws.loadbalancer.NIWSDiscoveryPing ServerList: org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList ServerListFilter: org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter ILoadBalancer: com.netflix.loadbalancer.ZoneAwareLoadBalancer PingInterval: 30 ==== 輸出 cloud-provider 配置: IClientConfig: com.netflix.loadbalancer.ZoneAwareLoadBalancer IRule: org.crazyit.cloud.MyRule IPing: org.crazyit.cloud.MyPing ServerList: org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList ServerListFilter: org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter ILoadBalancer: com.netflix.loadbalancer.ZoneAwareLoadBalancer PingInterval: 30
根據(jù)輸出可知,cloud-provider客戶端使用的負載規(guī)則類以及Ping類,是我們自定義的實現(xiàn)類。
一般情況下,Spring已經(jīng)幫我們封裝好了Ribbon,我們只需要直接調用RestTemplate等API來訪問服務即可。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring Cloud如何使用Ribbon”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!
文章標題:SpringCloud如何使用Ribbon
標題網(wǎng)址:http://muchs.cn/article18/igeogp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站內鏈、搜索引擎優(yōu)化、用戶體驗、Google、電子商務
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)