springcloud-5.feign

简介

Feign是spring cloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。

feign的入门应用

user-consumer

  • 依赖配置
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
  • UserApplication

在主函数上添加**@EnableFeignClients** 注解

删除restTemplate的相关代码, 无需自己手动请求

  • UserClient

添加feignclient, 这边feign就会替我们拼接 http://user-service/user/{id}的链接, 并请求

@FeignClient("user-service")
public interface UserClient {

    @GetMapping("/user/{id}")
    public User queryById(@PathVariable Integer id);
}

  • UserController

不在使用我们之前的手动拼接服务的方式

 @Autowired
 private UserClient userClient;
 
  @GetMapping("/{id}")
  @HystrixCommand
  public User queryById(@PathVariable Integer id){
      if (id == 1) {
     	 throw new RuntimeException("出现异常了");
      }
      User user = userClient.queryById(id);
      return user;
  }
  • 启动

我们访问: http://127.0.0.1:8081/user/2 访问正常

feign的负载均衡

user-service

  • UserController

添加一个带有睡眠时间的网络请求

/**
 * 给feign的ribbon超时设置测试
 * @param id
 * @return
 */
@GetMapping("/timeout/{id}")
public User queryByIdTimeout(@PathVariable Integer id){
	try {
		Thread.sleep(2000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	User user = userService.queryById(id);
	return user;
}

user-consumer

  • 配置文件

设置了超时时间, 然后使用feign去请求, 超过2s的请求按理说都应该是错误的

# feign中ribbon的配置
ribbon:
  ConnectTimeout: 1000 # 连接超时时长
  ReadTimeout: 2000 # 数据通信超时时长
  MaxAutoRetries: 0 # 当前服务器的重试次数
  MaxAutoRetriesNextServer: 0 # 重试多少次服务
  OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试
  • UserClient
 @GetMapping("/user/timeout/{id}")
 public User queryByIdTimeout(@PathVariable Integer id);
  • UserController
  @GetMapping("/timeout/{id}")
    @HystrixCommand
    public User queryByIdTimeout(@PathVariable Integer id){
        User user = userClient.queryByIdTimeout(id);
        return user;
    }
  • 启动

我们发现 访问http://127.0.0.1:8081/user/timeout/2, 此时feign调用是超时的

feign的熔断

user-consumer

  • 配置文件

开启Feign的熔断功能

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能
  • UserApplication

删除@EnableCircleBreak注解, 这个是我们之前单独使用hystrix时添加的注解

  • UserClientFallback

编写服务降级类

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User queryById(Integer id) {
        User user = new User();
        user.setUid(-1);
        return user;
    }

    @Override
    public User queryByIdTimeout(Integer id) {
        User user = new User();
        user.setUid(-1);
        return user;
    }
}
  • UserClient

修改注解, 指定fallback类

@FeignClient(value= "user-service", fallback = UserClientFallback.class)
  • 启动

访问 http://127.0.0.1:8081/user/timeout/2, 我们发现返回是的

{"uid":-1,"username":null,"age":null,"gender":null}

feign的请求压缩

改造user-comsumer

  • 配置文件
feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能
  compression:
    request:
      enabled: true # 开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限
    response:
      enabled: true

feign的日志记录

改造user-comsumer

  • 配置文件
logging:
  level:
    top.itkaoti.user.feign: debug
  • FeignConfig
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        //记录所有请求和响应的明细
        return Logger.Level.FULL;
    }
}
  • UserClient

在@FeignClient 中添加 configruation配置

@FeignClient(value= "user-service", fallback = UserClientFallback.class, configuration = FeignConfig.class)
  • 启动

访问 http://127.0.0.1:8081/user/2, 我们查看控制台

DWn7j0.png

源代码下载