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 基本的使用过程已介绍完毕~~~~回去继续撸代码。
最近在看我“现男友”强推的《罗生门》,可能是我这种理科女不太适合这种隐喻性太强的小说吧,看的不知所谓~~道行还是不够哇!!