SpringCloud--Ribbon 負(fù)載均衡(三)

一、Ribbon簡介

??Spring Cloud Ribbon是一個(gè)基于HTTP和TCP的客戶端負(fù)載均衡工具念颈,它基于Netflix Ribbon實(shí)現(xiàn)单默。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用熙侍。Spring Cloud Ribbon雖然只是一個(gè)工具類框架吁朦,它不像服務(wù)注冊(cè)中心柒室、配置中心、API網(wǎng)關(guān)那樣需要獨(dú)立部署逗宜,但是它幾乎存在于每一個(gè)Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中雄右。因?yàn)槲⒎?wù)間的調(diào)用,API網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)等內(nèi)容纺讲,實(shí)際上都是通過Ribbon來實(shí)現(xiàn)的不脯,包括后續(xù)我們將要介紹的Feign,它也是基于Ribbon實(shí)現(xiàn)的工具刻诊。所以,對(duì)Spring Cloud Ribbon的理解和使用牺丙,對(duì)于我們使用Spring Cloud來構(gòu)建微服務(wù)非常重要则涯。

  1. 客戶端負(fù)載均衡
    ??負(fù)載均衡在系統(tǒng)架構(gòu)中是一個(gè)非常重要,并且是不得不去實(shí)施的內(nèi)容冲簿。因?yàn)樨?fù)載均衡是對(duì)系統(tǒng)的高可用粟判、網(wǎng)絡(luò)壓力的緩解和處理能力擴(kuò)容的重要手段之一。我們通常所說的負(fù)載均衡都指的是服務(wù)端負(fù)載均衡峦剔,其中分為硬件負(fù)載均衡和軟件負(fù)載均衡档礁。
    硬件負(fù)載均衡主要通過在服務(wù)器節(jié)點(diǎn)之間按照專門用于負(fù)載均衡的設(shè)備,比如F5等吝沫;
    而軟件負(fù)載均衡則是通過在服務(wù)器上安裝一些用于負(fù)載均衡功能或模塊等軟件來完成請(qǐng)求分發(fā)工作呻澜,比如Nginx等递礼。不論采用硬件負(fù)載均衡還是軟件負(fù)載均衡,只要是服務(wù)端都能以類似下圖的架構(gòu)方式構(gòu)建起來:
負(fù)載均衡架構(gòu)圖

?? 而客戶端負(fù)載均衡和服務(wù)端負(fù)載均衡最大的不同點(diǎn)在于上面所提到服務(wù)清單所存儲(chǔ)的位置羹幸。在客戶端負(fù)載均衡中脊髓,所有客戶端節(jié)點(diǎn)都維護(hù)著自己要訪問的服務(wù)端清單,而這些服務(wù)端端清單來自于服務(wù)注冊(cè)中心栅受,比如Eureka服務(wù)端将硝。同服務(wù)端負(fù)載均衡的架構(gòu)類似,在客戶端負(fù)載均衡中也需要心跳去維護(hù)服務(wù)端清單的健康性屏镊,默認(rèn)會(huì)創(chuàng)建針對(duì)各個(gè)服務(wù)治理框架的Ribbon自動(dòng)化整合配置依疼,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration而芥。
??在實(shí)際使用的時(shí)候律罢,我們可以通過查看這兩個(gè)類的實(shí)現(xiàn),以找到它們的配置詳情來幫助我們更好地使用它蔚出。
??通過Spring Cloud Ribbon的封裝弟翘,我們?cè)谖⒎?wù)架構(gòu)中使用客戶端負(fù)載均衡調(diào)用非常簡單,只需要如下兩步:
??服務(wù)提供者只需要啟動(dòng)多個(gè)服務(wù)實(shí)例并注冊(cè)到一個(gè)注冊(cè)中心或是多個(gè)相關(guān)聯(lián)的服務(wù)注冊(cè)中心骄酗。
??服務(wù)消費(fèi)者直接通過調(diào)用被@LoadBalanced注解修飾過的RestTemplate來實(shí)現(xiàn)面向服務(wù)的接口調(diào)用稀余。
?? 這樣,我們就可以將服務(wù)提供者的高可用以及服務(wù)消費(fèi)者的負(fù)載均衡調(diào)用一起實(shí)現(xiàn)了趋翻。

文檔地址:
https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html

二睛琳、Maven依賴

<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-netflix-ribbon</artifactId>
</dependency>

三、application.properties配置

server.port=8002
eureka.register.port=8761
#服務(wù)實(shí)例名
#eureka.instance.hostname=goods-service
#服務(wù)名踏烙,如果沒有則為 unknown
spring.application.name=goods-service
eureka.register.host=localhost
eureka.client.serviceUrl.defaultZone=http\://${eureka.register.host}\:${eureka.register.port}/eureka/
#顯示IP
eureka.instance.prefer-ip-address=true
# 注2.0 必須為ip-address
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
#Eureka客戶端向服務(wù)端發(fā)送心跳的時(shí)間間隔师骗,單位為秒(客戶端告訴服務(wù)端自己會(huì)按照該規(guī)則)
eureka.instance.lease-renewal-interval-in-seconds =3

四、服務(wù)調(diào)用

  1. Ribbon配置
@Configuration
public class RibbonConfig {
    @Bean   // 初始化 Bean
    @LoadBalanced   // 實(shí)現(xiàn)負(fù)載均衡
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  1. 創(chuàng)建控制器
@RestController
@Slf4j
public class GoodsController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/getGoods")
    public String getGoods() {
        String message = restTemplate.getForObject("http://USER-SERVICE/getUser", String.class);
        log.info(message);
        return message;
    }
}

五讨惩、負(fù)載均衡測試

  1. 啟動(dòng)多個(gè)服務(wù)實(shí)例辟癌,端口分別為8001 8005 8006
    啟動(dòng)之前先將服務(wù)提供,啟動(dòng)設(shè)置單例關(guān)掉


    去掉單實(shí)例選擇
啟動(dòng)多個(gè)服務(wù)提供者
  1. 消費(fèi)測試


    刷新訪問
刷新訪問
刷新訪問

六荐捻、負(fù)載均衡器

雖然Spring Cloud 中定義了LoadBalancerClient作為負(fù)載均衡器的通用接口黍少,并且針對(duì)Ribbon實(shí)現(xiàn)了RibbonLoadBalancerClient,但是它在具體體實(shí)現(xiàn)客戶端負(fù)載均衡時(shí)处面,是通過Ribbon的ILoadBalancer接口實(shí)現(xiàn)的厂置。

  1. AbstractLoadBalancer 抽象類
    AbstractLoadBalancer是ILoadBalancer接口的抽象實(shí)現(xiàn)。在該抽象類中定義了一個(gè)關(guān)于服務(wù)實(shí)例的分組枚舉類ServerGroup魂角,它包含三種不同類型昵济。
    ALL :所有服務(wù)實(shí)例。
    SATUS_UP:正常服務(wù)的實(shí)例。
    SATUS_NOT_UP:停止服務(wù)的實(shí)例访忿。
    另外瞧栗,還實(shí)現(xiàn)了一個(gè)chooseServer()函數(shù),該函數(shù)通過調(diào)用接口中的chooseServer(Object key)實(shí)現(xiàn)醉顽,其中參數(shù)key為null沼溜,表示在選擇具體服務(wù)實(shí)例時(shí)忽略key的條件判斷。
    最后游添,還定義了兩個(gè)抽象函數(shù)系草。
    getServerList(ServerGroup serverGroup):定義了根據(jù)分組類型來獲取不同的服務(wù)實(shí)例的列表。
    getLoadBalancerStats對(duì)象存儲(chǔ)負(fù)載均衡器中各個(gè)服務(wù)實(shí)例當(dāng)前的屬性和統(tǒng)計(jì)信息唆涝。
  2. BaseLoadBalancer 實(shí)現(xiàn)類
    BaseLoadBalancer類是Ribbon負(fù)載均衡器的基礎(chǔ)實(shí)現(xiàn)類找都,在該類中定義了很多關(guān)于負(fù)載均衡器相關(guān)的基礎(chǔ)內(nèi)容。
    定義并維護(hù)了兩個(gè)存儲(chǔ)服務(wù)實(shí)例Server對(duì)象的列表廊酣。一個(gè)用戶存儲(chǔ)所有服務(wù)實(shí)例的清單能耻,一個(gè)用戶存儲(chǔ)正常服務(wù)的實(shí)例清單。
@Monitor(name=PREFIX + "AllServerList",type=DataSourceType.INFORMATIONAL)
protected volatile List<Server> allServerList = Collections.synchronizedList(new ArrayList<Server>());
@Monitor(name=PREFIX + "UpServerList",type=DataSurceType.INFORMATIONAL)
protected volatile List<Server> upServerList = Collections.synchronizedList(new ArrayList<Server>());

