最近在写中台,就是各功能板块各司其职,最后根据须要整合在一块儿搭建成一个完整的系统,有了解的小伙伴都知道,这里用的其实就是微服务。html
过程当中,各工程模块之间有大量的相互链接调用的部分。这种场景最先的作法是借用代理实现,后来Spring Cloud 封装了一个Spring Cloud Rbbon,能够利用RestTemplate 的请求拦截来实现对依赖服务的接口调用。项目中对服务依赖的调用每每会有多处,因此一般会针对各个微服务自行封装一些客户端来包装这些依赖服务的调用,故几乎每个调用都是简单的模块化内容。git
而Spring Cloud Feign 作了进一步的封装,在Fegin的基础上,咱们只须要建立一个接口并使用 @FeignClient 注解来配置,便可完成对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时自行封装服务调用客户端的开发量。 github
一、准备spring
1)启动 Eureka服务注册中心;json
2)建立两个微服务A(服务提供者)、B(服务消费者);app
3) A服务的 application.name = "A-service", B 服务 application.name = "B-service";负载均衡
4)A 服务提供服务接口 A1,B 服务的 B1 功能模块中调须要用 A1;maven
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()方法;微服务
二、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()方法的调用,整个过程简单的像是调用了服务内部的方法。
一、若是 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{ }
二、因为在 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 基本的使用过程已介绍完毕~~~~回去继续撸代码。
最近在看我“现男朋友”强推的《罗生门》,多是我这种理科女不太适合这种隐喻性太强的小说吧,看的不知所谓~~道行仍是不够哇!!