写点什么

将远程服务像本地一样调用?Feign 来帮你!

作者:XiaoLin_Java
  • 2021 年 12 月 01 日
  • 本文字数:1408 字

    阅读完需:约 5 分钟

将远程服务像本地一样调用?Feign来帮你!

📢博客主页:https://www.infoq.cn/profile/F7BF297568FAA8/publish

📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!

📢本文由 XiaoLin_Java 原创🙉

📢不要等待机会,而要创造机会。✨

🌈往期回顾

感谢阅读,希望能对你有所帮助,博文若有瑕疵请在评论区留言或在主页个人介绍中添加我私聊我,感谢每一位小伙伴不吝赐教。我是 XiaoLin,一个问啥啥都会,干啥啥不行的小男孩。

七、远程调用:Feign

7.1、Feign 简介

    Feign 是 Spring Cloud 提供的一个声明式的伪 Http 客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。


    Nacos 很好的兼容了 Feign, Feign 默认集成了 Ribbon, 所以在 Nacos 下使用 Fegin 默认就实现了负载均衡的效果。

7.2、Feign 实战

7.2.1、添加依赖

    在 shop-order-server 项目的 pom 文件加入 Fegin 的依赖。


<!--fegin组件--><dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
复制代码

7.2.2、添加注解

    我们需要在启动类上添加 @EnableFeignClients 注解,只有有了这个注解才会扫描。


@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients // 支持Feignpublic class ShopOrderServerApp {  public static void main(String[] args) {    SpringApplication.run(ShopOrderServerApp.class,args);  }
@Bean @LoadBalanced public RestTemplate getInstance(){ return new RestTemplate(); }}
复制代码

7.2.3、新增 ProductFeignApi

    在 Shop-order-server 中新增一个接口。


// name指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现@FeignClient(name = "product-service")public interface ProductFeignApi {  @RequestMapping("/product")  Product findById(@RequestParam("productId") Long productId);}
复制代码

7.2.4、修改 Controller

  @Autowired  ProductFeignApi productFeignApi;  @Override  public Order getById(Long oid, Long pid) {    Product product = productFeignApi.findById(pid);    Order order = orderDao.getOne(oid);    order.setPname(product.getPname());    return order;  }
复制代码

7.3、Feign 的重要属性

    我们可以配置超时属性。


feign:  client:    config:      default:        connectTimeout: 5000        readTimeout: 5000
复制代码

7.4、Feign 实现原理

  1. 启动后会会根据配置在启动类上的 @SpringBootApplication 去扫描贴了 @FeignClient 注解的类,并为其创建代理对象。

  2. 通过反射拿到代理类实现的接口:ProductFeignApi。

  3. 通过反射拿到接口上注解并且将注解中心的 name 属性拿出来:product-service。

  4. 通过反射拿到接口中的方法,并且拿到接口中方法上的注解 @RequestMapping,并且把值拿出来:/product。

  5. 将方法中参数注解中的值也拿出来,这个是我们传进来的参数:productId。

  6. 拼接出路径:http://product-service/product?productId=1。

  7. 根据本地的服务清单去找对应的节点信息。

  8. 根据你配置的 ribbon 负载均衡策略去选择节点。

  9. 将 product-service 替换成对应的节点信息和端口。

  10. 使用 RestTemplate 发送请求。

发布于: 4 小时前阅读数: 5
用户头像

XiaoLin_Java

关注

问啥啥都会,干啥啥不行。 2021.11.08 加入

问啥啥都会,干啥啥不行。CSDN原力作者,掘金优秀创作者。

评论

发布
暂无评论
将远程服务像本地一样调用?Feign来帮你!