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
相关推荐
Rain的Java大神之路3 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8263 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8263 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇4 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会4 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇5 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会5 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超6 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er7 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫7 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud