本片文章主要记录的是有关于Feign的远程调用的一些相关问题
废话少说 先上例子
现有A B两个微服务 需要从 A 服务 调用 B的微服务
1 | A微服务主启动类 |
1 | A微服务controller |
1 | A微服务的远程调用接口 |
1 | B微服务Controller |
注意事项
远程调用的微服务接口 必须 和 被调用一致
除了没有方法体,毕竟是接口如果在Controller 头上面有 RequestMapping(“xx/xx”) 在远程调用接口 必须将路径补全XXXMapping(value = ” xx/xx/具体远程调用方法“)路径
如果远程调用微服务 没有开启熔断降级保护 可以直接在 远程调用接口加上 @Component 以及 @FeignClient接口
如果有 熔断降级保护类 熔断降级保护类 需要实现 远程调用接口 并且在熔断降级保护类上面添加 @Component注解 并且在 远程调用接口上的@FeignClient注解中 指定 熔断降级保护类
即 :@FeignClient(value = “CLOUD-PAYMENT-SERVICE”,fallback = PaymentFeignServiceImpl.class)
完整的案例可以移步github查看
https://github.com/youngDonkey98/SpringCloud-Alibaba-Demo
Feign
是什么
- Feign 是一个**声明式的web服务客户端** 只需要在创建一个接口并且在接口上加一个注解**@FeignClient**即可
- SpringCloud对Feign进行了封装 使其支持SpringMVC标准注解和HttpMessageConverters(Http消息转换器) Feign可以与Eureka和Ribbon组合使用 以支持 负载均衡
能干嘛
- 编写Java Http 客户端变得 更容易
加一个注释即可 - 使用Ribbon+RestTemplate时 利用RestTemplate对Http请求的封装处理 形成了一套模板化的调用方法 但是在实际开发中 由于对服务依赖的调用可能不止一处 往往一个接口会被多处调用 所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务端额调用 所以 Feign在此基础上做了进一步封装 由他来帮助我们定义和实现依赖服务接口的定义
Feign 集成了 Ribbon
利用Ribbon维护了Payment的服务列表信息 并且通过轮询实现了客户端的负载均衡 而与Ribbon不同的是 通过Feign只需要定义服务绑定接口且以声明式的方法 优雅而简单的实现了服务调用
Feign 和 OpenFeign 的区别
Feign 是 SpringCloud组件中 一个 轻量级RESTful 风格的 HTTP服务客户端
OpenFeign 是SpringCloud在Feign的基础上 支持了 SpringMVC的注解 OpenFeign的 @FeignClient 可以解析SpringMVC的 @RequestMapping 注解下的接口 并通过动态代理的方式 产生实现类 实现类中做负载均衡 并调用其他服务
Feign 内置了Ribbon 用来做客户端 负载均衡 去调用服务注册中心的服务
Feign 的使用方式 : 使用Feign的注解定义接口 调用这个接口 就可以调动服务注册中心的服务