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

Open-Feign 你真的会用了吗?(openfeign调用)

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

引言

现在我们在微服务开发中,由于服务拆分,我们不可避免的会涉及一个服务需要调用另一个服务的RPC场景,对于这一场景的实现有很多方案:我们可以自己封装httpclient,也可以使用RestTemplate或者Dubbo,以及我本文要讲的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);
    }
}

3.以接口的方式构建我们需要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);
}

4.注入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方法之中,期待后续我们一起探索。

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

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

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

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

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

vue项目-父页面数据变化使子页面更新的几种情况

当操作页面时候,特别是增删改操作之后,数据会有所改变,这个时候我们希望组件中的数据要和最新数据一致,就需要重新更新渲染。以下是针对几种不同情况下方式:一.子页面调用接口后重新渲染1.使用ref方式父组件中用ref=“xxx” 来声明子组件,然后通过在父组件值改变的地方来调用子组件中的方法this.$...

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

Java教程:gitlab-使用入门

1 导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作GitLab简介GitLab环境搭建GitLab基本使用(组、权限、用户、项目)2 GitLab简介GitLab是整个DevOps生命周期...

理解virt、res、shr之间的关系(linux系统篇)

前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

Gemini应用在Android上广泛推出2.0闪电模式切换器

#头条精品计划# 快速导读谷歌(搜索)应用的测试频道在安卓设备的双子应用中推出了2.0闪电实验功能,现已向稳定用户开放。双子应用通过谷歌应用运行,目前推出的15.50版本中,用户可通过模型选择器体验不同选项,包括1.5专业版、1.5闪电版和2.0闪电实验版。2.0闪电实验模型提供了更快的响应速度和优...