百度
360搜索
搜狗搜索

springcloud feign,spring cloud openFeign传参的一些总结(有错,待更新)详细介绍

本文目录一览: Springcloud feign与openfeign

1、Feign与OpenFeign的区别
1)Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务。
Feign的依赖

1

2

org.springframework.cloud

3

spring-cloud-starter-feign

4

2)OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中.
OpenFeign的依赖

1

2

org.springframework.cloud

3

spring-cloud-starter-openfeign

4

  
说明:
springcloud F 及F版本以上 springboot 2.0 以上基本上使用openfeign,openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用openfeign ,2018年以前的项目在使用feign

SpringCloud + Zookeeper + Feign整合及Feign原理

Spring Cloud 与 Zookeeper的整合只需要添加相关的starter依赖和增加相关注解即可完成。

pom.xml 如下:

bootstrap.yml 如下:

最后开启服务的注册与发现

service 和controller实现

笔者加入了swagger,如果需要只需加入如下依赖和配置:

至此,spring cloud与zookeeper的整合就完成了,调用结果如下:

为了测试与Feign的整合,再构建一个消费者:与上述构建的过程类似。

pom.xml 增加spring-cloud-starter-openfeign依赖

bootstrap.yaml:

开启服务注册与发现,@EnableFeignClients注解注册FeignClient

@FeignClient注册声明定义FeignClient,笔者以两种方式定义了两个FeignClient:

1.通过请求路径定义FeignClient

2.通过生产者(即上述构建的helloService)暴露出来的接口定义FeignClient

controller 测试:

测试结果如下:

知道了如何将SpringCloud, Zookeeper 和Feign进行整合,我们知道了怎么使用,更重要的是要知道里面的原理,做到知其然更要知其所以然。

通过上述对整合过程的描述中可以发现,@EnableFeignClients和@FeignClient两个注解是将Feign整合进Spring Cloud的重要组成部分,因此,从这两个注解入手来了解Feign。

@EnableFeignClients注解通过@Import引入了FeignClientsRegistrar进行feign客户端的注册, 同时FeignClientsRegistrar通过实现ImportBeanDefinitionRegistrar来将bean注册spring容器中:

至此,我们知道了通过@EnableFeignClients和@FeignClient两个注解以及其相关属性,在服务启动时,将每个feign client 以及其对应的配置和每个客户端通用的配置以bean的方式注册完到spring容器中。

当使用@Autowired注解自动注入FeignClient时,Spring容器会使用注册FeignClient用到的FeignClientFactoryBean为其生成FeignClient实例。

默认使用的targeter是HystrixTargeter,根据builder的类型设置不同的属性,并生产Feign client

从上面的分析可以得出,当服务启动时,通过@EnableFeignClients注解,启动对标注了@FeignClient注解的类进行扫描和注册,通过FeignClientFactoryBean将FeignClient注册到Spring容器中。当使用@Autowired注解进行自动注入时,注册到Spring容器中FeignClient会以动态代理的形式注入,这些动态代理中包含了接口方法的methodHandler用以处理调用转发。

Spring Cloud Feign使用详解

