溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud如何使用Ribbon

發(fā)布時間:2021-12-24 10:21:44 來源:億速云 閱讀:147 作者:小新 欄目:云計算

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

8 Spring Cloud與RibbonRibbon

8.1 準備工作

        為了本小節(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所示。

Spring Cloud如何使用Ribbon

圖4-2 準備的項目結構圖

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

8.2 使用代碼配置Ribbon

        在前面章節(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字符串,不管刷新多少次,最終都只會訪問其中一個端口。

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

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

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

8.4 Spring使用Ribbon的API

        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”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI