SpringCloud如何使用Ribbon

這篇文章主要介紹了Spring Cloud如何使用Ribbon,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

安福ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

8 Spring Cloud與RibbonRibbon

8.1 準(zhǔn)備工作

        為了本小節(jié)的測試做準(zhǔn)備,按順序進(jìn)行以下工作:

        ? 新建Eureka服務(wù)器端項目,命名為“cloud-server”,端口8761,

            代碼目錄codes\04\4.4\cloud-server。

        ? 新建Eureka服務(wù)提供者項目,命名為“cloud-provider”,

            代碼目錄codes\04\4.4\cloud-provider,該項目主要進(jìn)行以下工作:

            1. 在控制器里面,發(fā)布一個REST服務(wù),地址為“/person/{personId}”,

                請求后返回Person實例,其中Person的message為HTTP請求的URL。

            2. 服務(wù)提供者需要啟動兩次,因此在控制臺中需要輸入啟動端口。

        ? 新建Eureka服務(wù)調(diào)用者項目,命名為“cloud-invoker”,對外端口為9000,

            代碼目錄codes\04\4.4\cloud-invoker。本例的負(fù)載均衡配置主要針對服務(wù)調(diào)用者。

        以上項目準(zhǔn)備完成并啟動后,結(jié)構(gòu)如圖4-2所示。

Spring Cloud如何使用Ribbon

圖4-2 準(zhǔn)備的項目結(jié)構(gòu)圖

        注意:Eureka相關(guān)項目的建立,可參見前面章節(jié)。

8.2 使用代碼配置Ribbon

        在前面章節(jié)講述了負(fù)載規(guī)則以及Ping,在Spring Cloud中,可將自定義的負(fù)載規(guī)則以及Ping類,放到服務(wù)調(diào)用者中,查看效果。新建自定義的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("這是自定義服務(wù)器定規(guī)則類,輸出服務(wù)器信息:");
		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類,服務(wù)器信息:" + server.getHostPort());
		return true;
	}
}

        根據(jù)兩個自定義的IRule和IPing類可知,實際上跟4.3章節(jié)中的自定義實現(xiàn)類似,服務(wù)器選擇規(guī)則中只返回集合中的第一個實例,IPing實現(xiàn)僅僅是控制輸入服務(wù)器信息。接下來,新建配置類,返回規(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”,對應(yīng)的配置類為“MyConfig”,也就是名稱為“cloud-provider”的客戶端,將使用MyRule與MyPing兩個類。在服務(wù)調(diào)用者的控制器中,加入對外服務(wù),服務(wù)中調(diào)用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ù)名稱調(diào)用服務(wù)
		String json = restTpl.getForObject("http://cloud-provider/person/1",
				String.class);
		return json;
	}
}

        以上的控制器中,為RestTemplate加入了@LoadBalanced修飾,與前面章節(jié)類似,在此不再贅述,關(guān)于RestTemplate的原理,將在本章后面章節(jié)講述。進(jìn)行以下操作,查看本例效果:

        ?     啟動一個Eureka服務(wù)器(cloud-server)。

        ?     啟動兩次Eureka服務(wù)提供者(cloud-provider),分別輸入8080與8081端口。

        ?     啟動一個Eureka服務(wù)調(diào)用者(cloud-invoker)。

        ?     打開瀏覽器訪問http://localhost:9000/router,可以看到調(diào)用服務(wù)后返回的JSON字符串,不管刷新多少次,最終都只會訪問其中一個端口。

8.3 使用配置文件設(shè)置Ribbon

        在前面使用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類以及服務(wù)器列表,以同樣的方式運行本小節(jié)例子,可看到同樣的效果,在此不再贅述。

        代碼與配置文件的方式進(jìn)行配置,兩種方式的效果一致,但對比起來,明顯是配置文件的方式更加簡便。

        注意:本案例的cloud-invoker模塊中,默認(rèn)使用了代碼的方式來配置Ribbon,配置文件中的配置已被注釋。

8.4 Spring使用Ribbon的API

        Spring Cloud對Ribbon進(jìn)行封裝,例如像負(fù)載客戶端、負(fù)載均衡器等,我們可以直接使用Spring的LoadBalancerClient來處理請求以及服務(wù)選擇。代碼清單4-14,在服務(wù)器調(diào)用者的控制器中使用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() {
		// 查找服務(wù)器實例
		ServiceInstance si = loadBalancer.choose("cloud-provider");
		return si;
	}

        除了使用Spring封裝的負(fù)載客戶端外,還可以直接使用Ribbon的API,代碼4-15,直接獲取Spring Cloud默認(rèn)環(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("==== 輸出默認(rèn)配置:");
		// 獲取默認(rèn)的配置
		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,通過該實例,可獲取各個默認(rèn)的實現(xiàn)類以及配置,分別輸出了默認(rèn)配置以及“cloud-provider”配置。運行代碼清單4-15,瀏覽器中訪問地址http://localhost:8080/defaultValue,可看到控制臺輸出如下:

==== 輸出默認(rèn)配置:
    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客戶端使用的負(fù)載規(guī)則類以及Ping類,是我們自定義的實現(xiàn)類。

        一般情況下,Spring已經(jīng)幫我們封裝好了Ribbon,我們只需要直接調(diào)用RestTemplate等API來訪問服務(wù)即可。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Cloud如何使用Ribbon”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

文章標(biāo)題:SpringCloud如何使用Ribbon
標(biāo)題網(wǎng)址:http://bm7419.com/article18/igeogp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站內(nèi)鏈搜索引擎優(yōu)化、用戶體驗Google、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化