SpringCloud--07、服务调用Feign

素颜马尾好姑娘i 2022-04-12 14:17 376阅读 0赞

1、概述

Feign:意为伪装、声明式调用、理解为、Feign创建一个接口、接口上添加@FeignClient(value=”user-server”) value=服务器名称、接口内方法上添加 @GetMapping(“/user/{id}“)、这样以后、Feign会通过动态代理、自动实现类、通过http://user-service/user/5 帮我们调用user-server 端Controller里的方法、然后将数据返回给Feign接口内的抽象方法

(源码没看懂、只能这么理解)

2、入门案例

结构图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nzd3F6eA_size_16_color_FFFFFF_t_70

consumer-service导入依赖

  1. <!--Feign依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

Feign客户端UserFeignClient.java

  1. package com.baidus.consumer.dao;
  2. import com.baidus.consumer.config.FeignConfig;
  3. import com.baidus.consumer.pojo.User;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. /**
  8. * @ Author :ShaoWei Sun.
  9. * @ Date :Created in 9:42 2018/12/2
  10. */
  11. @FeignClient(value = "user-service", fallback =UserFeignClientFallback.class, configuration = FeignConfig.class)
  12. public interface UserFeignClient {
  13. //通过动态代理、动态生成实现类、调用user-server中controller方法、得到数据给queryBUserById
  14. @GetMapping("/user/{id}")
  15. User queryUserById(@PathVariable("id") Long id);
  16. }

回调函数类UserFeignClientFallback.java

  1. package com.baidus.consumer.dao;
  2. import com.baidus.consumer.pojo.User;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @ Author :ShaoWei Sun.
  6. * @ Date :Created in 10:08 2018/12/2
  7. */
  8. @Component
  9. public class UserFeignClientFallback implements UserFeignClient {
  10. @Override
  11. public User queryUserById(Long id) {
  12. User user = new User();
  13. user.setId(id);
  14. user.setName("用户查询出现异常");
  15. return user;
  16. }
  17. }

改造原来的调用逻辑、UserService.java不用调用UserDao

  1. @Service
  2. public class UserService {
  3. @Autowired
  4. private UserFeignClient userFeignClient;
  5. public List<User> queryUserByIds(List<Long> ids) {
  6. List<User> users = new ArrayList<>();
  7. ids.forEach(id -> {
  8. // 我们测试多次查询,
  9. users.add(this.userFeignClient.queryUserById(id));
  10. });
  11. return users;
  12. }
  13. }

consumer启动类上开启Feign功能

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableHystrix
  4. @EnableFeignClients // 开启Feign功能
  5. public class UserConsumerDemoApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(UserConsumerDemoApplication.class, args);
  8. }
  9. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nzd3F6eA_size_16_color_FFFFFF_t_70 1

3、Feign默认集成了Ribbon负载

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nzd3F6eA_size_16_color_FFFFFF_t_70 2

不需要引入依赖、也不用注册RestTemplate对象

application.yml加入负载均衡配置(consumer-server)

  1. ribbon:
  2. ConnectTimeout: 250 # Ribbon的连接超时时间
  3. ReadTimeout: 1000 # Ribbon的数据读取超时时间

4、Feign默认集成了Hystrix熔断器

Feign默认也有对Hystix的集成:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nzd3F6eA_size_16_color_FFFFFF_t_70 3

只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:

  1. feign:
  2. hystrix:
  3. enabled: true # 开启Feign的熔断功能

5、请求压缩

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

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

6、日志级别

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

设置com.baidus.consumer 日志级别为debug

  1. logging:
  2. level:
  3. com.baidus.consumer: debug

编写配置类。定义日志级别

FeignConfig.java

  1. package com.baidus.consumer.config;
  2. import feign.Logger;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. /**
  6. * @ Author :ShaoWei Sun.
  7. * @ Date :Created in 10:25 2018/12/2
  8. */
  9. @Configuration
  10. public class FeignConfig {
  11. @Bean
  12. Logger.Level feignLoggerLevel(){
  13. return Logger.Level.FULL;
  14. }
  15. }

Feign支持4种级别:

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

在FeignClient中指定配置类: UserFeignClinet.java

  1. package com.baidus.consumer.dao;
  2. import com.baidus.consumer.config.FeignConfig;
  3. import com.baidus.consumer.pojo.User;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. /**
  8. * @ Author :ShaoWei Sun.
  9. * @ Date :Created in 9:42 2018/12/2
  10. */
  11. @FeignClient(value = "user-service", fallback =UserFeignClientFallback.class, configuration = FeignConfig.class)
  12. public interface UserFeignClient {
  13. @GetMapping("/user/{id}")
  14. User queryUserById(@PathVariable("id") Long id);
  15. }

重启consumer-server 每次访问都会有日志:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nzd3F6eA_size_16_color_FFFFFF_t_70 4

发表评论

表情:
评论列表 (有 0 条评论,376人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud 服务调用 Feign

    这节我们来实现下服务调用,之前在Ribbon中实现的时候,发现调用其他的服务还是需要通过RestTemplate来调用,现在既然所有的服务都注册到了SpringCloud中,那