深入微服务-SpringCloud调用组件Feign

深入微服务-SpringCloud调用组件Feign,第1张

本系列带着大家深入微服务 Spring体系的各个框架的底层原理。上一篇文章介绍了SpringBoot自动装配原理,本节将带着大家熟悉下SpringCloud体系的调用组件Feign

相关配置解释:

1)针对feign配置

2)通用配置

可以使用feign的拦截器功能实现接口的验证、鉴权功能

1)Basic认证

2)自定义拦截器实现

需要实现接口RequestInterceptor

21)请求头放上TOKEN认证信息

22)将配置添加到feign

Feign使用过程中需要打印日志可以实现Fegin的Logger功能,可以打印>

1跟踪抛出异常的堆栈,发现在对返回结果的json解析中抛出异常

2为什么会解析json失败呢,我们单独调用feign对应的接口是正常的,json也是正常可以解析的

3难道feign的处理过返回的内容,又去跟了下fegin处理过程发现从response获取到流并没有任何异常,难道是出在了源头?但是源头又没有任何异常,此时思绪已经混乱,试着在google上查找有没有相关的问题,没想到在feign的github上找到类似问题 >

首先看Contract这个接口类中只有一个parseAndValidatateMetadata方法,其余两个都是子类,我们可以打个断点逐步跟一下。

其中BaseContract这个类主要是做数据验证的功能

断点进来之后我们可以看到,实例中是一个IService的类,然后下面有两个checkState方法,checkState方法是做个验证,如果第一个参数true则走过,如果是false则返回异常信息。

其中targetTypegetTypeParameters()是获取类的泛型,在Feign中是不允许有泛型的,如果有则返回Parameterized types unsupported class name的异常

第二个targetTypegetInterfaces()length <= 1的意思就是这个类只能做单继承,否则继续抛出异常。

这个验证如果没问题就尽心下一个验证了:

如果这个类继承了一个类,那么我们就看下继承的类是否又继承了类,如果又继承了,则抛出错误: 该类仅支持单层次的继承。

这个方法就是判断类不能是个对象,也不能有static方法,下面还有个UtilisDefault(method)方法:

这里是判断方法不能仅仅是个pulic方法,且必须是个接口才行,看不懂的可以参见帖子:

>

在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务映射,通过 健康 检查接口判断实例 健康 状态,然后直接使用 OpenFeign 生成对应域名的 Feign Client。Spring Cloud 生态中,对 OpenFeign 进行了封装,其中的 Feign Client 的各个组件,也是做了一定的定制化,可以实现在 OpenFeign Client 中集成服务发现与负载均衡。在此基础上,我们还结合了 Resilience4J 组件,实现了微服务实例级别的线程隔离,微服务方法级别的断路器以及重试。

我们先来分析下 Spring Cloud OpenFeign

Spring Cloud 中的任何组件,都是基于 Spring Boot 而实现的。由于 Spring Boot 中已经有了 >

原来像这种放在Body里传过来的get方式 必须feign调用的时候

@GetMapping("/demofeigngetresbody")

public  Resultdemofeigngetresbody(TestDemo testDemo){

要用 @RequestParam 把每一个参数都写出来才算get不然默认就是POST找不到方法了

@FeignClient("user-main")publicinterface UserFeignClient {

    @GetMapping("/query_user")

    Result> getUserList(@RequestParam Integer age, @RequestParam String name, @RequestParam(required =false) String job);

}

现在最重点的来了

关于feign的请求方式 下面的一定要注意

feign消费服务时,以GET方式请求的条件:

如果想让服务消费者采用GET方式调用服务提供者,那么需要:

1服务消费者这边feign调用时,在所有参数前加上@RequestParam注解。

2服务消费者这边feign调用时,指明为GET方式(注:如果不指明method,那么在条件1满足的情况下,采用的是默认的GET方式)。

注:这里条件1和条件2,是“且”的关系(都满足时,才为GET)。

feign消费服务时,以POST方式请求的条件:

如果想让服务消费者采用POST方式调用服务提供者,那么只需要:

1服务消费者这边feign调用时,在所有参数前加上@RequestParam注解,并指明feign消费服务的方式为POST。

2服务消费者这边feign调用时,有且只有一个参数前为@RequestBody或什么也没有(如果有多个参数,那么其余参数前必须有@RequestParam)。

注:这里条件1和条件2,是“或”的关系(当至少一个满足时,即为POST)。

注:在服务消费者中,使用feign消费服务时,如果参数前什么也不写,那么默认是由@RequestBody指明的。

即:只要不满足GET方式请求,那么POST方式请求是一定支持的。

链接:>

FeignContext是用于创建和管理Feign Client所依赖的各种类的工厂类。

FeignContext的继承关系如下图所示:

每个Feign Client会关联一个AnnotationConfigApplicationContext实例,用于存取Feign Client所依赖的各种类的实例。并以 FeignContext-{feign-client-name} 作为key。

configurations中保存了每个Feign Client所依赖的配置类,在创建AnnotationConfigApplicationContext的过程中,这些配置类会被注入到Bean工厂中。

Feign Client所依赖的类包括:

Retryer 类用于处理当Feign Client在请求过程中时捕获到 RetryableException 时所要采取的动作。

它有一个默认的实现类:Default,以及一个默认实例:NEVER_RETRY。

Default:可以指定重试周期和最大重试次数;

NEVER_RETRY:不重试。

从 Feign Client所依赖的类 中我们已经知道实例化 Feign Client 过程中所依赖的一些配置。feign支持两种方式来完成 Feign Client 的配置。

可以在spring配置文件中指定以 feignclient 为前缀的配置项来配置Feign Client,这些配置项包括:

参考: Feign支持>

以上就是关于深入微服务-SpringCloud调用组件Feign全部的内容,包括:深入微服务-SpringCloud调用组件Feign、90 SpringCloud 解决分布式事务--lcn解决分布式事务、Feign踩坑记录:JSON parse error等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10155312.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存