天天看點

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

cloud-consumer-feign-order80模拟調用子產品

依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>pers.zhang.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-feign-order80</artifactId>

    <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定義的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>pers.zhang.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基礎通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
           

配置:application.yml

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
           

接口:

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")//指定注冊中心的服務名
public interface PaymentFeignService {

    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);

}
           

使用@FeignClient指定被調用的服務名:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

接口方法與提供服務方暴露的接口一緻:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

Controller:

@RestController
@Slf4j
public class OrderFeignController {

    @Resource
    PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return paymentFeignService.getPaymentById(id);
    }
}
           

啟動類:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//開啟Feign
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class, args);
    }
}
           

測試

啟動Eureka,啟動被調用的微服務,再啟動80端口的調用方:

通路:

localhost/consumer/payment/get/35

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

再次查詢:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

Feign繼承了Ribbon負載均衡,預設使用輪詢政策。

OpenFeign的逾時控制

提供服務方新增方法模拟逾時:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

PaymentFeignService中新增對應接口方法:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

Controller中增加對應方法:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

在服務提供方本地測試:

通路:

localhost:8001/payment/feign/timeout

:3秒後傳回結果如下:

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

使用Feign在80端口調用8001端口的服務:

通路:

localhost/consumer/payment/feign/timeout

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

因為OpenFeign預設等待時間為1秒,但是服務端處理需要超過1秒,導緻Feign用戶端不再等待,直接傳回報錯。

為了避免這種情況,有時候需要設定Feign用戶端的逾時控制。

修改application.yml

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

#設定feign用戶端逾時時間(OpenFeign內建了ribbon,逾時由ribbon控制)
ribbon:
  #指的是建立連接配接所用的時間,适用于網絡正常的情況下,兩端連接配接所用的時間
  ReadTimeout: 5000
  #指的是建立連接配接後從伺服器讀取到可用資源所用的時間
  ConnectTimeout: 5000

logging:
  level:
    # feign日志以什麼級别監控哪個接口
    pers.zhang.springcloud.service.PaymentFeignService: debug

           

重新開機80服務,再次通路

localhost/consumer/payment/feign/timeout

,3秒後傳回資訊

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

OpenFeign日志列印

Fei提供了日志列印功能,可以通過配置來調整日志級别,進而了解Feign中Http請求的細節。

日志級别:

  • NONE:預設,不顯示日志
  • BASIC:僅記錄請求方法,URL、響應狀态碼及執行時間
  • HEADERS:除了BASIC中定義的資訊之外,還有請求和響應的頭資訊
  • FULL:除了HEADERS中定義的資訊之外,還有請求和響應的正文及中繼資料

新增配置類:(指定日志級别)

@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
           

在application.yml中開啟日志,同時指定監控的接口

logging:
  level:
    # feign日志以什麼級别監控哪個接口
    pers.zhang.springcloud.service.PaymentFeignService: debug
           

啟動服務,通路

localhost/consumer/payment/get/35

SpringCloud--OpenFeign服務調用、逾時控制、日志列印

繼續閱讀