Feign实现服务间的Http调用。

Feign

通过Feign可以实现服务间的Http调用。

Feign组成:
在这里插入图片描述

1. Feign的简单使用

  1. maven引入坐标

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 每个需要被发现与注册的服务加上@EnableDiscoveryClient注解

    调用方通过@EnableFeignClients表示Feign客户端。

    @EnableFeignClientsbasePackages属性指明Feign接口所在的包

    @SpringBootApplication
    @EnableDiscoveryClient
    @MapperScan("com.banmingi.nodeapp.usercenter")
    public class UserCenterApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserCenterApplication.class);
        }
    }
    
    @SpringBootApplication
    @MapperScan("com.banmingi.nodeapp.contentcenter")
    @EnableFeignClients
    @EnableDiscoveryClient
    public class ContentCenterApplication {
        public static void main(String[] args) {
            SpringApplication.run(ContentCenterApplication.class);
        }
    }
    
  3. 定义Feign接口,实现远程http调用,接口里的方法和user-center服务里面的 UserController一致。

    在这里可以通过path属性指定前缀,比如path = “users”,这样下面的GetMapping里面的内容只要"/{id}“就可以了,比如UserController上面有个@RequestMapping(”/users"),可以设置path与之对应。

    UserController:

    @RestController
    @RequestMapping("/users")
    public class UserController {
    
        @Resource
        private UserService userService;
    
        /**
         * 根据id查询用户
         * @param id
         * @return
         */
        @GetMapping("/{id}")
        public User findById(@PathVariable Integer id) {
            System.out.println("我被请求了");
            return this.userService.findById(id);
        }
    }
    

    UserCenterFeignClient:

    @FeignClient(name = "user-center",path = "users")
    public interface UserCenterFeignClient {
        /**
         *
         * @param id
         * @return
         */
        @GetMapping("/{id}")
        User findById(@PathVariable Integer id);
    }
    
  4. 如果有多个Feign接口同时使用一个微服务,为了避免冲突(Spring只允许一个微服务存在),则需要在配置文件里面添加如下内容,表示后发现的bean会覆盖之前相同名称的bean。

    spring:
      main:
        allow-bean-definition-overriding: true
    

2. Feign的日志配置

Feign的日志级别有NONE BASIC HEADERS FULL(从小到大),默认为NONE。

feign的日志是建立在 debug日志模式的基础上的,不管是全局配置还是局部配置,代码配置还是属性配置,都需要先把日志模式调成debug模式:(下面与调用UserCenterFeignClient接口的日志模式为例)

logging:
  level:
    com.banmingi.nodeapp.contentcenter.feignclient.UserCenterFeignClient: debug
  1. 局部日志配置(只作用在需要被调用的Feign接口上)

    1. 代码方式配置

      别加@Configuration注解,否则必须挪到 @ComponentScan 所扫描的包以外 (Spring父子上下文)

      写一个配置类:

      /**
       * @auther 半命i 2020/4/7
       * @description feign的配置类
       * 别加@Configuration注解,否则必须挪到 @ComponentScan 所扫描的包以外
       */
      public class CenterFeignConfiguration {
      
          /**
           * 设置feign日志级别: NONE  BASIC HEADERS FULL
           * @return
           */
          @Bean
          public Logger.Level level() {
              return Logger.Level.FULL;
          }
      }
      

      在 Feign接口@FeignClient中使用configuration属性指定配置类

      @FeignClient(name = "user-center",configuration = CenterFeignConfiguration.class)
      public interface UserCenterFeignClient {
          /**
           *
           * @param id
           * @return
           */
          @GetMapping("/users/{id}")
          UserDTO findById(@PathVariable Integer id);
      }
      
    2. 属性方式配置
      在这里插入图片描述

      feign:
        client:
          config:
            #想要调用的微服务的名称
            user-center:
              loggerLevel: FULL
      
  2. 全局日志配置(所有的Feign接口都将被影响)

    1. 代码方式配置
      在这里插入图片描述

      写一个全局配置类:

      public class GlobalFeignConfiguration {
      
          /**
           * 设置feign日志级别: NONE  BASIC HEADERS FULL
           * @return
           */
          @Bean
          public Logger.Level level() {
              return Logger.Level.FULL;
          }
      }
      

      在主启动类的@EnableFeignClients注解中配置属性defaultConfiguration

      @SpringBootApplication
      @MapperScan("com.banmingi.nodeapp.contentcenter")
      @EnableFeignClients(defaultConfiguration = CenterFeignConfiguration.class)
      @EnableDiscoveryClient
      public class ContentCenterApplication {
          public static void main(String[] args) {
              SpringApplication.run(ContentCenterApplication.class);
          }
      }
      
    2. 属性方式配置:

      feign:
        client:
          config:
            #全局配置
            default:
              loggerLevel: BASIC
      

3. Feign支持的配置项

除了日志,Feign还支持一下的配置项,但代码方式和属性方式有所不同

  1. 代码方式配置

在这里插入图片描述

  1. 属性方式配置
    在这里插入图片描述


3. 通过 Feign 进行http请求网址

  1. 接口

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

    name必须指明,否则会报错。值可以随便取。

    url为请求的地址

  2. 测试

    @RestController
    @RequestMapping("test")
    public class TestController {
        @Autowired
        private TestBaiduFeignClient testBaiduFeignClient;
    
        @GetMapping("/baidu")
        public String baiduIndex() {
            return this.testBaiduFeignClient.index();
        }
    }
    
  3. 请求结果
    在这里插入图片描述


4. RestTemplate vs Feign

在这里插入图片描述


5. Feign 性能优化

在这里插入图片描述

  1. 日志级别

    日志级别越低,性能越高,但有时候我们需要打印日志来查看一些请求情况,这里建议设置成 BASIC

  2. Feign连接池

    Feign支持httpclient和okhttp作为连接池提升性能,下面与httpclient为例(okhttp也是这样配置的)

    1. 引如httpclient坐标

      <dependency>
          <groupId>io.github.openfeign</groupId>
          <artifactId>feign-httpclient</artifactId>
      </dependency>
      
    2. 属性配置

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

6. Feign常见问题总结

详见这篇文章:Feign常见问题总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值