欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud OpenFeign超時控制示例詳解

 更新時間:2024年05月27日 09:35:48   作者:Ken_1115  
在Spring Cloud中使用OpenFeign時,可以通過配置來控制請求的超時時間,這篇文章主要介紹了SpringCloud OpenFeign超時控制,需要的朋友可以參考下

前言:

在上一章節(jié)中我們簡單的介紹了如何使用OprnFeign去調(diào)用微服務,因為消費側(cè)和服務側(cè)是兩個不同的微服務,這樣可能會出現(xiàn)超時的現(xiàn)象,例如服務側(cè)需要3秒處理任何才能返回結(jié)果,但消費側(cè)可能2秒就斷開連接了,這時就會因為時間差而出現(xiàn)連接超時的問題,而本節(jié)內(nèi)容則是關于如果去對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 {
    @Resource
    private PaymentService paymentService;
    @Value("${server.port}")
    private String serverPort;
    @Resource
    private DiscoveryClient discoveryClient;
    @PostMapping("/payment/insert")
    public CommonResult insert(@RequestBody Payment payment) {
        int result = paymentService.insert(payment);
        log.info("插入結(jié)果{}",result);
        if(result > 0) {
            return new CommonResult(200,"插入數(shù)據(jù)庫成功,提供服務的端口號為" + serverPort,result);
        }else {
            return new CommonResult(500,"插入數(shù)據(jù)庫失敗",result);
        }
    }
    @GetMapping("/payment/get/{id}")
    public CommonResult insert(@PathVariable("id") Long id) {
        Payment payment = paymentService.getPaymentById(id);
        log.info("查詢結(jié)果{}",payment);
        if(payment != null) {
            return new CommonResult(200,"查詢成功,提供服務的端口號為" + serverPort,payment);
        }else {
            return new CommonResult(500,"沒有對應的數(shù)據(jù),查詢失敗,查詢id" + id,payment);
        }
    }
    @GetMapping("/payment/discovery")
    public Object discovery() {
        //獲取eureka內(nèi)的服務
        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 {
    //指明要調(diào)用的CLOUD-PAYMENT-SERVICE的微服務的接口,這里調(diào)用的是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 {
    @Resource
    private 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 并且回車調(diào)用接口,最后可以看到接口調(diào)用成功并返回8001,這證明provider-payment8001服務工作正常

3、測試通過consumer服務遠程調(diào)用payment服務

在瀏覽器地址欄里輸入http://localhost/consumer/payment/feign/timeout 并且回車調(diào)用接口,這時會顯示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里,默認為true
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#設置feign客戶端超時時間(OpenFeign默認支持ribbon)
ribbon:
  #指的是建立連接所用的時間,適用于網(wǎng)絡狀況正常的情況下,兩端連接所用的時間
  ReadTimeout: 5000
  #指的是建立連接后從服務器讀取到可用資源所用的時間
  ConnectTimeout: 5000

5、重新測試通過consumer服務遠程調(diào)用payment服務

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

到此這篇關于SpringCloud OpenFeign超時控制的文章就介紹到這了,更多相關SpringCloud OpenFeign超時控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot動態(tài)定時任務實現(xiàn)與應用詳解

    SpringBoot動態(tài)定時任務實現(xiàn)與應用詳解

    定時任務在許多應用場景中是必不可少的,特別是在自動化任務執(zhí)行、定期數(shù)據(jù)處理等方面,定時任務能極大地提高系統(tǒng)的效率,然而,隨著業(yè)務需求的變化,定時任務的執(zhí)行頻率或時間點可能需要動態(tài)調(diào)整,所以本文給大家介紹了SpringBoot動態(tài)定時任務實現(xiàn)與應用
    2024-08-08
  • Java volatile如何實現(xiàn)禁止指令重排

    Java volatile如何實現(xiàn)禁止指令重排

    這篇文章主要介紹了Java volatile如何實現(xiàn)禁止指令重排,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java實現(xiàn)人機猜拳小游戲

    Java實現(xiàn)人機猜拳小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)人機猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • JDK1.8新特性之方法引用 ::和Optional詳解

    JDK1.8新特性之方法引用 ::和Optional詳解

    這篇文章主要介紹了JDK1.8新特性之方法引用 ::和Optional,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 解決Spring事務@Transactional多層嵌套失效問題

    解決Spring事務@Transactional多層嵌套失效問題

    在使用Spring進行事務管理時,可能會遇到事務失效的問題,主要原因包括數(shù)據(jù)庫不支持事務、方法訪問級別不是public、未被Spring管理的Bean、當前類的方法內(nèi)部調(diào)用以及配置的事務傳播性不當?shù)?解決事務失效的方法有使用聲明式事務處理采用合適的事務傳播行為
    2024-11-11
  • Springboot FeignClient調(diào)用Method has too many Body parameters解決

    Springboot FeignClient調(diào)用Method has too m

    本文主要介紹了Springboot FeignClient微服務間調(diào)用Method has too many Body parameters 解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Eclipse導入項目報錯問題解決方案

    Eclipse導入項目報錯問題解決方案

    這篇文章主要介紹了Eclipse導入項目報錯問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • java UUID&雪花算法生成和使用場景詳解

    java UUID&雪花算法生成和使用場景詳解

    UUID和雪花算法都是用于生成唯一標識符的有效工具,它們各有優(yōu)勢:UUID簡單易用,但長度較長,適用于分布式系統(tǒng);雪花算法生成的ID較短且有序,適用于需要保證順序的場景,在選擇算法時,需要考慮系統(tǒng)架構、性能需求和順序需求等因素
    2025-01-01
  • JAVAlogback日志管理詳解

    JAVAlogback日志管理詳解

    本篇文章主要介紹了在SpringBoot中使用Logback管理記錄日志,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09

最新評論