千家信息网

客户端远程调用Feign的方法

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容介绍了"客户端远程调用Feign的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!客户端远
千家信息网最后更新 2025年12月03日客户端远程调用Feign的方法

本篇内容介绍了"客户端远程调用Feign的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

客户端远程调用

Feign

什么是Feign?

Feign是 Netflix 公司开源的声明式HTTP客户端

Github : Feign 源码

为什么需要Feign?

  1. 原代码可读性不高

  2. 复杂的URL难以维护(https://user-center/s?wd={userId}&rsv_spt=1&rsv_iqid=0x93bff3cd000cf3da&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=4&rsv_sug1=4&rsv_sug7=100&rsv_t=10c2risCimsUZC0RBruMerdnQRN1gRxFI%2BywuD0L3LwGGNd2dR8XE6x%2FyFOjHnR0oEi0&rsv_sug2=0&inputT=1535&rsv_sug4=1535&rsv_sug=2

  3. 难以应对需求的快速变化

  4. 编码体验和我们写JAVA差异较大

举例重构代码

                              //替换前         ResponseEntity userEntity = restTemplate.getForEntity(                "http://user-center/users/{userId}",                UserDTO.class, userId        );        UserDTO userDTO = new UserDTO();        if (null != userEntity) {            userDTO = userEntity.getBody();            log.info("ShareService#findById userDTO: {}", userDTO);        }
  1. 添加依赖

                    org.springframework.cloud            spring-cloud-starter-openfeign        
  1. 启动类添加注解 @EnableFeignClients

  2. 添加配置

  3. 实现对应微服务的client

/** * IUserCenterFeignClient for 定义 user-center feign client * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */@FeignClient(name = "user-center")public interface IUserCenterFeignClient {    /**     * Feign client 会将请求转换为     * http://user-center/users/{userId}     *     * @param userId 用户id     * @return 返回用户对象     */    @GetMapping(path = "/users/{userId}")    public UserDTO findById(@PathVariable Long userId);}
  1. 替换后代码

        //使用 FeignClient 来替换掉RestTemplate调用        UserDTO userDTO = this.userCenterFeignClient.findById(userId);

Feign的组成

Feign的配置方式

Java Code
支持的配置项

自定义Feign日志级别
  • 级别内容

Demo

**Tip **: 有可能出现父子上下文重叠问题

  1. 在client添加配置

/** * IUserCenterFeignClient for 定义 user-center feign client * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)public interface IUserCenterFeignClient {   ...}
  1. 编写java配置文件

/** * UserCenterFeignConfiguration for 自定义user-center服务请求中,feign的配置信息 * {@link @Configuration} 不能添加该注解,否则会和ribbon一样,出现上下文重叠问题,造成配置全局共享 * 如要添加该注解,需要将该类放在主程序启动扫描不到的包下 * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */public class UserCenterFeignConfiguration {    @Bean    public Logger.Level level() {        // 配置feign 日志级别,记录请求和响应的header、body以及元数据        return Logger.Level.FULL;    }}
  1. 一定要在配置文件中添加该client 全路径

    logging:  level:   #com.sxzhongf: debug    com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debug


  2. 打印信息

2019-07-15 15:06:11.650 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] <--- HTTP/1.1 200 (402ms)2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] content-type: application/json;charset=UTF-82019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] date: Mon, 15 Jul 2019 07:06:11 GMT2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] transfer-encoding: chunked2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] 2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] {"id":1,"wxId":"","wxNickname":"IsaacZhang","roles":"","avatarUrl":"aaa","createTime":"2019-07-11T06:08:18.000+0000","updateTime":"2019-07-11T06:08:18.000+0000","bonus":100}2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] <--- END HTTP (173-byte body)
Configuration
支持的配置项

demo

使用配置文件来定义log level

#logging:  #level:   #com.sxzhongf: debug    #com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debugfeign:  client:    config:      user-center: #单服务配置        loggerLevel: full---        feign:  client:    config:      default: #全局配置日志级别        loggerLevel: full

Feign的继承性

  • 官方不建议使用

  • 大多数公司使用?

架构师需要根据自身业务情况来决定,是否需要将不同的微服务进行业务耦合,还是使用冗余代码的方式来解放业务耦合性。

Feign多参请求

Get
  1. 使用@SpringQueryMap

@FeignClient(name = "user-center")public interface ITestUserCenterFeignClient {    @GetMapping("/users/q")    public UserDTO query(@SpringQueryMap UserDTO userDTO);}
  1. 使用 @RequestParam

@FeignClient(name = "user-center")public interface ITestUserCenterFeignClient {    @RequestMapping(value = "/users/q",method = RequestMethod.GET)    public UserDTO query(@RequestParam("id") Long id,@RequestParam("name") String name);}
  1. 使用Map构建,(不推荐)

@FeignClient(name = "user-center")public interface ITestUserCenterFeignClient {    @RequestMapping(value = "/users/q",method = RequestMethod.GET)    public UserDTO query(@RequestParam Map conditions);}

注意:这种方式不建议使用。主要是因为可读性不好,而且如果参数为空的时候会有一些问题,例如map.put("username", null); 会导致user-center 服务接收到的username是"" ,而不是null。

Post

服务提供者方法

    @PostMapping("/create")    public User createUser(@RequestBody User user){        return null;    }

服务调用者

@FeignClient(name = "user-center")public interface ITestUserCenterFeignClient {    @RequestMapping(value = "/users/q",method = RequestMethod.POST)    public UserDTO query(@RequestBody UserDTO user);}

Feign脱离服务注册/Ribbon调用

@FeignClient(name = "xxxxx",url = "http://www.baidu.com")public interface ITestBaiduFeignClient {    @GetMapping("")    public String getBaidu();}

Feign 性能优化

使用连接池
httpClient
  1. 加依赖

                            io.github.openfeign            feign-httpclient        
  1. 加注解(不需要)

  2. 改配置

  httpclient:    # 为feign启用 apache httpclient 做请求,而不使用默认的urlconection    enabled: true    # feign 最大连接数    max-connections: 200    # feign 单个路径请求的最大连接数    max-connections-per-route: 50
okHttp
  1. 加依赖

                            io.github.openfeign            feign-okhttp        
  1. 加注解(不需要)

  2. 改配置

  httpclient:    # 为feign启用 apache httpclient 做请求,而不使用默认的urlconection    #enabled: true    # feign 最大连接数    max-connections: 200    # feign 单个路径请求的最大连接数    max-connections-per-route: 50  okhttp:    enabled: true
合理使用Feign日志

生产环境使用Logger.Level.BASIC

RestTemplate

RestTemplate VS. Feign

"客户端远程调用Feign的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

配置 服务 注解 客户 客户端 最大 日志 级别 方法 业务 代码 内容 文件 方式 路径 问题 上下 上下文 信息 全局 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 asp数据库在哪找 初中网络安全周实施方案 普罗米修斯时序数据库清理数据 网络安全公司合理估值 街电春雨网络技术可靠吗 网络安全文明校园建设标语 游戏客户端开发软件开发 数据库作业是什么意思 数据库自动生成编号每次从1开始 数据库升级会影响数据 学黑客文化与网络安全有用吗 软件开发需求难度过大 沉迷网络安全教育主题班会 网络安全的实验网站 国产服务器十强 成都布洛软件开发有限公司 手机之间导入数据库 Java和网络技术有关系吗 青岛app软件开发教程 文档数据库怎么转成sql 网网络安全认识 魔力宝贝30龙之传说服务器 软件开发外包服务流程 苹果注册谷歌账号无法连接服务器 哔哩哔哩网络安全工资 计算机网络技术知识大全百度 为什么软件开发成功率不高 软件开发答辩流程 幼儿园家校管理软件开发 湖南英雄联盟服务器云空间
0