定義了之前我們提到的用來存儲(chǔ)負(fù)載均衡器各服務(wù)實(shí)例屬性和統(tǒng)計(jì)信息的LoadBalancerStats對(duì)象亡驰。
定義了檢查服務(wù)實(shí)例是否正常服務(wù)的IPing對(duì)象晓猛,在BaseLoadBalancer中默認(rèn)為null,需要在構(gòu)造時(shí)注入它的具體實(shí)現(xiàn)。
定義了檢查服務(wù)實(shí)例操作的執(zhí)行策略對(duì)象IPingStrategy,在BaseLoadBalancer中默認(rèn)使用了該類中定義的靜態(tài)內(nèi)部類SerialPingStrategy實(shí)現(xiàn)凡辱。
定義了負(fù)載均衡的處理規(guī)則IRule對(duì)象戒职。從BaseLoadBalancer中chooseServer(Object key)的實(shí)現(xiàn)源碼,可以知道透乾,負(fù)載均衡實(shí)際將服務(wù)實(shí)例選擇人物委托給了IRule實(shí)例中的choose函數(shù)來實(shí)現(xiàn)洪燥。在這里,默認(rèn)初始化了RoundRobinRule為IRule的實(shí)現(xiàn)對(duì)象乳乌。RouleRobinRule實(shí)現(xiàn)了最基本且常用的線性負(fù)載均衡規(guī)則捧韵。
啟動(dòng)ping任務(wù)。
實(shí)現(xiàn)了ILoadBalancer接口定義的負(fù)載均衡器應(yīng)具備的一系列操作汉操。

  1. DynamicServerListLoadBalancer
    DynamicServerListLoadBalancer類繼承于BaseLoadBalancer類再来,它是對(duì)基礎(chǔ)負(fù)載均衡器的擴(kuò)展。在該負(fù)載均衡器中磷瘤,實(shí)現(xiàn)了服務(wù)清單在運(yùn)行期的動(dòng)態(tài)更新功能其弊;同時(shí),它還具備了對(duì)服務(wù)實(shí)例清單的過濾功能膀斋,也就是說,我們可以通過過濾器來選擇性獲取一批服務(wù)實(shí)例清單痹雅。

七仰担、負(fù)載均衡策略

Ribbon中實(shí)現(xiàn)了非常多的選擇策略(負(fù)載均衡中的服務(wù)實(shí)例選擇策略),其中包括的RoundRobinRule和ZoneAvoidanceRule。

  1. 自動(dòng)化配置:
    由于Ribbon中定義的每一個(gè)接口都有多種不同的策略實(shí)現(xiàn)摔蓝,同時(shí)這些接口之間又有一定的依賴關(guān)系赂苗,使得Ribbon開發(fā)者很難上手。Spring Cloud Ribbon中的自動(dòng)化配置能夠解決這種問題贮尉。就能自動(dòng)化構(gòu)架下面這些接口的實(shí)現(xiàn)拌滋。
    IClientConfig:Ribbon的客戶端配置,默認(rèn)采用com.netflix.client.config.DefaultClientConfigImpl實(shí)現(xiàn)猜谚。
    IRule:Ribbon的負(fù)載均衡策略败砂,默認(rèn)采用com.netflix.loadbalancer.ZoneAvoidanceRule實(shí),該策略能夠在多區(qū)域環(huán)境下選出最佳區(qū)域的實(shí)例進(jìn)行訪問魏铅。
    IPing:Ribbon的實(shí)例檢查策略昌犹,默認(rèn)采用com.netflix.loadbalancer.NoOpPing實(shí)現(xiàn),該檢查策略是一個(gè)特殊的實(shí)現(xiàn)览芳,實(shí)際上它并不會(huì)檢查實(shí)例是否可用斜姥,而是始終返回true,默認(rèn)認(rèn)為所有服務(wù)實(shí)例都是可用的沧竟。
    ServerList:服務(wù)實(shí)例清單的維護(hù)機(jī)制铸敏,默認(rèn)采用com.netflix.loadbalancer.ConfigurationBasedServerList實(shí)現(xiàn)。
    ServerListFilter:服務(wù)實(shí)例清單過濾機(jī)制悟泵,默認(rèn)采用org.springframework.cloud.netflix.ribbon.ZonePrefenceServerListFilter實(shí)現(xiàn)杈笔,該策略能夠優(yōu)先過濾出與請(qǐng)求調(diào)用方處于同區(qū)域的服務(wù)實(shí)例。
    ILoadBalancer:負(fù)載均衡器魁袜,默認(rèn)采用com.netflix.loadbalancer.ZoneAwareLoadBalancer實(shí)現(xiàn)桩撮,它具備了區(qū)域感知的能力。
    通過自動(dòng)化配置的實(shí)現(xiàn)峰弹,可以輕松地實(shí)現(xiàn)客戶端負(fù)載均衡店量。同時(shí),針對(duì)一些個(gè)性化需求鞠呈,也可以方面替換上面的默認(rèn)實(shí)現(xiàn)融师。只需要在Spring Boot應(yīng)用中創(chuàng)建對(duì)應(yīng)的實(shí)現(xiàn)實(shí)例就能覆蓋這些默認(rèn)的配置實(shí)現(xiàn)。
    另外蚁吝,也可以通過使用@RibbonClient注解來實(shí)現(xiàn)更細(xì)粒度的客戶端配置旱爆。

com.netflix.client.config.IClientConfig:Ribbon的客戶端配置,默認(rèn)采用com.netflix.client.config.DefaultClientConfigImpl實(shí)現(xiàn)窘茁。
com.netflix.loadbalancer.IRule:Ribbon的負(fù)載均衡策略怀伦,默認(rèn)采用com.netflix.loadbalancer.ZoneAvoidanceRule實(shí)現(xiàn),該策略能夠在多區(qū)域環(huán)境下選出最佳區(qū)域的實(shí)例進(jìn)行訪問山林。
com.netflix.loadbalancer.IPing:Ribbon的實(shí)例檢查策略房待,默認(rèn)采用com.netflix.loadbalancer.NoOpPing實(shí)現(xiàn),該檢查策略是一個(gè)特殊的實(shí)現(xiàn),實(shí)際上它并不會(huì)檢查實(shí)例是否可用桑孩,而是始終返回true拜鹤,默認(rèn)認(rèn)為所有服務(wù)實(shí)例都是可用的。
com.netflix.loadbalancer.ServerList:服務(wù)實(shí)例清單的維護(hù)機(jī)制流椒,默認(rèn)采用com.netflix.loadbalancer.ConfigurationBasedServerList實(shí)現(xiàn)敏簿。
com.netflix.loadbalancer.ServerListFilter:服務(wù)實(shí)例清單過濾機(jī)制,默認(rèn)采E用org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter宣虾,該策略能夠優(yōu)先過濾出與請(qǐng)求方處于同區(qū)域的服務(wù)實(shí)例惯裕。
com.netflix.loadbalancer.ILoadBalancer:負(fù)載均衡器,默認(rèn)采用com.netflix.loadbalancer.ZoneAwareLoadBalancer實(shí)現(xiàn)安岂,它具備了區(qū)域感知的能力轻猖。

  1. Ribbon提供的主要負(fù)載均衡策略
    簡單輪詢負(fù)載均衡(RoundRobin)
    以輪詢的方式依次將請(qǐng)求調(diào)度不同的服務(wù)器,即每次調(diào)度執(zhí)行i = (i + 1) mod n域那,并選出第i臺(tái)服務(wù)器咙边。
    加權(quán)響應(yīng)時(shí)間負(fù)載均衡 (WeightedResponseTime)
    隨機(jī)負(fù)載均衡 (Random)
    Ribbon自帶負(fù)載均衡策略比較:
