springcloud-feign實現服務發現
上一篇介紹了nacos實現配置和註冊中心,在微服務中只有配置和註冊中心遠遠不夠,還須要有服務發現。本文重點介紹一下基於feign實現服務發現。spring
簡單介紹
springcloud使用服務發現進行服務間調用。對外使用網關gateway屏蔽分流轉發接口。服務發現客戶端到註冊中心拉取服務列表實現客戶端負載均衡。客戶端實現負載均衡主要有兩種方式。一種是ribbon另外一種是基於ribbon封裝的feign。這是feign官方的解釋
我總結了一下主要有一下幾個優勢:
(1)可插拔的註解支持,包括Feign註解和JAX-RS註解;
(2)支持可插拔的HTTP編碼器和解碼器;
(3)支持Hystrix和它的Fallback;
(4)支持Ribbon的負載均衡;
(5)支持HTTP請求和相應的壓縮。服務器
微服務調用經常使用概念
(1)服務降級:
當服務器壓力劇增的狀況下,根據實際業務狀況及流量,對一些服務和頁面有策略測不處理或換種簡單的方式處理,從而釋放資源以保證核心交易正常運做成高效運做。
(2)斷路:
熔斷這一律念來自於電子工程中的斷路器(circuit Breaker)。在互聯網系統中,當下遊服務因訪問壓力過大而相應變慢或者失敗,上游爲了保護系統總體的可用性,能夠暫時切斷對下游服務的調用。
簡單理解就是降級是針對業務,斷路是上下游故障。
(3)冪等性:
就是用戶對於同一操做發起的一次請求或者屢次請求的結果是一致的,不會由於屢次點擊而產生了反作用。mvc
使用方式
下面咱們開始feign的使用:
(1)添加springcloudalibaba和openfeign的依賴
<dependency>app
\<groupId>org.springframework.cloud\</groupId> \<artifactId>spring-cloud-starter-openfeign\</artifactId> \</dependency> \<dependency> \<groupId>org.springframework.cloud\</groupId> \<artifactId>spring-cloud-starter-alibaba-nacos-discovery\</artifactId> \</dependency>
(2)添加註解 @EnableDiscoveryClient開啓服務發現,註解 @EnableFeignClients支持feign客戶端。負載均衡
用@FeignClient("serviceName")註解在對外的接口上,這樣接口就支持調用服務,所以支持熱插拔。serviceName使用註冊中心被調用的服務名字。@RequestMapping註解的方法是服務提供方的接口方法,看起來是否是和springmvc使用方法很像,沒錯由於這是feign對mvc支持的一種契約。feign默認是@RequestLine。它能夠支持各類契約。一樣子,他可使用默認的HttpUrlConnection也可使用httpclient或者okhttp3.ide
(3)修改application.peoperties配置文件
#服務名字
----- spring.application.name=feign-service
#服務無故口0會隨機選擇一個
----- server.port=0
#服務集羣名字
---- spring.cloud.nacos.discovery.cluster-name=consumer-service
#nacos註冊中心地址
----- spring.cloud.nacos.discovery.server-addr=nacos.blog.ailijie.top
ok,完成。下面是feign的高級使用微服務
feign高級使用 ui
(1)feign日誌配置
建立feign日誌級別,還有feign的重試機制,這樣feign可使用重試機制同時把每一次的請求用日誌記錄下來。
(2)feign的斷路
在feignclient註解中配置fallbackFactory工廠,進行斷路解決。使用factory的好處是能夠處理異常信息。還可使用fallback處理。若是使用fallback,fallbackFactory將不會生效。看一下,Factory
須要返回一個IProviderService的實現類,在create方法裏能夠處理異常。這樣在服務端發生異常或者下線後,將會走斷路方法。
(2)feign的高級配置
#開啓okhttp
----- feign.okhttp.enabled=true
#開啓hystrix斷路,不開啓feign的降級不生效
----- feign.hystrix.enabled=true 編碼
#hystrix斷路超時時間
----- hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 2000 spa
----- provider- ----- service.ribbon.ConnectTimeout = 1000
----- provider-service.ribbon.ReadTimeout = 1000
#對全部操做請求都進行重試
----- provider-servicee.ribbon.OkToRetryOnAllOperations = true
#切換實例的重試次數
----- provider-service.ribbon.MaxAutoRetriesNextServer = 2
#對當前實例的重試次數
----- provider-service.ribbon.MaxAutoRetries = 1
#設置日誌級別
----- logging.level.com.wotrd.feignservice.service.IProviderService=DEBUG
斷路的超時時間須要大於讀超時時間,否則重試不生效。
未完待續,接下來將會更新springmvc全局異常處理和springdataflow。有問題請留言。
我的博客地址 https://blog.ailijie.top/arch...