您好,登錄后才能下訂單哦!
1、Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon實現的—套客戶端―負載均衡的工具。
簡單的說,Ribbon是Netlix發布的開源項目,主要功能是提供客戶端的軟件負載均衡算法和服務調用。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們很容易使用Ribbon實現自定義的負載均衡算法。
目前Ribbon和Eureka進入到維護模式。停更不停用
負載均衡:
LB負載均衡(Load Balance)是什么?
簡單的說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA(高可用)。1
常見的負載均衡有軟件Nginx,LVS,硬件F5等。
Ribbon本地負載均衡客戶端VS Nginx服務端負載均衡區別
Nginx是服務器負載均衡,客戶端所有請求都會交給nginx,然后由nginx實現轉發請求。即負載均衡是由服務端實現的。
Ribbon本地負載均衡,在調用微服務接口時候,會在注冊中心上獲取注冊信息服務列表之后緩存到VM本地,從而在本地實現RPC遠
程服務調用技術。
1、集中式LB
即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5,也可以是軟件,如nginx)由該設施負責把訪問請求通過某種策咯轉發至服務的提供方;
2、進程內LB
將LB邏輯集成到消費方,消費方從服務注冊中心獲知有哪些地址可用,然后自己再從這些地址中選擇出一個合適的服務器。Ribbon就屬于進程內LB,它只是一個類庫,集成于消費方進程,消費方通過它來獲取到服務提供方的地址。
負載均衡 +RestTemplate 配合使用
架構
總結:Ribbon其實就是一個軟負載均衡的客戶端組件,他可以和其他所需請求的客戶端結合使用,和eureka結合只是其中的一個實例.
Ribbon在工作時分成兩步
第一步先選擇EurekaServer ,它優先選擇在同一個區域內負載較少的server.
第二步再根據用戶指定的策略,在從server取到的服務注冊列表中選擇一個地址。
其中Ribbon提供了多種策略:比如輪詢、隨機和根據響應時間加權。
pom 依賴 spring-cloud-starter-netflix-eureka-client 自身 就集成了 ribbon 。
RestTemplate說明:
Ribbon負載均衡規則
繼承結構
自帶7種:
如何使用?負載均衡策略替換。
官方文檔明確給出了警告:
這個自定義配置類不能放在@ComponentScan所掃描的當前包下以及子包下,
否則我們自定義的這個配置類就會被所有的Ribbon客戶端所共享,達不到特殊化定制的目的了。
增加rule配置類
包路徑: com.fage.rules @Configuration public class MyRibbonRule { @Bean public IRule randomRule() { return new RandomRule(); } }
boot啟動類增加注解
@RibbonClient(name = "cloud-payment-service", configuration = {MyRibbonRule.class})
負載均衡輪詢算法原理
負載均衡算法: rest接口第幾次請求數%服務器集群總數量=實際調用服務器位置下標,每次服務重啟動后rest接口計數從1開始。
List
如:List [o] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+8002組合成為集群,它們共計2臺機器,集群總數為2,按照輪詢算法原理:
當總請求數為1時:1%2=1對應下標位置為1,則獲得服務地址為127.0.0.1:8001
當總請求數位2時: 2%2=O對應下標位置為0,則獲得服務地址為127.0.0.1:8002
當總請求數位3時:3%2=1對應下標位置為1,則獲得服務地址為127.0.0.1:8001
當總請求數位4時:4%2=0對應下標位置為0,則獲得服務地址為127.0.0.1:8002
如此類推......
源碼:
從0開始取余獲取提供者服務。
內部使用cas+自旋鎖。
手寫一個負載均衡算法,實現輪詢
1、服務提供者增加接口
@GetMapping("/payment/loadBalanced") public CommonResult<Object> getLoadBalanced() { return new CommonResult<>(200, "調用成功", port); }
2、服務消費者改造
將 @LoadBalanced 注解去掉
增加MyLoadBalanced接口,只有一個方法ServiceInstance instance(List
實現類MyLib源碼如下:
@Component @Slf4j public class MyLib implements MyLoadBalanced { private final AtomicInteger nextServerCyclicCounter = new AtomicInteger(0); public final int getAndIncrement() { // 方案 1 cas // int current; // int next; // do { // current = this.nextServerCyclicCounter.get(); // next = current >= 2147483647 ? 0 : current + 1; // } while (!this.nextServerCyclicCounter.compareAndSet(current, next)); // log.info("**********第幾次訪問,次數next:" + next); // return next; // 方案 2 JUC 提供的 自增方法 log.info("**********第幾次訪問,次數next:" + nextServerCyclicCounter.getAndIncrement()); return nextServerCyclicCounter.get(); } /** * 負載均衡算法:rest接口第幾次請求書 % 服務器集群總數量 = 實際調用服務器位置下標,每次服務重啟動后rest接口計數從1開始 * * @param serviceInstances 集群中的 服務 實例 * @return 集群中的一個實例 */ @Override public ServiceInstance instance(List<ServiceInstance> serviceInstances) { return serviceInstances.get(getAndIncrement() % serviceInstances.size()); } }
3、改造消費者調用方法
@GetMapping(value = "/consumer/payment/loadBalanced") public CommonResult getLoadBalanced() { ServiceInstance instance = myLoadBalanced.instance(discoveryClient.getInstances(PAYMENT_URL.split("http://")[1])); return restTemplate.getForObject(instance.getUri()+"/payment/loadBalanced", CommonResult.class); }
2、OpenFeign
只需要一個接口并在接口上添加注解即可。
feign不再更新,直接學習openFeign。都是用于負載均衡。
Feign是一個聲明式WebService客戶端。使用Feign能讓編寫Web Service客戶端更加簡單。
它的使用方法是定義一個服務接口然后在上面添加注解。Feign也支持可拔括式的編碼羆和解碼器。Spring Cloud對Feign進行了封裝,使其支持了Spring MVC標準注解和HttpMessageConverters。Feign和ribbon組合使用以支持負載均衡。
Feign能干什么
Feign旨在使編寫Java Http客戶端變得更容易。
前面在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模版化的調用方法。但是在實際開發
中,由于對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝
這些依賴服務的調用。所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務接口的定義。在Feign的實現下
,我們只需創建一個接口并使用注解的方式來配置它(以前是Dao接口上面標注Mapper注解,現在是一個微服務接口上面標注一個
Feign注解即可),即可完成對服務提供方的接口綁定,簡化了使用Spring cloud Ribbon時,自動封裝服務調用客戶端的開發量。
Feign集成了Ribbon
利用Ribbon維護了Payment的服務列表信息,并且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義
服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用
Feign和openFeign的區別
搭建openFeign模塊 cloud-consumer-openfeign-order80
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
啟動類增加注解@EnableFeignClients
增加feign接口
@Component @FeignClient(value = "cloud-payment-service") public interface OpenFeignService { @GetMapping("/payment/loadBalanced") public CommonResult<Object> getLoadBalanced(); }
增加controller
@RestController @Slf4j public class OrderController implements OpenFeignService { @Resource OpenFeignService openFeignService; @Override @GetMapping("/consumer/payment/loadBalanced") public CommonResult<Object> getLoadBalanced() { return openFeignService.getLoadBalanced(); } }
注冊中心使用eureka。跟之前一樣。
OpenFeign超時控制
OpenFeign默認等待時間為1ms。
設置超時時間
###設置 超時時間 方式 1 # 設置 feign客戶端超時時間 ( openFeign 默認支持 ribbon ) ribbon: # 指的是建立連接所用的時間,適用于網絡狀況正常的情況下,倆端連接所用的時間 單位是秒 ReadTimeout: 6000 # 指的是建立連接后從服務器讀取到可用資源的時間 ConnectTimeout: 5000 ###設置 超時時間 方式 2 #feign: # client: # config: # default: # connectTimeout: 5000 # readTimeout: 6000 # loggerLevel: full
OpenFeign日志增強
Feign提供了日志打印功能,我們可以通過配置來調整日志級別,從而了解Feign中Http請求的細節。
說白了就是對Feign接口的調用情況進行監控和輸出
日志級別:
NONE:默認的,不顯示任何日志;
BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間;
HEADERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息;
FULL:除HEADERS中定義的信息之外,還有請求和響應的正文及元數據。
配置日志bean:
@Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }
yml開啟日志
# 設置 feign客戶端超時時間 ( openFeign 默認支持 ribbon ) ribbon: # 指的是簡歷連接所用的時間,適用于網絡狀況正常的情況下,倆端連接所用的時間 單位是秒 ReadTimeout: 8000 # 指的是建立連接后從服務器讀取到可用資源的時間 ConnectTimeout: 6000 # 開啟 feign 日志打印 logging: level: ## feign 日志 以什么級別 監控那個接口 com.fage.springcloud.feign.OpenFeignService: debug
結果:
2020-08-25 17:55:26.667 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] ---> GET http://cloud-payment-service/payment/loadBalanced HTTP/1.1
2020-08-25 17:55:26.667 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] ---> END HTTP (0-byte body)
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] <--- HTTP/1.1 200 (14ms)
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] connection: keep-alive
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] content-type: application/json
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] date: Tue, 25 Aug 2020 09:55:26 GMT
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] keep-alive: timeout=60
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] transfer-encoding: chunked
2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced]
2020-08-25 17:55:26.683 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService : [OpenFeignService#getLoadBalanced] {"code":200,"message":"調用成功","data":"8001"}
到此這篇關于SpringCloud 服務負載均衡和調用 Ribbon、OpenFeign的方法的文章就介紹到這了,更多相關SpringCloud 服務負載均衡內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。