策略名 策略聲明 策略描述 實(shí)現(xiàn)說明
BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 選擇一個(gè)最小的并發(fā)請(qǐng)求的server 逐個(gè)考察Server,如果Server被tripped了次员,則忽略败许,在選擇其中ActiveRequestsCount最小的server
AvailabilityFilteringRule public class AvailabilityFilteringRule extends PredicateBasedRule 過濾掉那些因?yàn)橐恢边B接失敗的被標(biāo)記為circuit tripped的后端server,并過濾掉那些高并發(fā)的的后端server(active connections 超過配置的閾值) 使用一個(gè)AvailabilityPredicate來包含過濾server的邏輯淑蔚,其實(shí)就就是檢查status里記錄的各個(gè)server的運(yùn)行狀態(tài)
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根據(jù)相應(yīng)時(shí)間分配一個(gè)weight市殷,相應(yīng)時(shí)間越長,weight越小刹衫,被選中的可能性越低醋寝。 一個(gè)后臺(tái)線程定期的從status里面讀取評(píng)價(jià)響應(yīng)時(shí)間,為每個(gè)server計(jì)算一個(gè)weight带迟。Weight的計(jì)算也比較簡單responsetime 減去每個(gè)server自己平均的responsetime是server的權(quán)重音羞。當(dāng)剛開始運(yùn)行,沒有形成statas時(shí)仓犬,使用roubine策略選擇server嗅绰。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 對(duì)選定的負(fù)載均衡策略機(jī)上重試機(jī)制。 在一個(gè)配置時(shí)間段內(nèi)當(dāng)選擇server不成功搀继,則一直嘗試使用subRule的方式選擇一個(gè)可用的server
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式輪詢選擇server 輪詢index窘面,選擇index對(duì)應(yīng)位置的server
RandomRule public class RandomRule extends AbstractLoadBalancerRule 隨機(jī)選擇一個(gè)server 在index上隨機(jī),選擇index對(duì)應(yīng)位置的server
ZoneAvoidanceRule public class ZoneAvoidanceRule extends PredicateBasedRule 復(fù)合判斷server所在區(qū)域的性能和server的可用性選擇server 使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個(gè)server叽躯,前一個(gè)判斷判定一個(gè)zone的運(yùn)行性能是否可用财边,剔除不可用的zone(的所有server),AvailabilityPredicate用于過濾掉連接數(shù)過多的Server点骑。
  1. 手動(dòng)配置示例
    通過自動(dòng)化配置的實(shí)現(xiàn)酣难,可以輕松的實(shí)現(xiàn)客戶端的負(fù)載均衡们童。同時(shí),針對(duì)一些個(gè)性化需求鲸鹦,我們可以方便的替換上面的這些默認(rèn)實(shí)現(xiàn),只需要在springboot應(yīng)用中創(chuàng)建對(duì)應(yīng)的實(shí)現(xiàn)實(shí)例就能覆蓋這些默認(rèn)的配置實(shí)現(xiàn)跷跪。
@Configuration
public class MyRibbonConfiguration {

    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

這樣就會(huì)使用P使用了RandomRule實(shí)例替代了默認(rèn)的com.netflix.loadbalancer.ZoneAvoidanceRule馋嗜。
也可以使用@RibbonClient注解實(shí)現(xiàn)更細(xì)粒度的客戶端配置

八、參數(shù)配置

對(duì)于Ribbon的參數(shù)通常有二種方式:全局配置以及指定客戶端配置
全局配置的方式很簡單
只需要使用ribbon.<key>=<value>格式進(jìn)行配置即可吵瞻。其中葛菇,<key>代表了Ribbon客戶端配置的參數(shù)名,<value>則代表了對(duì)應(yīng)參數(shù)的值橡羞。比如眯停,我們可以想下面這樣配置開啟Ribbon的饑餓加載模式:

#開啟Ribbon的饑餓加載模式
ribbon.eager-load.enabled=true
# 指定需要饑餓加載的客戶端名稱、服務(wù)名
ribbon.eager-load.clients=goods-service, user-service

通過上面的配置完成之后卿泽,我們嘗試重啟一下服務(wù)消費(fèi)者莺债,這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn),我們沒有開始調(diào)用服務(wù)接口签夭,但是上面初始化負(fù)載均衡的日志就已經(jīng)打印出來了齐邦。這就說明我們對(duì)ribbon的饑餓加載模塊設(shè)置已經(jīng)生效了。
全局配置可以作為默認(rèn)值進(jìn)行設(shè)置第租,當(dāng)指定客戶端配置了相應(yīng)的key的值時(shí)措拇,將覆蓋全局配置的內(nèi)容

指定客戶端的配置方式
<client>.ribbon.<key>=<value>的格式進(jìn)行配置.<client>表示服務(wù)名,比如沒有服務(wù)治理框架的時(shí)候(如Eureka)慎宾,我們需要指定實(shí)例清單丐吓,可以指定服務(wù)名來做詳細(xì)的配置。

# 2.01.5 已取消
user-service.ribbon.listOfServers=localhost:8080,localhost:8081,localhost:8082

九趟据、常見錯(cuò)誤:

  1. 找不到服務(wù)提供實(shí)例
    檢查服務(wù)提供者的配置:
