SpringCloud微服务基础4:Feign

        Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

        Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

【注意】Feign中已经自动集成了Ribbon负载均衡;同时Feign默认也有对Hystix的集成(默认是关闭Hystix)。

1.工程搭建

1.1、消费者工程引入Feign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.2、Feign的客户端@FeignClient

在消费者添加一个接口,该接口可以理解为在消费者中的DAO层,内容如下:

@FeignClient("user-service")
public interface UserFeignClient {
    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

(1)首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像;
(2)@FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称;
(3)接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果;

修改消费者的service层代码如下

@Service
public class UserService {
    @Autowired
    private UserFeignClient userFeignClient;
    public List<User> queryUserByIds(List<Long> ids) {
        List<User> users = new ArrayList<>();
        ids.forEach(id -> {
            // 我们测试多次查询,
            users.add(this.userFeignClient.queryUserById(id));
        });
        return users;
    }
}

1.3、消费者启动类开启Feign@EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients // 开启Feign功能
public class UserConsumerDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerDemoApplication.class, args);
    }
}

     发现RestTemplate的注册被我删除了。Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了。
 

2.Feign中Hystix支持

   Feign默认也有对Hystix的集成;只不过,默认情况下是关闭的。我们需要修改application.yml的参数来开启:

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

但是,Feign中的Fallback配置不像Ribbon中那样简单了;需要我们对消费者进行改造。操作步骤如下:

(1)第一步:首先,我们要定义一个类,实现刚才编写的UserFeignClient,作为fallback的处理类;代码如下:

@Component
public class UserFeignClientFallback implements UserFeignClient {
    @Override
    public User queryUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("用户查询出现异常!");
        return user;
    }
}


(2)第二步:然后在UserFeignClient中,指定刚才编写的实现类;代码如下:

@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {

    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

3.Feign中请求压缩及日志级别

3.1、feign请求压缩

       Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:

feign:
  compression:
    request:
      enabled: true # 开启请求压缩
    response:
      enabled: true # 开启响应压缩


       同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:

feign:
  compression:
    request:
      enabled: true # 开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限

3.2、feign日志级别

我们可以通过logging.level.xx=debug来设置日志级别。然而这个对Fegin客户端而言不会产生效果。因为@FeignClient注解修改的客户端在被代理时,都会创建一个新的Fegin.Logger实例。我们需要额外指定这个日志的级别才可以。

1)设置cn.jun包下的日志级别都为debug ;

logging:
  level:
    cn.jun: debug

2)编写配置类,定义日志级别

Feign支持4种级别:
(1)NONE:不记录任何日志信息,这是默认值。
(2)BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
(3)HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
(4)FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

3)在FeignClient中指定配置类:

@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class, configuration = FeignConfig.class)
public interface UserFeignClient {
    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/83787535