• SpringCloud不归路——Feign


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

    POM引入

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

    Feign的客户端

    @FeignClient("user-service")
    public interface UserFeignClient {
    
        @GetMapping("/user/{id}")
        User queryUserById(@PathVariable("id") Long id);
    }
    • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像

    • @FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称

    • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

    改造原来的调用逻辑,不再调用UserDao:

     

    @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;
        }
    }

    开启Feign

    我们在启动类上,添加注解,开启Feign功能

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

    Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了

    关于Ribbon

    Feign中本身已经集成了Ribbon依赖和自动配置yml:

    user-service:
      ribbon:
        ConnectTimeout: 250 # 连接超时时间(ms)
        ReadTimeout: 1000 # 通信超时时间(ms)
        OkToRetryOnAllOperations: true # 是否对所有操作重试
        MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
        MaxAutoRetries: 1 # 同一实例的重试次数

    Hystix支持

    Feign默认也有对Hystix的集成,只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:

    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);
    }

    请求压缩

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

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

    注:上面的数据类型、压缩大小下限均为默认值。

    日志级别

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

    1)设置包下的日志级别都为debug

    logging:
      level:
        com.leyou: debug

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

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

    Feign支持4种级别:

    • NONE:不记录任何日志信息,这是默认值。

    • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

    • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

    • 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);
    }

    总结

    1.引入openFeign启动器

    2.feign.hystrix.enable=true //开启Hystrix,可选

    3.引导类加入@EnableFeignClient

    4.创建Feign接口,加注解@FeignClient(value="服务id",fallback =实现类Class,configuration =配置类)

    5.在调用类中,注入Feign接口并使用

    6.创建熔断类,实现Feign接口,实现对应的Feign方法,这些方法就是熔断方法(不支持类默认熔断方法)

  • 相关阅读:
    Django view(视图)
    Django ORM
    Django 路由系统(URLconf)
    Django简介
    Ubuntu 18.04安装MySQL指南
    一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
    一只简单的网络爬虫(基于linux C/C++)————开篇
    单例模式及单例类的两种实现
    对象析构不析构?
    C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14075756.html
Copyright © 2020-2023  润新知