• spring cloud中feign的使用


    背景

    最近在写中台,就是各功能板块各司其职,最后根据需要整合在一起搭建成一个完整的系统,有了解的小伙伴都知道,这里用的其实就是微服务。

    过程中,各工程模块之间有大量的相互连接调用的部分。这种场景最早的做法是借用代理实现,后来Spring Cloud  封装了一个Spring Cloud Rbbon,可以利用RestTemplate 的请求拦截来实现对依赖服务的接口调用。项目中对服务依赖的调用往往会有多处,所以通常会针对各个微服务自行封装一些客户端来包装这些依赖服务的调用,故几乎每一个调用都是简单的模块化内容。

    而Spring Cloud Feign 做了进一步的封装,在Fegin的基础上,我们只需要创建一个接口并使用 @FeignClient 注解来配置,即可完成对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时自行封装服务调用客户端的开发量。 

    Fegin使用

    1、准备

    1)启动 Eureka服务注册中心;

    2)创建两个微服务A(服务提供者)、B(服务消费者);

    3) A服务的 application.name = "A-service", B 服务 application.name = "B-service";

    4)A 服务提供服务接口 A1,B 服务的 B1 功能模块中调需要用 A1;

    5)在 A、B 服务的 application.yml 文件中加入 Eureka 配置信息,如:

    eureka:
      client:
        healthcheck:
          enabled: true
        serviceUrl:
          defaultZone: http://localhost:8112/eureka/
        enabled: true
      instance:
        hostname: localhost
        ip-address: localhost
        non-secure-port: 8088
        instance-id: baas-bbw-transfer:${eureka.instance.ip-address}:${eureka.instance.non-secure-port}
        lease-expiration-duration-in-seconds: 30
        lease-renewal-interval-in-seconds: 10

    6)A1 提供相应的方法接口,如 query()方法;

    2、Fegin 客户端定义(maven 依赖等等不再赘述)

    @FeignClient(name = "A-service", decode404 = true)
      public interface A1Client extends A1Api{
    }

    2)服务调用

    @RestController
    @RequestMapping(value = "/b1", produces = "application/json;charset=utf-8")
    public class B1Controller {
       @Autowired
       private A1Client a1client;
    
       @PostMapping("/query")
       private BaasResponse<List<B1业务实体类>> query(
        @RequestBody MappingFilter filter) throws BaasException {
    
          return a1client.query(tenant, filter);
      }
    }

    至此,B 服务中就实现了一次对于 A 服务中 A1 模块 query()方法的调用,整个过程简单的像是调用了服务内部的方法。

    注意

    1、如果 A、B两个微服务不是不同的 eureka 中,那在使用 @Fegin 注解时,需要在注解中添加 url ,去指明 A 服务的全路径访问地址,以保证 B 能正确的向 A 发送请求。此时,@Fegin 的使用如:

    //这里用127.0.0.1:8080代替 A 服务地址
    @FeignClient(name = "A-service", url = "127.0.0.1:8080", decode404 = true)
      public interface A1Client extends A1Api{
    }

    2、由于在 url 写入固定的地址,可能会导致负载均衡失去作用(除非指定的地址是网关地址),故通常的做法是在 application.yml 文件中,加入一个配置,在 url 中使用 ${}取值的方式去获取配置的服务地址(这种方式多用于开发本地测试)。如:

    //application.yml
    A-service: application: name:A-service url:localhost:port

    此时,调用如:

    //这里用127.0.0.1:8080代替 A 服务地址
    @FeignClient(name = "${A-service.application.name}", url = "${A-service.application.url}", decode404 = true)
      public interface A1Client extends A1Api{
    }

    Spring cloud Fegin 基本的使用过程已介绍完毕~~~~回去继续撸代码。

    最近在看我“现男友”强推的《罗生门》,可能是我这种理科女不太适合这种隐喻性太强的小说吧,看的不知所谓~~道行还是不够哇!!

    参考阅读

    - spring cloud 多模块开发下 Fegin 的使用

    - Spring Cloud Fegin HTTP 请求调用远程服务

  • 相关阅读:
    Memcached安装
    BarCode条形码生成库
    WebAPI示例
    JDK安装目录分析-两个jre和三个lib
    JDK安装与环境变量配置
    【Selenium专题】高亮显示页面元素
    cannot be resolved to a type (Java)
    Java中获取运行代码的类名、方法名
    【Selenium专题】 FAQ_对象识别_Compound class names are not supported
    Html5新标签解释及用法
  • 原文地址:https://www.cnblogs.com/lilala-world/p/11311546.html
Copyright © 2020-2023  润新知