美文网首页
【Spring Cloud】04-Feign

【Spring Cloud】04-Feign

作者: Y了个J | 来源:发表于2020-01-07 22:02 被阅读0次

    Feign是一个声明式的Web Service客户端,整合了注解,所以使用起来比较方便,通过它调用HTTP请求访问远程服务,就像访问本地方法一样简单开发者完全无感知

    Feign原理:我们首先会添加@EnableFeignClients注解开启对 FeignClient扫描加载处理,扫描后会注入到SpringIOC容器,当定义的feign接口方法被调用时,通过JDK代理的方式,生成具体的RequestTemplate,RequestTemplate生成Request,交给URLConnection处理,并结合LoadBalanceClient与Ribbon,以负载均衡的方式发起服务间的调用

    Feign具有以下一些重要特性:

    • 整合了Hystrix,支持fallback容错降级
    • 整合了Ribbon,直接请求的负载均衡
    • 支持HTTP请求和响应的压缩
    • 使用OkHttp替换原生URLConnection,提高效率

    添加pom依赖

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

    在启动主类上添加@EnableFeignClients,启用Feign

    @EnableFeignClients
    @SpringBootApplication
    public class SimplefeignApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SimplefeignApplication.class, args);
        }
    }
    

    接下来是关键的 FeignClient的使用了,新建一个接口类IIndexFeignService

    //指定了url就会访问该url地址,否则会把name参数当作服务名到注册中心中查询该名字服务,此时指定了url后可以随意命名
    @FeignClient(name = "search-github" , url = "https://api.github.com")
    public interface IIndexFeignService {
        @RequestMapping(value = "/search/repositories" , method = RequestMethod.GET)
        String search(@RequestParam("q") String query);
    }
    

    新建一个 IndexController ,注入IIndexFeignService,访问search方法

    @RestController
    public class IndexController {
    
        @Autowired 
        private IIndexFeignService feignService;
    
        @RequestMapping(value = "/search" , method = RequestMethod.GET)
        public String search(@RequestParam("query") String query){
            return feignService.search(query);
        }
    }
    

    feign开启日志,创建FeignLogConfig类,添加一个LoggerBean

    @Configuration
    public class FeignLogConfig {
    
        /**
         * 日志level有4个级别
         * 1.NONE,不记录任何日志
         * 2.BASIC,仅记录请求方法、URL以及响应状态码和执行时间
         * 3.HEADRES,除了BASIC以外的还会记录请求和响应的头信息
         * 4.FULL,所有
         * @return
         */
        @Bean
        Logger.Level feignLogger(){
            return Logger.Level.FULL;
        }
    }
    

    feign替换JDK默认的URLConnection为okhttp
    使用okhttp,能提高qps,因为okhttp有连接池和超时时间进行调优
    在服务调用者中,添加feign-okhttp依赖

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
    </dependency>
    

    feign配置参数

    feign:
      compression:  #开启Gzip压缩
        request:
          enabled: true
        response:
          enabled: true
      hystrix:
        enabled: true
      httpclient:
        enabled: false
      okhttp: #使用okhttp,能提高qps,因为okhttp有连接池和超时时间进行调优
        enabled: true
    
    ribbon:
      okhttp:
        enabled: true
      eager-load:
        enabled: true
      eureka:
        enabled: true
    

    创建OkHttpConfig类,添加okhttp的bean

    /**
     * 配置okhttp与连接池
     * ConnectionPool默认创建5个线程,保持5分钟长连接
     */
    @Configuration
    @ConditionalOnClass(Feign.class)
    @AutoConfigureBefore(FeignAutoConfiguration.class)
    public class OkHttpConfig {
    
        @Bean
        public okhttp3.OkHttpClient okHttpClient(){
            return new okhttp3.OkHttpClient.Builder()
                    //设置连接超时
                    .connectTimeout(10 , TimeUnit.SECONDS)
                    //设置读超时
                    .readTimeout(10 , TimeUnit.SECONDS)
                    //设置写超时
                    .writeTimeout(10 , TimeUnit.SECONDS)
                    //是否自动重连
                    .retryOnConnectionFailure(true)
                    .connectionPool(new ConnectionPool(10 , 5L, TimeUnit.MINUTES))
                    .build();
        }
    }
    

    feign使用hystrix进行熔断、降级处理

    @FeignClient(name = "provider-service" , fallback = HelloFeignFallbackService.class)
    public interface HelloFeignService {
    
        @RequestMapping(value = "/hello" , method = RequestMethod.GET)
        String hello(@RequestParam("name") String name);
    }
    

    添加feign的熔断、降级方法,feign的hystrix熔断降级很好实现,只要在FeignClient的fallback回滚方法中指定那个实现类即可

    /**
     * hystrix服务降级处理,防止因超时、异常等导致的服务调用雪崩
     */
    @Service
    public class HelloFeignFallbackService implements HelloFeignService{
        @Override
        public String hello(String name) {
            return "未找到" + name ;
        }
    }
    

    实战项目地址

    相关文章

      网友评论

          本文标题:【Spring Cloud】04-Feign

          本文链接:https://www.haomeiwen.com/subject/viwdactx.html