spring.application.name=user-service
  1. 不能啟動(dòng)多個(gè)實(shí)例
    1)啟動(dòng)之前先將服務(wù)提供券犁,啟動(dòng)設(shè)置單例關(guān)掉
    2)去掉依賴包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

十、詳解 RestTemplate

RestTemplate定義了36個(gè)與REST資源交互的方法之宿,其中的大多數(shù)都對(duì)應(yīng)于HTTP的方法族操。
其實(shí),這里面只有11個(gè)獨(dú)立的方法比被,其中有十個(gè)有三種重載形式色难,而第十一個(gè)則重載了六次,這樣一共形成了36個(gè)方法等缀。
delete() 在特定的URL上對(duì)資源執(zhí)行HTTP DELETE操作
exchange()
在URL上執(zhí)行特定的HTTP方法枷莉,返回包含對(duì)象的ResponseEntity,這個(gè)對(duì)象是從響應(yīng)體中
映射得到的
execute() 在URL上執(zhí)行特定的HTTP方法尺迂,返回一個(gè)從響應(yīng)體映射得到的對(duì)象
getForEntity() 發(fā)送一個(gè)HTTP GET請(qǐng)求笤妙,返回的ResponseEntity包含了響應(yīng)體所映射成的對(duì)象
getForObject() 發(fā)送一個(gè)HTTP GET請(qǐng)求冒掌,返回的請(qǐng)求體將映射為一個(gè)對(duì)象
postForEntity()
POST 數(shù)據(jù)到一個(gè)URL,返回包含一個(gè)對(duì)象的ResponseEntity蹲盘,這個(gè)對(duì)象是從響應(yīng)體中映射得
到的
postForObject() POST 數(shù)據(jù)到一個(gè)URL股毫,返回根據(jù)響應(yīng)體匹配形成的對(duì)象
headForHeaders() 發(fā)送HTTP HEAD請(qǐng)求,返回包含特定資源URL的HTTP頭
optionsForAllow() 發(fā)送HTTP OPTIONS請(qǐng)求召衔,返回對(duì)特定URL的Allow頭信息
postForLocation() POST 數(shù)據(jù)到一個(gè)URL铃诬,返回新創(chuàng)建資源的URL
put() PUT 資源到特定的URL

RestTemplate 的get方法有以上幾個(gè),可以分為兩類: getForEntity() 和 getForObject()

  1. getForEntity
    服務(wù)提供:

服務(wù)消費(fèi):

  1. getForObject
    服務(wù)提供:

服務(wù)消費(fèi):

測試:

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/get/balance")
    public String getBalance() {
        ServiceInstance instance = loadBalancerClient.choose("USER-SERVICE");
        log.info(instance.getScheme());
        log.info("主機(jī):", instance.getHost());
        log.info("實(shí)例ID:", instance.getInstanceId());
        log.info("服務(wù)ID:", instance.getServiceId());
        log.info("端口號(hào):{}", instance.getPort());
        log.info("地址:{}", instance.getUri());
        return instance.getPort()+"";
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苍凛,隨后出現(xiàn)的幾起案子趣席,更是在濱河造成了極大的恐慌,老刑警劉巖醇蝴,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣肚,死亡現(xiàn)場離奇詭異,居然都是意外死亡悠栓,警方通過查閱死者的電腦和手機(jī)霉涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闸迷,“玉大人嵌纲,你說我怎么就攤上這事⌒裙粒” “怎么了逮走?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長今阳。 經(jīng)常有香客問我师溅,道長,這世上最難降的妖魔是什么盾舌? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任墓臭,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己褒侧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布嗡载。 她就那樣靜靜地躺著,像睡著了一般仍稀。 火紅的嫁衣襯著肌膚如雪洼滚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天技潘,我揣著相機(jī)與錄音遥巴,去河邊找鬼千康。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铲掐,可吹牛的內(nèi)容都是我干的拾弃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼摆霉,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼砸彬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斯入,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛀蜜,沒想到半個(gè)月后刻两,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滴某,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年磅摹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎奢。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡户誓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幕侠,到底是詐尸還是另有隱情帝美,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布晤硕,位于F島的核電站悼潭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舞箍。R本人自食惡果不足惜舰褪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疏橄。 院中可真熱鬧占拍,春花似錦、人聲如沸捎迫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽立砸。三九已至掖疮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颗祝,已是汗流浹背浊闪。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工恼布, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搁宾。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓折汞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盖腿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爽待,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容