?通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌握了开发微服务应用时,两个重要武器,学会了如何在微服务架构中实现客户端负载均衡的服务调用以及如何通过断路器来保护我们的微服务应用。这两者将被作为基础工具类框架广泛地应用在各个微服务的实现中,不仅包括我们自身的业务类微服务,也包括一些基础设施类微服务(比如网关)。此外,在实践过程中,我们会发现对这两个框架的使用几乎是同时出现的。既然如此,那么是否有更高层次的封装来整合这两个基础工具以简化开发呢?本章我们即将介绍的Spring Cloud Ribbon与Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。
?我们在使用Spring Cloud Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模版化的调用方法。在之前的例子中,我们只是简单介绍了RestTemplate调用对实现,但是在实际开发中,由于对服务依赖对调用可能不止于一处,往往一个接口会被多处调用,所以我们通常都会针对各个微服务自行封装一些客户端累来包装这些依赖服务的调用。这个时候我们会发现,由于RestTemplate的封装,几乎每一个调用都是简单的模版化内容。综合上述这些情况,Spring Cloud Fegin在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解。同时,为了适应Spring的广大用户,它在Netflix Feign的基础上扩展了对Spring MVC的注解支持。这对于习惯于Spring MVC的开发者来说,无疑是一个好消息,你我这样可以大大减少学习适应它的成本。另外,对于Feign自身的一些主要组件,比如编码器和解码器等,它也以可插拔的方式提供,在有需求等时候我们以方便扩张和替换它们。
?在本节中,我们将通过一个简单示例来展示Spring Cloud Feign在服务客户端定义所带来的便利。下面等示例将继续使用之前我们实现等hello-service服务,这里我们会通过Spring Cloud Feign提供的声明式服务绑定功能来实现对该服务接口的调用。
??首先,创建一个Spring Boot基础工程,取名为kyle-service-feign,并在pom.xml中引入spring-cloud-starter-eureka和spring-cloud-starter-feign依赖,具体内容如下所示。
??创建应用主类Application,并通过@EnableFeignClients注解开启Spring Cloud Feign的支持功能。
??定义HelloServiceFeign,接口@FeignClient注解指定服务名来绑定服务,然后再使用Spring MVC的注解来绑定具体该服务提供的REST接口。
??接着,创建一个RestClientController来实现对Feign客户端的调用。使用@Autowired直接注入上面定义的HelloServiceFeign实例,并在postPerson函数中调用这个绑定了hello-service服务接口的客户端来向该服务发起/hello接口的调用。
??最后,同Ribbon实现的服务消费者一样,需要在application.properties中指定服务注册中心,并定义自身的服务名为feign-service-provider,为了方便本地调试与之前的Ribbon消费者区分,端口使用8868。

?发送几次GET请求到 http://localhost:8868/client/getHost?name=kyle ,可以得到如之前Ribbon实现时一样到效果,正确返回 hi, kyle! i from 10.166.37.142:8877 。依然是利用Ribbon维护了针对HELLO-SERVICE-PROVIDER的服务列表信息,并且通过轮询实现了客户端负载均衡。而与Ribbon不同到是,通过Feign只需定义服务绑定接口,以声明式的方法,优雅而简单地实现了服务调用。
?现实系统中的各种业务接口要比上一节复杂得多,我们会再HTTP的各个位置传入各种不同类型的参数,并且再返回响应的时候也可能是一个复杂的对象结构。再本节中,我们将详细介绍Feign中的不同形式参数的绑定方法。
?再开始介绍Spring Cloud Feign的参数绑定之前,我们先扩张以下服务提供者hello-service-provider。增加下面这些接口,其中包含带有Request参数的请求、带有Header信息的请求、带有RequestBody的请求以及请求响应体中是一个对象的请求。
?在完成了对hello-service-provider的改造之后,下面我们开始在快速入门示例的kyle-service-feign应用中实现这些新增的绑定。
?这里一定要注意,再定义各参数绑定时,@RequestParam、@RequestHeader等可以指定参数名称的主角,它们的value千万不能少。在Spring MVC程序中,这些注解会根据参数名来作为默认值,但是在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出==IllegalStateException==异常,value属性不能为空。
?在完成上述改造之后,启动服务注册中心、两个hello-service-privider服务以及我们改造的kyle-service-feign。通过发送GET请求到== http://localhost:8868/feign/head/getHost?name=kyle&age=18== ,通过发送POST请求到== http://localhost:8868/feign/project/postPerson== ,请求触发HelloServiceFeign对新增接口的调用。最终,我们会获得如下图的结果,代表接口绑定和调试成功。

?由于Spring Cloud Feign的客户端负载均衡是通过Spring Cloud Ribbon实现的,所以我们可以直接配置Ribbon客户端的方式来自定义各个服务客户端调用参数。那么我们如何使用Spring Cloud Feign的工程中使用Ribbon的配置呢?
?全局配置的方法非常简单,我们可以直接使用ribbon.

=

的方式来设置ribbon的各项默认参数。如下:

?大多数情况下,我们对于服务调用的超时时间可能会根据实际服务的特性做一些调整,所以仅仅进行个性化配置的方式与使用Spring Cloud Ribbon时的配置方式是意义的,都采用

