两个子集pom互相调用_声明式服务调用组件Feign
什么是OpenFeign?
??? OpenFeign是SpringCloud在Feign的基礎上支持了SpringMVC的注解,其實就是對Feign的封裝。
? ? tips:Feign是Netflix的第三大組件,已停更,基本也沒人用了,SpringCloud對其進行了封裝,也就是OpenFeign。以下所提到的Feign都是指OpenFeign。
Feign能干什么???? Feign旨在使編寫Java Http客戶端變得容易。
????前面在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模版化的調用方法。但是在實際開發中,由于對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。所以Feign在此基礎上做了進一步封裝,由它來幫助我們定義和實現依賴服務接口的定義。????在Feign的實現下,我們只需創建一個接口并使用注解的方式來配置它,即可完成對服務提供方的接口綁定,簡化了使用Ribbon時,自己封裝服務調用客戶端的開發量。????簡單的講Feign就是用來做服務之間調用的組件,注意是用于客戶端(也就是消費方)。和上文提到的RestTemplate實現的功能是一樣的。
Feign集成了Ribbon????上文利用Ribbon維護了Payment服務列表信息,并且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過Feign只需要定義服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用。一、使用OpenFeign實現服務調用
1. 為了不和Ribbon訂單工程弄混,新建一個訂單服務工程,工程名:cloud-consumer-fegin-order,pom文件添加feign依賴
org.springframework.cloud spring-cloud-starter-openfeign2.?修改yml文件如下server:??port:?80eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka8761.com:8761/eureka,http://eureka8762.com:8762/eureka3. 主啟動類添加注解開啟Feign功能@SpringBootApplication@EnableFeignClientspublic?class?OrderFeignApplication?{ public static void main(String[] args) {????SpringApplication.run(OrderFeignApplication.class,?args); }}4. 新建一個service接口@Component@FeignClient(value = "CLOUD-PROVIDER-PAYMENT")public?interface?PaymentFeignService?{ @GetMapping("/payment/get/{id}") CommonResult getPaymentById(@PathVariable("id") Long id);}5.?新建controller,內容如下@RestControllerpublic?class?OrderFeignController?{ @Resource??private?PaymentFeignService?paymentFeignService;?? @GetMapping("/consumer/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ return paymentFeignService.getPaymentById(id); }}6.?按順序啟動兩個eureka及兩個支付服務,最后啟動本服務,在瀏覽器測試可以看到不僅成功調用了支付服務,且自帶負載均衡的功能。
各類之間調用關系:
二、OpenFeign超時控制
OpenFeign服務調用有個機制,當調用時間超過指定范圍,會報錯,默認1秒,我們模擬一個超時的場景。1.?在支付服務8001controller添加一個方法,讓他休眠3秒@GetMapping(value = "/payment/feign/timeout")public String paymentFeignTimeout(){ try { Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } return serverPort;}2.?在feign接口添加新接口@GetMapping(value = "/payment/feign/timeout")String?paymentFeignTimeout();3.?OrderFeignController添加方法@GetMapping(value = "/consumer/payment/feign/timeout")public String paymentFeignTimeout(){ // openfeign客戶端,默認等待1秒 return paymentFeignService.paymentFeignTimeout();}4. 啟動兩個注冊中心,支付服務8001,以及feign客戶端80,在瀏覽器訪問5. 報錯的原因就是feign客戶端80在訪問支付服務8001超過1秒后,feign主動拋異常,但是這樣肯定是不行的,實際工作中接口響應超過1秒太正常了,所以這時候我們需要設置超時控制。
????修改feign客戶端80yml文件,添加如下配置,超時控制重點ribbon: ReadTimeout: 5000 #指的是建立連接所需要的時間 ConnectTimeout: 5000 #指的是建立連接后從服務器讀取到可用資源所用的時間????這時候再去訪問,就可以正常返回了三、OpenFeign日志增強
Fegin提供了日志打印功能,我們可以通過配置來調整日志級別,從而了解Http請求的細節。說白了就是對Feign接口的調用情況進行監控和輸出。1. 日志級別NONE:默認的,不顯示任何日志
BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間
HEADERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息
FULL:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據
2. 配置Feign的日志管理
添加一個FeignConfig類,內容如下,注意這里Logger導的包是feign下的,別導成Log4j的包。
yml文件添加如下配置
到這里,OpenFeign的基本知識就學完了
接下來進入下一篇:服務熔斷器Hystrix
本項目已上傳到gitee和github,地址在公眾號窗口 我的->git 查看相關內容
總結
以上是生活随笔為你收集整理的两个子集pom互相调用_声明式服务调用组件Feign的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python前n项和存为一个数组_在Py
- 下一篇: java 标准输入流 关闭 打开_jav