文章目錄
應用間的通信
主要有兩種:
HTTP vs RPC
- 兩大配方的主角就是SpringCloud和Dubbo
- Dubbo是個RPC框架,而SpringCloud的目標是微服務架構下的一站式解決方案
- SpringCloud微服務架構下, 微服務之間使用HTTP restful的方式, HTTP restful的方式本身輕量易用, 適用性強,可以很容易的跨語言,跨平臺,或者與已有的系統交互
- Dubbo本身的定位就是個RPC框架, 基於Dubbo開發的應用還是要依賴周邊的平臺和生態;
- SpringCloud沒出來之前, Double在國內應用得相當廣泛
SpringCloud中服務間兩種restful調用方式
- RestTemplate
- Fein
RestTemplate
舉例:
要在訂單微服務裏面調用商品微服務裏面的查詢商品
- 在商品服務裏面,加一個Controller,叫做“ServerController”,供其他服務調用
- 在訂單服務裏面寫一個Controller,叫做“ClientController”,調用商品服務裏面的接口
使用Template的第一種獲取方(直接使用restTemplate,url寫死)
這種方式的缺點:
- url是寫死的,對方的地址可能不知道
- 對方服務如果有兩臺,就牽扯到負載均衡
使用Template的第二種獲取方式(利用LoadBalancerClient獲取url)
其實第二種方式就是彌補第一種方式寫死url帶來的諸多不便
使用LoadBalancerClient對象,的choose方法, 傳入服務名,動態地取到url所需的各種信息
使用Template的第三種獲取方式(利用@LoadBalanced,可在restTemplate裏使用服務名)
寫一個config包,把restTemplate作爲一個Bean配置上去
Feign
使用步驟
第一步:
引入依賴:
第二步:
在主類上加註解: @EnableFeignClients
第三步:
寫一個接口, 打上@FeignClient註解
第四步:
直接在接口裏面注入這個接口, 然後調用這個方法即可~
負載均衡器Ribbion
之前有說過Eureka是客戶端發現的方式,它的均衡是軟負載, 也就是客戶端會向服務器例如EurekaServer拉取已註冊的可用服務信息,然後根據負載均衡策略直接命中某臺服務器發送請求。
這整個過程都是在服務器端發起的,並不需要服務器的參與。
SpringCloud客戶端負載均衡就是Ribbion組件,它是基於netfix Ribbion實現的, 通過SpringCloud的封裝, 可以輕鬆面向服務的rest風格請求, 自動轉換成客戶端負載均衡服務調用
以下都是用到了Ribbion
- RestTemplate
- Feign
- Zuul
上面使用的@Balanced註解用的就是Ribbion組件
Ribbion實現軟負載核心有三點
- 服務發現(依據服務的名字, 把該服務下的實例都找出來)
- 服務選擇規則(如何從多個服務中選擇有效的服務)
- 服務監聽(檢測失效的服務, 做到高效剔除)
Ribbion的主要組件有
- ServerList
- IRule
- ServerListFilter
流程
首先, 通過ServerList獲取所有可用的服務列表
然後, 通過ServerListFilter過濾掉一部分服務地址
最後, 剩下的地址通過IRule選擇一個實例作爲最終目標結果
默認規則是輪詢
如果要改, 就這樣改: