SpringCloud系列(26)--OpenFeign超時控制

前言:在上一章節中我們簡單的介紹了如何使用OprnFeign去調用微服務,因為消費側和服務側是兩個不同的微服務,這樣可能會出現超時的現象,例如服務側需要3秒處理任何才能返回結果,但消費側可能2秒就斷開連接了,這時就會因為時間差而出現連接超時的問題,而本節內容則是關于如果去對OpenFeign進行超時控制。

1、編寫代碼模擬連接超時
(1)編寫providder-payment8001項目PaymentController類的代碼
package com.ken.springcloud.controller;import com.ken.springcloud.entities.CommonResult;
import com.ken.springcloud.entities.Payment;
import com.ken.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class PaymentController {@Resourceprivate PaymentService paymentService;@Value("${server.port}")private String serverPort;@Resourceprivate DiscoveryClient discoveryClient;@PostMapping("/payment/insert")public CommonResult insert(@RequestBody Payment payment) {int result = paymentService.insert(payment);log.info("插入結果{}",result);if(result > 0) {return new CommonResult(200,"插入數據庫成功,提供服務的端口號為" + serverPort,result);}else {return new CommonResult(500,"插入數據庫失敗",result);}}@GetMapping("/payment/get/{id}")public CommonResult insert(@PathVariable("id") Long id) {Payment payment = paymentService.getPaymentById(id);log.info("查詢結果{}",payment);if(payment != null) {return new CommonResult(200,"查詢成功,提供服務的端口號為" + serverPort,payment);}else {return new CommonResult(500,"沒有對應的數據,查詢失敗,查詢id" + id,payment);}}@GetMapping("/payment/discovery")public Object discovery() {//獲取eureka內的服務List<String> services = discoveryClient.getServices();for (String service : services) {log.info("***service:" + service);}//獲取服務名為CLOUD-PAYMENT-SERVICE下的實例List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");for (ServiceInstance instance : instances) {log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());}return this.discoveryClient;}@GetMapping("/payment/lb")public String getPaymentLB() {//返回當前服務的端口號return serverPort;}@GetMapping("/payment/feign/timeout")public String paymentFeigntimeout() {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}//返回當前服務的端口號return serverPort;}}
(2)編寫cloud-consumer-feign-order80項目PaymentFeignService類的代碼
package com.ken.springcloud.service;import com.ken.springcloud.entities.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@Component
//這里@FeignClient里寫的是指定要訪問的微服務的名稱,表示通過FeignClient去Eureka上面找名稱為CLOUD-PAYMENT-SERVICE的微服務的接口
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {//指明要調用的CLOUD-PAYMENT-SERVICE的微服務的接口,這里調用的是PaymentController類里的/payment/get/{id}接口@GetMapping("/payment/get/{id}")public CommonResult getPaymentById(@PathVariable("id") Long id);@GetMapping("/payment/feign/timeout")public String paymentFeigntimeout();
}
(3)編寫cloud-consumer-feign-order80項目OrderFeignController的代碼
package com.ken.springcloud.controller;import com.ken.springcloud.entities.CommonResult;
import com.ken.springcloud.entities.Payment;
import com.ken.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@Slf4j
@RestController
public class OrderFeignController {@Resourceprivate PaymentFeignService paymentFeignService;@GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {return paymentFeignService.getPaymentById(id);}@GetMapping("/payment/feign/timeout")public String paymentFeigntimeout() {//客戶端一般默認等待1秒鐘return paymentFeignService.paymentFeigntimeout();}}

2、測試payment接口是否正常工作

分別啟動eureka-server7001、eureka-server7002,然后再啟動provider-payment8001,最后再啟動cloud-consumer-feign-order80,全部啟動完畢后在瀏覽器的地址欄里輸入http://localhost:8001/payment/feign/timeout?并且回車調用接口,最后可以看到接口調用成功并返回8001,這證明provider-payment8001服務工作正常

3、測試通過consumer服務遠程調用payment服務

在瀏覽器地址欄里輸入http://localhost/consumer/payment/feign/timeout?并且回車調用接口,這時會顯示Read timed out executing GET http://CLOUD-PAYMENT-SERVICE/payment/feign/timeout的錯誤信息,這是因為Feign客戶端默認只等待一秒鐘,但是服務端處理需要超過1秒鐘,導致Feign客戶端不想等待了,直接返回報錯,為了避免這樣的情況,有時候我們需要設置Feign客戶端的超時控制。

效果圖:

4、設置Feign客戶端的超時時間

修改cloud-consumer-feign-order80項目的application.yml文件(因為OpenFeign集成了Ribbon,所以OpenFeign的超時控制也由最底層的Ribbon來進行限制,所以這里是對Ribbon進行配置)

集成示意圖:

application.yml文件

server:port: 80
eureka:client:#表示是否將自己注冊進Eureka Server里,默認為trueregister-with-eureka: falseservice-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#設置feign客戶端超時時間(OpenFeign默認支持ribbon)
ribbon:#指的是建立連接所用的時間,適用于網絡狀況正常的情況下,兩端連接所用的時間ReadTimeout: 5000#指的是建立連接后從服務器讀取到可用資源所用的時間ConnectTimeout: 5000

5、重新測試通過consumer服務遠程調用payment服務

重新啟動consumer服務,然后重新用瀏覽器調用http://localhost/consumer/payment/feign/timeout?接口,發現現在并不會再次發生微服務間調用出現連接超時的情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15937.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】2.單層感知機

目標&#xff1a; 實現一個簡單的二分類模型的訓練過程&#xff0c;通過模擬數據集進行訓練和優化&#xff0c;訓練目標是使模型能夠根據輸入特征正確分類數據。 演示: 1.通過PyTorch生成了一個模擬的二分類數據集&#xff0c;包括特征矩陣data_x和對應的標簽數據data_y。標簽…

加密與安全_AES RSA 密鑰對生成及PEM格式的代碼實現

文章目錄 RSA&#xff08;非對稱&#xff09;和AES&#xff08;對稱&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三種填充模式一、RSA填充模式二、常見的RSA填充模式組合三…

新業務 新市場 | 靈途科技新品亮相馬來西亞亞洲防務展

5月6日&#xff0c;靈途科技攜新品模組與武漢長盈通光電&#xff08;股票代碼&#xff1a;688143&#xff09;攜手參加第18屆馬來西亞亞洲防務展。首次亮相海外&#xff0c;靈途科技便收獲全球客戶的廣泛關注&#xff0c;為公司海外市場開拓打下堅實基礎。 靈途科技與長盈通共同…

Dbs封裝_連接池

1.Dbs封裝 每一個數據庫都對應著一個dao 每個dao勢必存在公共部分 我們需要將公共部分抽取出來 封裝成一個工具類 保留個性化代碼即可 我們的工具類一般命名為xxxs 比如Strings 就是字符串相關的工具類 而工具類 我們將其放置于util包中我們以是否有<T>區分泛型方法和非泛…

Python并發編程學習記錄

1、初識并發編程 1.1、串行&#xff0c;并行&#xff0c;并發 串行(serial)&#xff1a;一個cpu上按順序完成多個任務&#xff1b; 并行(parallelism)&#xff1a;任務數小于或等于cup核數&#xff0c;多個任務是同時執行的&#xff1b; 并發(concurrency)&#xff1a;一個…

計算機SCI期刊,IF=8+,專業性強,潛力新刊!

一、期刊名稱 Journal of Big data 二、期刊簡介概況 期刊類型&#xff1a;SCI 學科領域&#xff1a;計算機科學 影響因子&#xff1a;8.1 中科院分區&#xff1a;2區 出版方式&#xff1a;開放出版 版面費&#xff1a;$1990 三、期刊征稿范圍 《大數據雜志》發表了關于…

2024年【T電梯修理】考試內容及T電梯修理新版試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【T電梯修理】考試內容及T電梯修理新版試題&#xff0c;包含T電梯修理考試內容答案和解析及T電梯修理新版試題練習。安全生產模擬考試一點通結合國家T電梯修理考試最新大綱及T電梯修理考試真題匯總&#xff0c;…

線性dp合集,藍橋杯

貿易航線 0貿易航線 - 藍橋云課 (lanqiao.cn) n,m,kmap(int ,input().split()) #貪心的想&#xff0c;如果買某個東西利潤最大&#xff0c;那我肯定直接拉滿啊&#xff0c;所以買k個和買一個沒區別 p[0] for i in range(n):p.append([-1]list(map(int,input().split())))dp[[…

(2024,SDE,對抗薛定諤橋匹配,離散時間迭代馬爾可夫擬合,去噪擴散 GAN)

Adversarial Schrdinger Bridge Matching 公眾號&#xff1a;EDPJ&#xff08;進 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 進 V 交流群&#xff09; 目錄 0. 摘要 1. 簡介 4. 實驗 0. 摘要 薛定諤橋&#xff08;Schrdinger Bridge&#xff0c;SB&…

el-autocomplete后臺遠程搜索

el-complete可以實現后臺遠程搜索功能&#xff0c;但有時傳入數據為空時&#xff0c;接口可能會報錯。此時可在querySearchAsync方法中&#xff0c;根據queryString判斷&#xff0c;若為空&#xff0c;則不掉用接口&#xff0c;直接callback([])&#xff0c;反之則調用接口&…

浮點型比較大小

浮點數的存儲形式 浮點數按照在內存中所占字節數和數值范圍&#xff0c;可以分為浮點型&#xff0c;雙精度浮點型和長雙浮點型數。 代碼&#xff1a; printf("lgn:%e \n", pow(exp(1), 100));printf("lgn:%f ", pow(exp(1), 100));輸出結果&#xff1a; …

Stanford斯坦福 CS 224R: 深度強化學習 (5)

離線強化學習:第一部分 強化學習(RL)旨在讓智能體通過與環境交互來學習最優策略,從而最大化累積獎勵。傳統的RL訓練都是在線(online)進行的,即智能體在訓練過程中不斷與環境交互,實時生成新的狀態-動作數據,并基于新數據來更新策略。這種在線學習雖然簡單直觀,但也存在一些局限…

【Could not find Chrome This can occur if either】

爬蟲練習中遇到的問題 使用puppeteer執行是提示一下錯誤 Error: Could not find Chrome (ver. 125.0.6422.78). This can occur if either you did not perform an installation before running the script (e.g. npx puppeteer browsers install chrome) oryour cache path…

CLIP 論文的關鍵內容

CLIP 論文整體架構 該論文總共有 48 頁&#xff0c;除去最后的補充材料十頁去掉&#xff0c;正文也還有三十多頁&#xff0c;其中大部分篇幅都留給了實驗和響應的一些分析。 從頭開始的話&#xff0c;第一頁就是摘要&#xff0c;接下來一頁多是引言&#xff0c;接下來的兩頁就…

常用 CSS 寫法

不是最后一個 :not(:last-child)漸變色 background: linear-gradient(270deg, #15aaff 0%, #02396a 100%);文字漸變色 background-image: linear-gradient(to right, #ff7e5f, #feb47b); -webkit-background-clip: text; background-clip: text; color: transparent;

python文件IO基礎知識

目錄 1.open函數打開文件 2.文件對象讀寫數據和關閉 3.文本文件和二進制文件的區別 4.編碼和解碼 讀寫文本文件時 讀寫二進制文件時 5.文件指針位置 6.文件緩存區與flush()方法 1.open函數打開文件 使用 open 函數創建一個文件對象&#xff0c;read 方法來讀取數據&…

談談磁盤的那些操作

磁盤格式化 是指把一張空白的盤劃分成一個個小區域并編號&#xff0c;以供計算機存儲和讀取數據。格式化是一種純物理操作&#xff0c;是在磁盤的所有數據區上寫零的操作過程&#xff0c;同時對硬盤介質做一致性檢測&#xff0c;并且標記出不可讀和壞的扇區。由于大部分硬盤在…

電子技術學習路線

在小破站上看到大佬李皆寧的技術路線分析&#xff0c;再結合自己這幾年的工作。發現的確是這樣&#xff0c;跟著大佬的技術路線去學習是會輕松很多&#xff0c;現在想想&#xff0c;這路線其實跟大學四年的學習順序是很像的。 本期記錄學習路線&#xff0c;方便日后查看。 傳統…

python 深度圖生成點云(方法二)

深度圖生成點云 一、介紹1.1 概念1.2 思路1.3 函數講解二、代碼示例三、結果示例接上篇:深度圖生成點云(方法1) 一、介紹 1.1 概念 深度圖生成點云:根據深度圖像(depth image)和相機內參(camera intrinsics)生成點云(PointCloud)。 1.2 思路 點云坐標的計算公式如…

pillow學習7

繪制驗證碼 from PIL import Image,ImageFilter,ImageFont,ImageDraw import random width100 hight100 imImage.new(RGB,(width,hight),(255,255,255)) drawImageDraw.Draw(im) #獲取顏色 def get_color1():return (random.randint(200, 255), random.randint(200, 255), ran…