当前位置:首页 > 技术分析 > 正文内容

Open-Feign你真的会用了吗?(openfeign是干嘛的)

ruisui883个月前 (02-03)技术分析21

引言

现在我们在微服务开发中,由于服务拆分,我们不可避免的会涉及一个服务需要调用另一个服务的RPC场景,对于这一场景的实现有很多方案:我们可以自己封装httpclient,也可以使用RestTemplate或者Dubbo,以及我本文要讲的Open-Feign,这些都可以方便我们来完成远程调用,笔者此次研究的是Open-Feign的实现逻辑,希望通过这一系列文章来和大家一起学习Open-Feign。

一、案例

首先,我们简单的实现一个Open-Feign的使用案例: 现在假设我们有这么一个场景:

我们有两个服务:认证权限服务auth-service,还有一个应用服务app-service,应用服务登入的时候需要调用认证权限服务来进行账号认证和权限校验

auth-service中有一个认证接口:

@RestController
@RequestMapping("/api)
public class AuthController {

    @GetMapping("/auth")
    public Boolean auth(@RequestBody AuthRequest authRequest){
    // 认证逻辑 ...
        return true;
    }

而由于我们在app-service中需要去调用auth-service的auth接口,所以我们可以使用open-feign来帮我们完成RPC的过程,我们可以这么来实现:

使用open-feign功能的几个步骤:

  1. 我们先需要引入maven依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.使用@EnableFeignClients来启用Open-Feign的能力,比如可以在app-service启动项AppServiceStater上标注这个注解:

@EnableFeignClients
@SpringBootApplication
public class AppServiceStater {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderAppStater.class, args);
    }
  1. 以接口的方式构建我们需要RPC操作的远程接口配置

比如在我们的场景下,我们需要操作认证服务auth-service的/api/auth接口,那么我们可以如下操作:

    @FeignClient(name = "auth-service",url = "http://127.0.0.1:8080")
    public interface AuthServiceRemoteClient {

    @GetMapping(value = "/api/auth")
    Boolean auth(@RequestBody AuthRequest);
    }
  1. 注入3中写的接口并调用方法
@RestController
public class NacosController {

    @Autowired
    AuthServiceRemoteClient authServiceRemoteClient;

    @GetMapping("/app/login")
    public Boolean login(@RequestBody LoginRequest loginRequest){
        // 转换为AuthRequest auth
        AuthRequest authRequest = Convert(loginRequest);
        return authServiceRemoteClient.auth(authRequest);
    }

完成以上几个步骤后,当我们请求app-service的login接口的时候,内部就会调用auth-service的auth接口进行认证,整个过程还是很丝滑的。

二、大的思想

看完上面的案例后,相信你应该很想知道整个Open-Feign的实现是怎么样的,再了解细节之前,我们先站在上帝视角来看下这个大的思想:

  1. 构建过程

当项目启动的时候,Open-Feign会扫描指定的标注了@FeifnClient的注解,根据上面案例我们知道@FeignClient是标注在接口之上的,扫描到这个接口后,Open-Feign会通过JDK动态代理的方式为这个接口生成代理对象;而接口中的每一个方法都是对应了一个远程的API接口,如何在调用指定的方法就可以调到远程的指定接口呢?

这是Open-Feign在解析接口时,接口中的每个方法会被解析成MethodMetadata信息,然后再转换成MethodHandler,最终解析完所有的方法会构成一个Map<Method,MethodHandler>对象,而这个对象会作为InvocationHandler的一个属性而存在,我们都知道InvocationHandler是JDK动态代理的一个核心组件,所有被代理的对象方法调用都会走到InvocationHandler的invoke方法逻辑,下图展示了整个动态代理构建的过程:

2. 调用执行过程

当已经构建好了所有的@FeignClient标注接口的代理对象时,我们调用指定的方法时,会从Map<Method,MethodHandler>对象对象中根据Method来获取指定的MethodHandler对象,然后执行其invoke方法进行真正的RPC逻辑。

三、总结

本章我们仅仅描述了Open-Feign的使用案例,以及整个JDK动态代理的实现,是在一个很高的层面来看整个Open-Feign的实现原理。后面我们解析整个RPC请求的构建、执行和响应返回的整个详细逻辑,而这一切正是包含在MethodHandler对象的invoke方法之中,期待后续我们一起探索。

下一篇传送门:窥探Open-Feign的核心原理

感谢您花时间阅读这篇文章!如果觉得有所收获,请关注我的更新,给个喜欢和分享,如果有任何疑惑,可以评论区交流。您的支持是我写作的最大动力!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1165.html

标签: feign 使用
分享给朋友:

“Open-Feign你真的会用了吗?(openfeign是干嘛的)” 的相关文章

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。那么组件间如何通信,也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信。转载链接:https://www.jia...

学会使用Vue JSX,一车老干妈都是你的

作者:子君转发链接:https://mp.weixin.qq.com/s/eAOivpHeowLShfwPfW8-BA?君自前端来,应知前端事。需求时时变,bug改不完。?连续几篇文章,每篇都有女神,被老铁给吐槽了,今天不提了女神了,反正女神都是别人的(扎心了)。这两天小编看了腾讯与老干妈的事情,晚...

Git 分支管理策略与工作流程

(预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。看完这篇文章后,涉及GIT的工作中就会减少因为规范问题导致工作出错,当然如果你现在暂时还未有合...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...

Vue中路由router的基本使用

??本文开始我们来给大家介绍在Vue中非常重要的一个内容,就是路由Router什么是路由后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特...