.ribbon.key=value的格式进行设置。但是,这里就有一个疑问了,

所指代的Ribbon客户端在那里呢?

?回想一下,在定义Feign客户端的时候,我们使用了@FeignClient注解。在初始化过程中,Spring Cloud Feign会根据该注解的name属性或value属性指定的服务名,自动创建一个同名的Ribbon客户端。如下:

?Spring Cloud Ribbon默认负载均衡策略是轮询策略,不过该不一定满足我们的需要。Ribbon一共提供了7种负载均衡策略,如果我们需要ZoneAvoidanceRule,首先要在application.properties文件中添加配置,如下所示:

?不过,只是添加了如上配置,还无法实现负载均衡策略的更改。我们还需要实例化该策略,可以在应用主类中直接加入IRule实例的创建,如下:

?想要深入了解Ribbon的原理,或者想详细了解7种负载均衡策略的,可以参考我另一篇博客 《Ribbon详解》 ,我会在博客最下面给出链接。

?从前两节来看在Spring Boot工程中使用Feign,非常的便利。不过实际生产中,在微服务的初期只能从次要系统开始进行改造,可能很多系统由于历史原因仍然是非Spring Boot的工程,然后这些系统如何使用微服务?如何使用注册中心?如何进行负载均衡呢?

???首先我们在kyle-service-feign创建调用接口OldSystemPostFeign和OldSystemGetFeign,然后使用feign注解提供的相关注解,包含@RequestLine、@Param、@HeaderParam、@Headers等,主要提供了请求方法、请求参数、头信息参数等操作。

???我们需要脱离Spring Boot和Spring Cloud的支持,使用feign原生的一些东西。在进行Feign封装之前我们需要一些额外的组件,比如编码器。新增组件依赖如下所示:

???我们需要一个feign-clientproperties文件,来进行ribbon相关的参数配置,配置如下:

???到目前为止,相关要素已经准备好了,接下来需要feign和ribbon的封装了。我们需要创建OldSystemFeignClientConfiguration类,作用是加载feign-client.properties文件,并创建一个附带负载均衡器的RibbonClient,然后封装出一个附带Jackson编解码器的FeignClient,如下所示:

???然后我需要一个测试类FeignClientTest,测试以上3个接口,然后将结果输出到控台如下所示:

???在完成上述改造之后,启动测试类FeignClientTest,获得如下的结果,说明调用使用了负载均衡。

?细心的同学会发现,非Spring Boot使用feign调用根本没有使用到注册中心的服务发现。在此我提供一个思路,我们可以调用代理微服务,再由代理进行服务发现。那么这个代理服务应该具备哪些功能和作用呢?我将会在下一篇博客详细讲述Netflix公司的API网关组件zuul,它承担路由转发,拦截过滤,流量控制等功能。

?? 第一次请求失败

?原因:由于spring的懒加载机制导致大量的类只有在真正使用的才会真正创建,由于默认的熔断超时时间(1秒)过短,导致第一次请求很容易失败,特别互相依赖复杂的时候。

?解决方法:提升熔断超时时间和ribbon超时时间,配置如下:

?? Feign的Http Client

?Feign在默认情况下使用的是JDK原生URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection。我们可以用Apache的HTTP Client替换Feign原始的http client,从而获取连接池、超时时间等与性能息息相关的控制能力。Spring Cloud从Brixtion.SR5版本开始支持这种替换,首先在项目中声明Apcahe HTTP Client和feign-httpclient依赖,然后在application.properties中添加:

?? 如何实现在feign请求之前进行操作

?feign组件提供了请求操作接口RequestInterceptor,实现之后对apply函数进行重写就能对request进行修改,包括header和body操作。

?? 请求压缩 ?Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。我们只需通过下面两个参数设置,就能开启请求与响应的压缩功能:

?同时,我们还能对请求压缩做一些更细致的设置,比如下面的配置内容指定了压缩的请求数据类型,并设置了压缩的大小下限,只有超过这个大小的请求才会对其进行压缩。

?上述配置的feign.compression.request.nime-types和feign.compression.requestmin-request-size均为默认值。

?? 日志配置

