SpringCloud-OpenFeign-服务接口调用

是什么

把需要暴露的api使用接口来暴露,客户端需要调用的时候,直接查看这个接口中有没有就可以了

通用步骤

架构说明

common模块

common 引入 openfeign

新建服务接口类

java 复制代码
@FeignClient(value = "cloud-payment-service") // 服务名
public interface PayFeignApi {

    @PostMapping("/pay/add")
    public Result<Integer> addPay(@RequestBody PayDTO payDTO);

    @GetMapping("/pay/get/{id}")
    public Result<PayDTO> getById(@PathVariable("id") Integer id); // 必须指明 PathVariable 的 value

    @GetMapping("/pay/getInfo")
    public Result<String> getInfo();
}

客户端

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

主启动类 @EnableFeignClients

使用

java 复制代码
@RestController
public class OrderController {

    @Resource
    private PayFeignApi payFeignApi;

    @GetMapping("/consumer/pay/add")
    public Result addOrder(PayDTO payDTO) {
        return payFeignApi.addPay(payDTO);
    }

    @GetMapping("/consumer/pay/get/{id}")
    public Result<PayDTO> getPayByOrderNo(@PathVariable("id") Integer id) {
        return payFeignApi.getById(id);
    }

    @GetMapping("/consumer/pay/getInfo")
    public Result<String> getInfoByConsul() {
        return payFeignApi.getInfo();
    }
}

最后一个案例可以看到,openfeign 天生支持负载均衡

OpenFeign高级特性

日志打印

java 复制代码
// 日志记录级别
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

超时控制

测试超时时间异常
java 复制代码
@GetMapping("/consumer/pay/getInfo")
    public Result<String> getInfoByConsul() {
        Result<String> result = null;
        try {
            System.out.println("调用开始: " + DateUtil.now());
            result = payFeignApi.getInfo();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("调用结束: " + DateUtil.now());
            Result.fail(ReturnCodeEnum.RC500.getCode(), e.getMessage());
        }
        return result;
    }

read-timeout 默认 60s

如何调整

全局配置

调整后测试,发现3s后就异常返回

手动配置(服务级别)

同时存在,细粒度的覆盖粗粒度的

重试机制

性能优化HttpClient5替换

xml 复制代码
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version>
</dependency>
yaml 复制代码
spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true

HttpClient5 开启

替换以后

请求回应压缩

yaml 复制代码
spring:
  cloud:
    openfeign:
      compression:
        request:
          enabled: true
          mime-types: text/xml,application/xml,application/json
          min-request-size: 2048
        response:
          enabled: true
相关推荐
青鱼入云12 小时前
Ribbon是如何与服务注册中心nacos交互的
spring cloud·微服务·ribbon
青鱼入云15 小时前
OpenFeign介绍
spring cloud·微服务
勇往直前plus15 小时前
学习和掌握RabbitMQ及其与springboot的整合实践(篇一)
spring boot·学习·spring cloud·rabbitmq·java-rabbitmq
杨DaB21 小时前
【SpringCloud】Eureka
spring cloud·eureka·1024程序员节
洛克大航海1 天前
7-SpringCloud-服务网关 Gateway-高级特性 Route
java·spring cloud·gateway·route
我命由我123452 天前
Spring Cloud - Spring Cloud 声明式接口调用(Fiegn 声明式接口调用概述、Fiegn 使用)
java·后端·spring·spring cloud·微服务·架构·java-ee
杨DaB2 天前
【SpringCloud】Ribbon(LoadBalancer ) 和 Feign
spring·spring cloud·ribbon·feign·loadbalance
杨DaB4 天前
【SpringCloud】回顾微服务
spring·spring cloud·微服务
李昊哲小课5 天前
spring 中 HttpStatus 与 ResponseEntity
spring boot·后端·spring·http·spring cloud·restful
listhi5205 天前
Docker中授权普通用户使用docker命令以及解决无权限访问/var/run/docker.sock错误
spring cloud·云原生·eureka