您的位置:首页 > 教程 > JAVA/JAVA编程 > SpringCloud超详细i讲解Feign自定义配置与使用

SpringCloud超详细i讲解Feign自定义配置与使用

2022-06-20 12:54:51 来源:易采站长站 作者:

SpringCloud超详细i讲解Feign自定义配置与使用

目录
日志配置Basic 认证配置超时时间配置客户端组件配置GZIP压缩配置继承特性多参数请求构造

z7W站长之家-易采站长站-Easck.Com

日志配置

有时候我们遇到>

问题,或者想看看调用性能,就需要配置 Feign 的日志了,z7W站长之家-易采站长站-Easck.Com

以此让 Feign 把请求信息输出来。z7W站长之家-易采站长站-Easck.Com

首先定义一个配置类,代码如下所示。z7W站长之家-易采站长站-Easck.Com

package com.by.config;
 import feign.Logger;
  import org.springframework.context.annotation.Bean;
   import org.springframework.context.annotation.Configu ration; 
   @Configuration public class FeignConfig { 
   @Bean 
   Logger.Level feignLogLevel(){
    return Logger.Level.FULL; 
    }
     }

通过源码可以看到日志等级有 4 种,分别是:z7W站长之家-易采站长站-Easck.Com

    NONE:不输出日志。BASIC:只输出请求方法的 URL 和响应的状态码以及接 口执行的时间。HEADERS:将 BASIC 信息和请求头信息输出。FULL:输出完整的请求信息。

    在 Feign Client 中的 @FeignClient 注解中指定使用的配置类,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @FeignClient(value = "ws-user- server",configuration = {FeignConfig.class})
     public interface UserRemoteClient {
      @GetMapping("/user/{id}") 
      Map getuser(@PathVariable(name = "id") String id); }
    

    在配置文件中执行 Client 的日志级别才能正常输出日志,z7W站长之家-易采站长站-Easck.Com

    格式是“logging.level.client 类地址=级别”。z7W站长之家-易采站长站-Easck.Com

    logging: z7W站长之家-易采站长站-Easck.Com
      level: z7W站长之家-易采站长站-Easck.Com
        com.by.remote.UserRemoteClient: debugz7W站长之家-易采站长站-Easck.Com

    z7W站长之家-易采站长站-Easck.Com

    Basic>

    通常我们调用的接口都是有权限控制的,很多时候可能认证z7W站长之家-易采站长站-Easck.Com

    的值是通过参数去传递的,还有就是通过请求头去传递认证z7W站长之家-易采站长站-Easck.Com

    信息,比如 Basic 认证方式。在 Feign 中我们可以直接配置z7W站长之家-易采站长站-Easck.Com

    Basic 认证,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @Configuration 
    public class FeignConfig { 
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor(){ 
    return new BasicAuthRequestInterceptor("admin","1357"); 
    } }
    

    或者你可以自定义属于自己的认证方式,其实就是自定义一z7W站长之家-易采站长站-Easck.Com

    个请求拦截器。在请求之前做认证操作,然后往请求头中设z7W站长之家-易采站长站-Easck.Com

    置认证之后的信息。通过实现 RequestInterceptor 接口来z7W站长之家-易采站长站-Easck.Com

    自定义认证方式,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    import feign.RequestInterceptor; 
    import feign.RequestTemplate; 
    public class FeignAuthInteceptor implements RequestInterceptor { 
    @Override public void apply(RequestTemplate requestTemplate) { 
    requestTemplate.header("token","");
     } 
     }
    

    然后将配置改成我们自定义的就可以了,这样当 Feign 去请z7W站长之家-易采站长站-Easck.Com

    求接口的时候,每次请求之前都会进入z7W站长之家-易采站长站-Easck.Com

    FeignAuthInteceptor的 apply 方法中,在里面就可以做属z7W站长之家-易采站长站-Easck.Com

    于你的逻辑了,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @Configuration public class FeignConfig { 
    @Bean public RequestInterceptor basicAuthRequestInterceptor(){ 
    return new FeignAuthInteceptor(); } }
    

    z7W站长之家-易采站长站-Easck.Com

    超时时间配置

    通过>

    码如下所示),Options 的第一个参数是连接超时时间z7W站长之家-易采站长站-Easck.Com

    (ms),默认值是 10×1000;第二个是取超时时间z7W站长之家-易采站长站-Easck.Com

    (ms),默认值是 60×1000。z7W站长之家-易采站长站-Easck.Com

    @Configuration public class FeignConfig { 
    @Bean public Request.Options options() { 
    return new Request.Options(5, TimeUnit.SECONDS,6,TimeUnit.SECONDS,true);
     }
      }
    

    z7W站长之家-易采站长站-Easck.Com

    客户端组件配置

    Feign>

    们可以集成别的组件来替换掉,比如,OkHttp。z7W站长之家-易采站长站-Easck.Com

    配置 OkHttp 只需要加入 OkHttp 的依赖,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    <dependency> 
    <groupId>io.github.openfeign</groupId> 
    <artifactId>feign-okhttp</artifactId> 
    </dependency>
    

    然后修改配置,将 Feign 的 HttpClient 禁用,启用z7W站长之家-易采站长站-Easck.Com

    OkHttp,配置如下:z7W站长之家-易采站长站-Easck.Com

    feign: z7W站长之家-易采站长站-Easck.Com
      httpclient:z7W站长之家-易采站长站-Easck.Com
       enabled: false #禁用z7W站长之家-易采站长站-Easck.Com
        okhttp:z7W站长之家-易采站长站-Easck.Com
         enabled: true # 启用z7W站长之家-易采站长站-Easck.Com

    关于配置可参考源码z7W站长之家-易采站长站-Easck.Com

    org.springframework.cloud.openfeign.FeignAutoConz7W站长之家-易采站长站-Easck.Com

    figurationz7W站长之家-易采站长站-Easck.Com

    z7W站长之家-易采站长站-Easck.Com

    GZIP压缩配置

    开启压缩可以有效节约网络资源,提升接口性能,我们可以z7W站长之家-易采站长站-Easck.Com

    配置>

    feign:z7W站长之家-易采站长站-Easck.Com
     compression:z7W站长之家-易采站长站-Easck.Com
      request:z7W站长之家-易采站长站-Easck.Com
       enabled: truez7W站长之家-易采站长站-Easck.Com
      response:z7W站长之家-易采站长站-Easck.Com
       enabled: truez7W站长之家-易采站长站-Easck.Com

    还可以配置压缩的类型、最小压缩值的标准:z7W站长之家-易采站长站-Easck.Com

    feign:z7W站长之家-易采站长站-Easck.Com
     compression:z7W站长之家-易采站长站-Easck.Com
      request:z7W站长之家-易采站长站-Easck.Com
       enabled: truez7W站长之家-易采站长站-Easck.Com
        mime-types: text/xml,application/xml,application/json min-request-size: 2048z7W站长之家-易采站长站-Easck.Com

    只有当 Feign 的 Http Client 不是 okhttp3 的时候,压缩才z7W站长之家-易采站长站-Easck.Com

    会生效,配置源码在 org.springframework.cloud.openfeign.encoding.FeignAcceptGzipEz7W站长之家-易采站长站-Easck.Com

    ncodingAutoConfiguration,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @Configuration( proxyBeanMethods = false )
    @EnableConfigurationProperties({FeignClientEnc odingProperties.class}) 
    @ConditionalOnClass({Feign.class})
     @ConditionalOnBean({Client.class}) 
     @ConditionalOnProperty( value = {"feign.compression.response.enabled"}, matchIfMissing = false )
     @ConditionalOnMissingBean( type = {"okhttp3.OkHttpClient"} )
     @AutoConfigureAfter({FeignAutoConfiguration.cl ass}) 
     public class FeignAcceptGzipEncodingAutoConfiguration { 
     public FeignAcceptGzipEncodingAutoConfiguration() { }
     @Beanpublic 
     FeignAcceptGzipEncodingInterceptor feignAcceptGzipEncodingInterceptor(FeignClient EncodingProperties properties) { 
     return new FeignAcceptGzipEncodingInterceptor(properties) ; 
     } 
     }
    

    核心代码就是 @ConditionalOnMissingBeanz7W站长之家-易采站长站-Easck.Com

    (type=“okhttp3.OkHttpClient”),表示 Springz7W站长之家-易采站长站-Easck.Com

    BeanFactory 中不包含指定的 bean 时条件匹配,也就是没z7W站长之家-易采站长站-Easck.Com

    有启用 okhttp3 时才会进行压缩配置。z7W站长之家-易采站长站-Easck.Com

    z7W站长之家-易采站长站-Easck.Com

    继承特性

    Feign>

    公共的依赖,以方便使用。z7W站长之家-易采站长站-Easck.Com

    创建一个module,用于存放 API 接口的定义,增加 Feignz7W站长之家-易采站长站-Easck.Com

    的依赖,定义接口,指定服务名称,代码如下所示z7W站长之家-易采站长站-Easck.Com

    package com.by.client;
     import org.springframework.cloud.openfeign.FeignClien t;
     import org.springframework.web.bind.annotation.GetMap ping;
     import java.util.Map;
      @FeignClient(value = "ws-user-server") public interface UserRemoteClient { 
      @GetMapping("/user/{id}")
       public Map getuser(@PathVariable(name = "id") String id);
        }
    

    打包安装到仓库z7W站长之家-易采站长站-Easck.Com

    修改用户中心实现,先引入依赖z7W站长之家-易采站长站-Easck.Com

    <dependency>
    <groupId>com.by</groupId> 
    <artifactId>ws-api</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency>
    

    实现 UserRemoteClient 接口,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @RestController 
    public class UserController implements UserRemoteClient { 
    @Override public Map getuser(@PathVariable(name="id") String id) { 
    Map map=new HashMap();
     map.put("id",id);
      map.put("name","管理员");
       return map; 
       } 
       }

    修改订单服务,同样引入api,调用代码z7W站长之家-易采站长站-Easck.Com

    @RestController 
    public class OrderController { 
    @Autowired 
    UserRemoteClient userRemoteClient;
     @GetMapping("/order/query") public Map query(){ 
     Map map=userRemoteClient.getuser("40"); 
     Map rs=new HashMap(); 
     rs.put("orderNum","dd002");
      rs.put("user",map); return rs; } 
      }
    

    z7W站长之家-易采站长站-Easck.Com

    多参数请求构造

    多参数请求构造分为>

    先来看 GET 请求的多参数请求构造方式,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @GetMapping("/user/info") 
    String getUserInfo(@RequestParam("name")String name,@RequestParam("age")int age);
    

    另一种是通过 Map 来传递多个参数,参数数量可以动态改z7W站长之家-易采站长站-Easck.Com

    变,笔者在这里还是推荐大家用固定的参数方式,不要用z7W站长之家-易采站长站-Easck.Com

    Map 来传递参数,Map 传递参数最大的问题是可以随意传z7W站长之家-易采站长站-Easck.Com

    参。代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @GetMapping("/user/detail") 
    String getUserDetail(@RequestParam Map<String, Object> param);
    

    POST 请求多参数就定义一个参数类,通过z7W站长之家-易采站长站-Easck.Com

    @RequestBody 注解的方式来实现,代码如下所示。z7W站长之家-易采站长站-Easck.Com

    @PostMapping("/user/add") 
    String addUser(@RequestBody User user);
    

    注意: @RequestBody @PathVariable 在实现类上也要z7W站长之家-易采站长站-Easck.Com

    加上注解z7W站长之家-易采站长站-Easck.Com

    @RestController 
    public class UserController implements UserRemoteClient { 
    @Override public Map getuser(@PathVariable(name="id") String id) { 
    Map map=new HashMap();
     map.put("id",id); 
     map.put("name","管理员"); 
     return map; } 
     }
    

    到此这篇关于Spring Cloud超详细i讲解Feign自定义配置与使用的文章就介绍到这了,更多相关Spring Cloud Feign内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!z7W站长之家-易采站长站-Easck.Com

    如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    什么是SkyWalking 查看官网https://skywalking.apache.org/ 分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 安装 进入下载页面https://
    2020-06-18
  • 成功解决IDEA2020 Plugins 连不上、打不开的方法

    成功解决IDEA2020 Plugins 连不上、打不开的方法

    IntelliJ IDEA 2020.1 插件中心一直打不开,鉴于有部分同学反馈设置http proxy不能解决,所以可按以下顺序检查 一、设置 http proxy—勾上Auto-detect proxy setting,参照下图,加上地址 http://127.0.0
    2020-06-25
  • Java后台实现微信支付和微信退款

    Java后台实现微信支付和微信退款

    微信支付流程 都是我自己工作中开发的,亲测可用,不喜勿喷。 controller中我是这么写的,你们需要根据自己的业务需求改动。ResponseBean是我自己封装的,你们可以改成你们想要的形式
    2020-03-27
  • IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    进入File-Setting 如图,取消勾选,点击确认后重启,点击了以后等一会就可以正常显示 ps:下面看下解决IDEA 2020.1.1 找不到程序包和符号 问题描述 IDEA 2020.1.1 maven项目build的时候报错,找
    2020-06-28
  • Intellij idea热部署插件JRebel的使用

    Intellij idea热部署插件JRebel的使用

    项目需求,一直用eclipse的我,也要改用IDEA了,一开始,很不习惯。经过几天的慢慢摸索和习惯之后,发现IDEA确实很好用。dark的界面是我喜欢的,智能的提示也让写代码不再枯燥。 遗
    2020-06-25
  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    详解基于IDEA2020.1的JAVA代码提示插件开发例子

    之前因为项目组有自己的代码规范,为了约束平时的开发规范,于是基于2019.1.3版本开发了一个代码提示的插件。但是在把IDEA切换到2020.1版本的时候,却发现疯狂报错,但是网上关于
    2020-06-25
  • springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷
    2020-07-01
  • JetBrains IntelliJ IDEA 2020安装与使用教程详解

    JetBrains IntelliJ IDEA 2020安装与使用教程详解

    对于JetBrains IntelliJ IDEA 2020的认识 IntelliJ IDEA 2020是一款JAVA编程软件,捷克IntelliJ公司研发推出。该软件提供了一个非常强大的JAVA集成开发环境,不仅添加了对Records的完整代码洞察支持,
    2020-06-28