?Spring Cloud Feign在构建被@FeignClient注解修饰的服务客户端时,会为每一个客户端都创建一个feign的请求细节。可以在 application.properties 文件中使用logging.level.

的参数配置格式来开启指定Feign客户端的DEBUG日志,其中

为Feign客户端定义捷克队完整路径,比如针对本博文中我们实现的HelloServiceFeign可以如下配置开启:

?但是,只是添加了如上配置,还无法实现对DEBUG日志的输出。这时由于Feign客户端默认对Logger.Level对象定义为NONE级别,该界别不会记录任何Feign调用过程中对信息,所以我们需要调整它对级别,针对全局对日志级别,可以在应用主类中直接假如Logger.Level的Bean创建,具体如下:

?在调整日志级别为FULL之后,我们可以再访问第一节的 http://localhost:8868/feign/postPerson?name=kyle 接口,这是我们在kyle-service-feign的控制台中可以看到类似下面的请求详细的日志:

?对于Feign的Logger级别主要有下面4类,可根据实际需要进行调整使用。

?? 负载均衡异常

?当我们只是对一个微服务进行调用的时候,Ribbon提供的支持好像没什么问题。不过在我们进行多个微服务调用时会产生异常,这也是大多数人忽略的。

? 情景描述 :2个应用B和C,在A中使用feign client调用B和C;测试结果,假如先调用B,再调用C都是有效的,但是再调用B就是无效的;(B,C先后顺序改变,都会产生这个bug) ? 解决方法 :在主启动类使用注解@RibbonClient,进行RibbonClient配置,如下所示:

?看不懂是吗?不要紧,我下面详细讲解一下,先看一下我们之前的非Spring Boot工程中封装FeignClient:

?OldSystemPostFeign只是一个接口,Feign为什么需要使用接口来调用远程接口?原因就是使用JDK动态代理,我们可以去看Feign是如何进行处理。

SpringCloud远程调用-OpenFeign

OpenFeign是SpringCloud提供的一个声明式客户端组件,可以通过注解和接口的组合实现服务的远程接口调用,并且与Eureka和Ribbon组合使用能够实现负载均衡的效果

1.在pom.xml中引入依赖

2.在主启动类上添加 @EnableFeignClients 注解,开启Feign支持

3.创建feignClient接口,并添加注解(指定需要调用的服务和接口)

4.在Controller中注入后,发起远程调用

测试:访问 http://localhost:9001/consumer/port

OpenFeign远程调用的默认等待时长为1秒,超时后报错

1.在消费者服务的application.yml文件中设置超时时间

2.在服务提供者端的接口处设置睡眠时间

3.在服务消费者端打印时间

重启后访问: http://localhost:9001/consumer/port ,发现等待一段时间后,页面获取到端口值,访问成功,说明时间控制生效
控制台打印信息如下:

OpenFeign提供了日志打印功能,能够对feign借口的调用情况进行监控和输出
Fegin的日志级别:

2.在yml中指定显示哪一个接口的信息

访问接口,可以看到请求你的详细信息

SpringCloud系列——Feign 服务调用

  前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用。

  GitHub地址:https://github.com/OpenFeign/feign

  官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-openfeign/2.1.0.RC2/single/spring-cloud-openfeign.html

  提供者除了要在注册中心注册之外,不需要引入其他东西,注意以下几点即可:

  1、经测试,默认情况下,feign只能通过@RequestBody传对象参数

  2、接参只能出现一个复杂对象,例:public Result

list(@RequestBody UserVo entityVo) { ... }

  3、提供者如果又要向其他消费者提供服务,又要向浏览器提供服务,建议保持原先的Controller,新建一个专门给消费者的Controller

  测试Controller接口

  消费者maven引入jar

阅读更多 >>>  spring mvc执行过程,spring拦截器配置文件中与的区别,还有三个方法是怎么一回事,还有spring连接jd

  配置文件

  对日期的解析,消费者要跟提供者一致,不然会报json解析错误

  服务调用

  1、springdatejpa 应用名称,是服务提供者在eureka注册的名字,Feign会从注册中心获取实例

  2、如果不想启动eureka服务,直连本地开发:@FeignClient(name = "springdatejpa", path = "/user/",url = "http://localhost:10086"),或者无eureka,调用第三方服务,关闭eureka客户端      (eureka.client.enabled=false),url直接指定第三方服务地址,path指定路径,接口的方法指定接口

  3、如果使用@RequestMapping,最好指定调用方式

  4、消费者的返回值必须与提供者的返回值一致,参数对象也要一致

  5、2019-05-21补充:如需进行容错处理(服务提供者发生异常),则需要配置fallback,如果需要获取到报错信息,则要配置fallbackFactory ,例:

  Feign接口

  更多@FeignClient注解参数配置,请参阅官方文档

  Controller层

  启动类

  启动类加入注解:@EnableFeignClients

  成功注册两个服务

  成功调用

  1、启动时报了个SQL错误

  解决:配置文件连接数据时指定serverTimezone=GMT%2B8

  2、当我将之前搭好的一个springboot-springdata-jpa整合项目在eureka注册时出现了一个报错

  然后在网上查了下说是因为springboot版本问题(请戳:http://www.cnblogs.com/hbbbs/articles/8444013.html),之前这个项目用的是2.0.1.RELEASE,现在要在eureka注册,pom引入了就出现了上面的报错

  解决:升级了springboot版本,2.1.0,项目正常启动

   2019-10-17补充 :Feign设置header请求头

  方法1,mapping的headers属性,单一设置

  方法2,自定义FeignInterceptor,全局设置

  这样就可以设置cookie,传递token等自定义值

  常见场景1

  通常我们一个服务web层、svc层、dao层,但有时候也会将拆分成两个服务:

  web服务提供静态资源、页面以及controller控制器控制跳转,数据通过java调用svc服务获取;

  svc服务,进行操作数据库以及业务逻辑处理,同时提供接口给web服务调用;

  特殊情况下我们想svc服务的接口也做登录校验,所有接口(除了登录请求接口)都有做登录校验判断,未登录的无权访问,这时候就需要做sessionId传递,将web服务的sessionId通过Feign调用时传递到svc服务

  web服务

  注:登录成功后用sessionId作为key,登录用户的id作为value,保存到redis缓存中

  登录拦截器

  自定义FeignInterceptor

  svc服务

  会话期的sessionId,关闭浏览器后就失效了,所以就会退出浏览器后就需要重新登陆,有些情况我们并不想这样,我们想实现七天免登陆,这时候就需要自定义token,并且存放在cookie

  登陆拦截器

  登陆成功,设置cookie

  推出登陆,销毁cookie

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springCloud

  码云:https://gitee.com/huanzi-qch/springCloud

作者:huanzi-qch

出处:https://www.cnblogs.com/huanzi-qch

一文详解Spring Cloud Feign重试机制

Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的。Feign使用的是Spring Retry组件,需要引入依赖才能启用。
eureka-client 是自己的serverId, MaxAutoRetries 同一台服务器上的最大重试次数(不包括第一次尝试), MaxAutoRetriesNextServer 要重试的下一个服务器的最大数量(不包括第一个服务器), retryableStatusCodes 可以根据接口返回的状态码判断是否重试其他服务, OkToRetryOnAllOperations 只对所有的超时请求重试
注意 : Ribbon的重试机制只有对GET请求或者设置了OkToRetryOnAllOperations生效 详情请查看源码:
Feign对返回状态码做了重试判断RetryableFeignLoadBalancer
重试机制用的是Spring Retry组件当抛出异常时进行重试!
GET请求指的是feign client 请求其他client时声明的那个interface中mapping注解类型,RequestMapping不设置method默认为GET请求

Spring Cloud Feign实现自定义复杂对象传参

现我们服务提供端有如下的根据用户查询条件获取满足条件的用户列表controller接口
我们在使用Feign构建远程服务请求客户端的时候,会发现Feign官方版本是不支持GET请求传递自定义的对象,当我们的请求参数很多的时候,我们只能选择以下两种方式:
那么我们希望能有一种方式 保持跟controller完全一致只需要传递自定义的对象 ,既让服务提供端开发人员爽,也让服务消费端开发人员爽,两全其美。既然Feign官方不支持,那我们就自己动手撸源码,自己来实现。
对比之前的@RequestParam和Map用法,方法参数变少了,User对象复用了,对服务提供端和消费端都更方便了
最近在调研spring cloud版本升级,发现新版的Feign也支持了自定义对象传参,实现方式大同小异

spring cloud openFeign传参的一些总结(有错,待更新)

spring cloud openFeign 的客户端 ,即调用方,在启动类中一定要加上 @EnableFeignClients 这个注解,service接口上的@service注解和@FeignClient("微服务名") 都写在一起,如果不加,会报@service 没初始化这个service接口。

openFeign 默认用的是jdk的httpUrlConnection,没有连接池,http连接没复用,性能不太好,我们可以集成 httpClient 或者 okHttp,二选一,不用指定版本号,他会自动根据你的spring cloud 的openfeign 解析出来。

错误如下:

参考:
SpringCloud中利用FeignClient发送请求时参数的传递和返回值

feign请求返回值反序列LocalDateTime异常记录

openfeign get请求参数dto包含LocalDateTime的处理

SpringCloud升级之路2020.0.x版-29.SC OpenFeign 的解析(2)

在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务映射,通过 健康 检查接口判断实例 健康 状态,然后直接使用 OpenFeign 生成对应域名的 Feign Client。Spring Cloud 生态中,对 OpenFeign 进行了封装,其中的 Feign Client 的各个组件,也是做了一定的定制化,可以实现在 OpenFeign Client 中集成服务发现与负载均衡。在此基础上,我们还结合了 Resilience4J 组件,实现了微服务实例级别的线程隔离,微服务方法级别的断路器以及重试。
我们先来分析下 Spring Cloud OpenFeign
Spring Cloud 中的任何组件,都是基于 Spring Boot 而实现的。由于 Spring Boot 中已经有了 HTTP 编码解码器,就可以不用单独给 OpenFeign 单独再实现 HTTP 编码解码器了,而是考虑将 OpenFeign 的编码解码器接口用 Spring Boot 的 HTTP 编码解码器实现。
在 FeignClientsConfiguration 中,提供了默认的实现:
通过源码可以看出,默认的 Decoder 是经过几层包装的 Decoder,分别包括:
传入 SpringDecoder 的 HttpMessageConverters 对象,是 spring-web 的所有 HttpMessageConverter 集合。HttpMessageConverter 是 spring-web 中对于 HTTP 请求和响应的 body 进行编码解码的工具。其接口结构是:
spring boot 内置了很多 HttpMessageConverter,我们也可以实现自己的 HttpMessageConverter,去实现我们自定义 MediaType,例如我们这里定义一个 :
之后,与前面类似,将其配置到 spring boot 兼容 MVC 配置中:
编写 Controller,测试:
使用 postman 类似的工具,指定 HTTP 请求头:
Body 是:
请求后,就会走到 CustomizedHttpMessageConverter 的 read 解析成 Student 对象,之后响应的 student 也会被 CustomizedHttpMessageConverter 的 write 写入响应 Body
由此可见, 由于 SpringEncoder 的存在,我们可以复用 Spring 内置的 HttpMessageConverter,同时也能扩展自定义我们自己的 HttpMessageConverter,非常方便 。
ResponseEntityDecoder 的代码比较简单,实现的效果就是解码的时候,忽略 HttpEntity 这个 spring-web 对于 HTTP 响应的包装类:
这个其实为了和 RestTemplate 的响应兼容,RestTemplate 可以返回 HttpEntity,但是底层 HTTP 请求返回的 body 其实并没有包装这个类型。
同理,JDK 中的 Optional 包装类,也需要做同样的事情,这个就是通过 OptionalDecoder 实现的。
SpringEncoder 编码器也非常简单,也是基于 spring 中的 HttpMessageConverter。这里我们就不再赘述。

阅读更多 >>>  spring怎么读谐音,spring的发音春天该怎么发音

网站数据信息

"springcloud feign,spring cloud openFeign传参的一些总结(有错,待更新)"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:springcloud feign,spring cloud openFeign传参的一些总结(有错,待更新)的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!