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
相关推荐
追风筝的人er9 天前
企业管理系统如何实现自定义首页与千人千面?RuoYi Office 给出了完整方案
vue.js·spring boot·spring cloud
三水不滴9 天前
利用SpringCloud Gateway 重试 + 降级解决第三方接口频繁超时问题,提升性能
经验分享·笔记·后端·spring·spring cloud·gateway
知识即是力量ol10 天前
微服务架构:从入门到进阶完全指南
java·spring cloud·微服务·nacos·架构·gateway·feign
Java水解10 天前
【Spring Cloud】优雅实现远程调用-OpenFeign
后端·spring cloud
Remember_99310 天前
SpringCloud:Nacos注册中心
java·开发语言·后端·算法·spring·spring cloud·list
J_liaty10 天前
Spring Cloud 微服务面试高频题
spring cloud·微服务·面试
西门吹雪分身10 天前
SpringCloudGateway过滤器之RequestRateLimiterGatewayFilterFactory
java·redis·spring cloud
vx_Biye_Design10 天前
【关注可免费领取源码】云计算及其应用网络教学系统--毕设附源码35183
java·spring·spring cloud·servlet·eclipse·云计算·课程设计
Coder_Boy_11 天前
Java后端核心技术体系全解析(个人总结)
java·开发语言·spring boot·分布式·spring cloud·中间件
悠闲蜗牛�11 天前
Kubernetes从零到集群:本地Minikube环境搭建与Spring Cloud微服务运维实战
spring cloud·微服务·kubernetes