• 【SpringCloud】OpenFeign服务接口调用快速入门


    【SpringCloud】OpenFeign服务接口调用快速入门

    1. 概述

    官网地址:点击跳转

    Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用 Feign 创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注释的支持,以及对使用 Spring Web 中默认使用HttpMessageConverter 的支持。Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,以便在使用 Feign 时提供负载平衡的http客户端

    前面在使用 SpringCloud LoadBalancer + RestTemplate 时,利用 RestTemplate 对http请求的封装处理形成了一套模版化的调用方法。

    但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 OpenFeign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个 @FeignClient 注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过 OpenFeign 调用即可。

    OpenFeign 同时还集成SpringCloud LoadBalancer,可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。


    2. 引入依赖

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 配置、测试

    1)配置文件如下:

    server:
      port: 80
    
    spring:
      application:
        name: cloud-consumer-openfeign-order
      ####Spring Cloud Consul for Service Discovery
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            prefer-ip-address: true #优先使用服务ip进行注册
            service-name: ${spring.application.name}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2)启动类上添加 @EnableFeignClients 注解:

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class MainOpenFeign80 {
        public static void main(String[] args) {
            SpringApplication.run(MainOpenFeign80.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3)在通用commons模块下编写client:

    @FeignClient(value = "cloud-payment-service")
    public interface PayFeignApi {
    
        @PostMapping(value = "/pay/add")
        public ResultData<String> addPay(@RequestBody PayDTO payDTO);
    
        @GetMapping(value = "/pay/get/{id}")
        public ResultData getPayInfo(@PathVariable("id") Integer id);
    
        @GetMapping(value = "/pay/get/info")
        public String mylb();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这三个接口在pay服务中的接口对应如下:

    @PostMapping(value = "/pay/add")
    @Operation(summary = "新增", description = "新增支付流水方法,json串做参数")
    public ResultData<String> addPay(@RequestBody PayDTO payDTO) {
        Pay pay = new Pay();
        BeanUtils.copyProperties(payDTO, pay);
        System.out.println(pay.toString());
        int i = payService.add(pay);
        return ResultData.success("成功插入记录,返回值:" + i);
    }
    
    @GetMapping(value = "/pay/get/{id}")
    @Operation(summary = "按照ID查流水", description = "查询支付流水方法")
    public ResultData<Pay> getById(@PathVariable("id") Integer id) {
        Pay pay = payService.getById(id);
        return ResultData.success(pay);
    }
    
    @GetMapping(value = "/pay/get/info")
    private String getInfoByConsul(@Value("${com.zhj}") String str) {
        return "com.zhj: " + str + "\t" + "port: " + port;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4)在order服务中调用这三个接口:

    @RestController
    @Slf4j
    public class OrderController {
        @Resource
        private PayFeignApi payFeignApi;
    
        @PostMapping("/feign/pay/add")
        public ResultData addOrder(@RequestBody PayDTO payDTO) {
            System.out.println("第一步:模拟本地addOrder新增订单成功(省略sql操作),第二步:再开启addPay支付微服务远程调用");
            ResultData resultData = payFeignApi.addPay(payDTO);
            return resultData;
        }
    
        @GetMapping("/feign/pay/get/{id}")
        public ResultData getPayInfo(@PathVariable("id") Integer id) {
            System.out.println("-------支付微服务远程调用,按照id查询订单支付流水信息");
            ResultData resultData = payFeignApi.getPayInfo(id);
            return resultData;
        }
    
        /**
         * openfeign天然支持负载均衡演示
         *
         * @return
         */
        @GetMapping(value = "/feign/pay/mylb")
        public String mylb() {
            return payFeignApi.mylb();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    调用第二个接口,结果如下:

    image-20240425005414737

    测试第三个结果,看负载均衡是否成功,结果如下:

    image-20240425005338931

    image-20240425005346998

    说明 OpenFeign 默认集成了 LoadBalance。

  • 相关阅读:
    基于JAVA体育城场地预定系统后台计算机毕业设计源码+数据库+lw文档+系统+部署
    计算机毕业设计django基于python商品比价平台(源码+系统+mysql数据库+Lw文档)
    HTML 颜色
    开发者职场“生存状态”大调研报告分析 - 第四版
    【C++ techniques】让函数根据一个以上的对象类型来决定如何虚化
    Linux内核4.14版本——drm框架分析(12)——DRM_IOCTL_MODE_SETCRTC(drm_mode_setcrtc)
    在前台页面中console怎么查vue.prototype
    栈、队列——双向链表、数组表示以及相互表示
    对比多家互联网医院系统技术代码:数字医疗服务的背后
    LeetCode·84.柱状图中最大的矩形·单调递增栈
  • 原文地址:https://blog.csdn.net/Decade_Faiz/article/details/138173714