声明式HTTP客户端-Feign

一、使用Feign实现远程HTTP调用

  • 什么是Feign
    • Feign是Netflix开源的声明式HTTP客户端
    • GitHub地址:https://github.com/openfeign/feign
  • 用Feign重构之前的代码

之前的代码:

        /**
         * 1.代码不可读
         * 2、复杂的url难以维护
         * 3.难以响应需求的变化,变化很没有幸福感
         * 4、编程体验不统一
         */
        UserDTO userDTO = restTemplate.getForObject(
                "http://user-center/users/{id}",
                UserDTO.class,userid
        );

改造代码:

  • 1.加依赖
<!-- Feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  • 2.写注解

在启动类上加上@EnableFeignClients注解

  • 3.写配置
    暂时没有配置
  • 写代码
    • 创建一个类,加上@FeignClient(name = “服务名称”)注解
package com.itmuch.contentcenter.feignclient;

    import com.itmuch.contentcenter.domain.user.UserDTO;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;

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

        @GetMapping("/user/{id}")
        UserDTO findById(@PathVariable Integer id);
    }

二、Feign的组成

在这里插入图片描述

三、细粒度配置自定义

  • 指定日志级别

在这里插入图片描述

  • Java代码方式
  • feign的日志级别是建立在feign的接口的日志级别是debug的基础上,如果为其他级别,则什么都不会打印
    • 在接口@FeignClient中加上configuration属性,UserCenterFeignConfiguration为自定义的feign配置类
@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)
public interface UserCenterFeignClient {
    @GetMapping("/users/{id}")
    UserDTO findById(@PathVariable Integer id);
}

自定义的feign配置类代码(如果该类上有@Configuration,则需要把该类放到启动类所在的包之外,参考Ribbon的细粒度配置时的额spring父子上下文问题):

package com.itmuch.contentcenter.configuration;

import feign.Logger;
import org.springframework.context.annotation.Bean;
public class UserCenterFeignConfiguration {
    @Bean
    public Logger.Level level(){
        //让fegin打印所有请求的细节
        return  Logger.Level.FULL;
    }
}
* 在配置文件中添加配置
logging:
  level:
    #springboot设置日志级别
    com.itmuch: debug
    # feign的日志级别是建立在feign的接口的日志级别是debug的基础上,如果为其他级别,则什么都不会打印
    com.itmuch.contentcenter.configuration.UserCenterFeignConfiguration: debug
  • 配置属性方式
# 配置属性方式自定义feign的日志级别
feign:
  client:
    config:
      # 想要调用的服务的名称
      user-center:
        loggerLevel: full

四、全局配置

  • Java代码方式
    • 方式一:让ComponentScan上下文重叠(强烈不建议)
    • 方式二【唯一正确的途径】:
      • 在启动类的@EnableFeignClients增加defaultConfiguration的属性值,例如@EnableFeignClients(defaultConfiguration = UserCenterFeignConfiguration.class),UserCenterFeignConfiguration为自定义的feign配置类,配置类参考细粒度配置自定义的feign配置类
  • 配置属性方式
# 配置属性方式指定全局feign的日志级别
feign:
  client:
    config:
      # 全局设置为default
      default:
        loggerLevel: full

五、支持的配置项

  • 代码方式支持的配置项

在这里插入图片描述

  • 属性方式支持的配置项

在这里插入图片描述

六、配置最佳实践总结

  • Ribbon配置 VS Feign配置

在这里插入图片描述

  • Feign代码方式 VS 属性方式

在这里插入图片描述
优先级:全局代码配置<全局属性配置<细粒度代码配置<细粒度属性配置

  • 最佳实践总结
    • 尽量使用属性配置,属性配置实现不了的情况再考虑使用代码配置
    • 在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混用,增加定位代码的复杂性。

七、Feign的继承

八、多参数请求构造

https://www.imooc.com/article/289000

九、Feign脱离Ribbon使用

  • 创建一个feignclient,使用url属性指定访问地址。

在这里插入图片描述

十、RestTemplate VS Feign

在这里插入图片描述

十一、Feign性能优化

  • 配置连接池【提升15%左右】
    • 引入依赖
        <dependency>
			<groupId>io.github.openfeign</groupId>
			<artifactId>feign-httpclient</artifactId>
		</dependency>
* 写配置
feign
# 配置feign连接池,使用Apache连接池的时候是httpclient,使用Okhttp时是okhttp
  httpclient:
    # 让feign使用Apache httpclient做请求;而不是默认的urlconnection
    enabled: true
    # feign 的最大连接数
    max-connections: 200
    # feign单个路径的最大连接数
    max-connections-per-route: 50
  • 设置日志级别为basic,不建议设置为full
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值