zoukankan      html  css  js  c++  java
  • 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 请求调用远程服务

  • 相关阅读:
    leetcode 48. Rotate Image
    leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点) 、26/80. Remove Duplicates from Sorted ArrayI、II
    leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
    leetcode 58. Length of Last Word
    安卓操作的一些问题解决
    leetcode 378. Kth Smallest Element in a Sorted Matrix
    android studio Gradle Build速度加快方法
    禁用gridview,listview回弹或下拉悬停
    Android Studio找不到FragmentActivity类
    安卓获取ListView、GridView等滚动的距离(高度)
  • 原文地址:https://www.cnblogs.com/lilala-world/p/11311546.html
Copyright © 2011-2022 走看看