资讯专栏INFORMATION COLUMN

客户端远程调用Feign

gself / 3080人阅读

摘要:多参请求使用使用使用构建,不推荐注意这种方式不建议使用。主要是因为可读性不好,而且如果参数为空的时候会有一些问题,例如会导致服务接收到的是,而不是。

# 客户端远程调用

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

Github : Feign 源码

为什么需要Feign?

原代码可读性不高

复杂的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

难以应对需求的快速变化

编码体验和我们写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);
        }

添加依赖

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

启动类添加注解 @EnableFeignClients

添加配置

实现对应微服务的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);
}

替换后代码

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

Feign的配置方式 Java Code
支持的配置项

自定义Feign日志级别

级别内容

Demo

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

在client添加配置

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

编写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;
    }
}

一定要在配置文件中添加该client 全路径

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

打印信息

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-8
2019-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 GMT
2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient           : [IUserCenterFeignClient#findById] transfer-encoding: chunked
2019-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: debug
feign:
  client:
    config:
      user-center: #单服务配置
        loggerLevel: full
---        
feign:
  client:
    config:
      default: #全局配置日志级别
        loggerLevel: full
Feign的继承性

官方不建议使用

大多数公司使用?

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

使用@SpringQueryMap

@FeignClient(name = "user-center")
public interface ITestUserCenterFeignClient {

    @GetMapping("/users/q")
    public UserDTO query(@SpringQueryMap UserDTO userDTO);
}

使用 @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);
}

使用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

加依赖

        
        
            io.github.openfeign
            feign-httpclient
        

加注解(不需要)

改配置

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

加依赖

        
        
            io.github.openfeign
            feign-okhttp
        

加注解(不需要)

改配置

  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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75465.html

相关文章

  • SpringCloud(第 012 篇)微服务接入 Feign 负载均衡通过 FeignClient

    摘要:添加电影微服务启动类电影微服务接入进行客户端负载均衡,通过调用远程微服务。注解表示该电影微服务已经接入模块。 SpringCloud(第 012 篇)电影微服务接入 Feign 进行客户端负载均衡,通过 FeignClient 调用远程 Http 微服务 - 一、大致介绍 1、本章节主要介绍在 SpringCloud 生态圈中,使用一个类似于 Java HTTP 客户端的工具 Feig...

    Cobub 评论0 收藏0
  • spring cloud feign实现远程调用服务传输文件

    摘要:实践案例包括两个项目,服务提供者项目名,调用服务项目名,主要给出两个服务之间的调用过程,文件上传功能不提供项目框架依赖一文件上传服务控制层文件上传控制文件上传文件上传开始文件上传结束,耗时文件上传失败业务层上传文件判 实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供 项目...

    lmxdawn 评论0 收藏0
  • springCloud学习3(Netflix Hystrix弹性户端

    摘要:在舱壁模式中可以隔离每个远程资源,并分配各自的线程池,使之互不影响。 springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代码见文章最下方。 一、为什么要有客户端弹性模式   所有的系统都会遇到故障,分布式系统单点故障概率更高。如何构建应用程序来应对故障,是每个软件开发人员工作的关键部分。但是通...

    yagami 评论0 收藏0
  • 8、服务发现&服务消费者Feign

    摘要:公众号乐园的中提供了两个组件实现软负载均衡调用,分别是和。是基于和的客户端负载工具,它是基于实现的,它可以在客户端配置服务端列表,然后轮询请求以实现均衡负载。 公众号:java乐园 spring cloud的Netflix中提供了两个组件实现软负载均衡调用,分别是Ribbon和Feign。上一篇和大家一起学习了Ribbon。Ribbon :Spring Cloud Ribbon是基于H...

    lpjustdoit 评论0 收藏0
  • SpringCloud学习(2)

    摘要:此为的结构图上篇已注册了,的服务,接下来用,实现负载均衡和的简单客户端,让消费者调用服务。是发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法,将的中间层服务连接在一起。对选定的负载均衡策略机上重试机制。           上篇已经搭建好基础demo,接下来继续构建项目并对spring cloud组件介绍描述。 showImg(https://segmentfault...

    wenzi 评论0 收藏0

发表评论

0条评论

gself

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<