springcloud feignclient,springcloud feign使用

  springcloud feignclient,springcloud feign使用

  

目录

Feign正常工作。SpringMVC的ControllerSpringCloud中@FeignClient标注的接口,让大家知道使用过程中需要注意什么,可以灵活扩展什么。

 

  00-1010将Http请求抽象成一个接口客户端,可以调用接口执行Http请求,简化Http调用。

  Feign将散落在@FeignClient、@EnableFeignClients、标识接口、接口方法、Spring环境中的各种配置信息提取封装到一个对象中,然后将对象中的信息注入到RestTemplate中,生成一个Http请求,然后执行。

  00-1010是提取Http请求的信息,注入到@RequestMapping标记中的方法;Feign从接口中提取信息,封装成一个Http请求的相关信息,这是SpringMVC解析过程的逆向过程。

  当我们通过IOC注入接口对象时,肯定得到了这个接口的实现类对象,应该是SpringCloud通过动态代理生成的对象。对于接口对象生成动态代理对象,一般使用JDK的代理,实现简单,耦合度低,比如SpringCloud。

  00-1010注册为FeignClientFactoryBean类型的Bean对象。我们通过IOC注入这个Bean的getObject()获得的对象。本文主要解释这种方法的执行过程。

  当然,直接粘贴源代码也太没脑子了。我主要把解析过程总结成几点。

  00-1010解析接口之前,先加载SpringCloud的Feign配置。默认情况下,首先加载@FeignClient和@EnableFeignClients的注释上的配置,然后加载Spring环境中feign.client.default指定的配置,最后加载feign.client.appName(应用程序名)指定的配置。后面的配置信息会覆盖前面的,也就是越往后优先级越高。您可以通过“feign . client . defaulttoproperties”属性更改此优先级顺序验证:接口方法参数的长度不能为0。验证:带有@FeignClient的接口最多可以继承一个接口验证:@FeignClient标识的接口的父接口不能再从其他接口继承,即当@FeignClient的接口最多只能有一个上级接口解析接口方法时,这些类型的方法被忽略:Object method、Static method、Default method将@FeignClient标识接口的上级接口的@RequestMapping注释的value()设置为MethodMetadata中RequestTemplate的“url”的第一位;也就是说,如果@FeignClient识别出接口有超接口,那么取超接口的@ requestmapping如果没有,那就自己拿@ RequestMapping如果没有这样的注释,那么忽略如果在方法上没有标识@RequestMapping,忽略方法上的@RequestMapping,最多只有Method()和value()中的一个值可以将方法上@RequestMapping的value()追加到RequestTemplate的“url”上,后面是接口上@RequestMapping的value(),机制匹配控制器。解析方法上@RequestMapping上的produces(),验证其值只能有一个元素,并将其值添加到标头上的Accept中,如Accept=application/json,以解析方法上@RequestMapping上的consumes()。验证其值只能有一个元素,并将其值添加到标头的Content-Type中。例如,Content-Type=application/json在方法的@RequestMapping上解析headers()。headers是一个String[],它的元素是一个接一个的键值对。您可以使用“$ {}”来获取环境变量的值,例如username=$ { spring . application . name }来解析参数上的@PathVariable批注。如果此批注上的值()=id,并且url、标头和查询中不存在“{id}”,则将“id”添加到MethodMetada。

  ta 的 formParams 属性中,一般不容易出现这种情况解析参数上的 @RequestHeader 注解,如果此参数类型是Map,设置下MethodMetadata 里的headerMapIndex,也就是参数序号;如果不是,假设value()= uname,那么将uname 和 参数值 作为键值对 加入到MethodMetadata 的 template(RequestTemplate ) 的 headers 属性中解析参数上的 @RequestParam注解, 如果此参数类型是Map, 设置下MethodMetadata 里的queryMapIndex, 也就是参数序号;如果不是,假设value()= uname,那么将uname 和 参数值 作为键值对 加入到MethodMetadata 的 template(RequestTemplate ) 的 queries属性中@PathVariable,@RequestHeader, @RequestParam 这三个注解起作用的前提是SpringMVC里有他们的转换器,能够将他们转换为String。也就是说比如参数类型是Date,需要自定义一个Date > String 的转换器,注入到ConversionService里;其他复杂类型也可以自定义相应的转换器。也就是这三个注解不是只能标识基本数据类型,只要定义了相应的转化器,也可以标识复杂类型。一个参数可以标识以上3种注解,不同的注解执行时起不同的作用。不同的注解可能value()不同,也就是一个参数可能被放进多个地方,比如 ( @PathVariable(name) @RequestHeader(id) @RequestParam (flag) String userName ) 。每一个注解都会将此参数顺序和value() 存入 MethodMetadata 的 indexToName,以备后续执行时解析。只要参数标识上述3个注解中的一个,那么将参数序号和转换器放入 MethodMetadata 的 indexToExpander 中;多种注解共用一个转换器,类型是 ConvertingExpander,也就是要将参数转化为Http请求中的数据。如果参数上未标识上述3种注解,那么此参数作为 RequestBody 的内容。一个方法中只能有一个未标识注解的参数,将参数的序号和实际类型放入 MethodMetadata 的 bodyIndex 和 bodyType 中。将MethodMetadata(接口Class和方法上的数据),@FeignClient注解里的数据,Spring环境里配置的数据都放进 SynchronousMethodHandler 类型的对象中, 此对象将配合JDK的AOP动态代理,代理对象执行相应方法时将其转发给SynchronousMethodHandler 执行,每一个Method对应一个SynchronousMethodHandler为@FeignClient标识的接口创建JDK动态代理对象,InvocationHandler类型为 :FeignInvocationHandler,持有Map< Method, MethodHandler > 类型的属性,在调用相应方法时转发给指定的 MethodHandler 处理。以上就是解析@FeignClient接口的,生成相应接口的动态代理对象的过程。

  最终所有信息都汇总到SynchronousMethodHandler对象里,在实际执行Http请求时,根据接口上的参数数据和MethodHandler信息生成feign.Request对象,此对象里装着当前Http请求的所有信息,然后Feign将这些信息拷贝到RestTemplate中,就能执行相应的Http请求。

  希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: