一、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ù)非常重要则涯。
- 客戶端負(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ù)載均衡和服務(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)用
- Ribbon配置
@Configuration
public class RibbonConfig {
@Bean // 初始化 Bean
@LoadBalanced // 實(shí)現(xiàn)負(fù)載均衡
RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 創(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ù)載均衡測試
-
啟動(dòng)多個(gè)服務(wù)實(shí)例辟癌,端口分別為8001 8005 8006
啟動(dòng)之前先將服務(wù)提供,啟動(dòng)設(shè)置單例關(guān)掉
-
消費(fèi)測試
六荐捻、負(fù)載均衡器
雖然Spring Cloud 中定義了LoadBalancerClient作為負(fù)載均衡器的通用接口黍少,并且針對(duì)Ribbon實(shí)現(xiàn)了RibbonLoadBalancerClient,但是它在具體體實(shí)現(xiàn)客戶端負(fù)載均衡時(shí)处面,是通過Ribbon的ILoadBalancer接口實(shí)現(xiàn)的厂置。
- 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ì)信息唆涝。 - 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)具備的一系列操作汉操。
- 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。
- 自動(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ū)域感知的能力轻猖。
- 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点骑。 |
- 手動(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ò)誤:
- 找不到服務(wù)提供實(shí)例
檢查服務(wù)提供者的配置:
spring.application.name=user-service
- 不能啟動(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()
- getForEntity
服務(wù)提供:
服務(wù)消費(fèi):
- 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()+"";
}