zoukankan      html  css  js  c++  java
  • Spring Cloud Feign高级应用

    1.使用feign进行服务间的调用

    spring boot2X整合nacos一使用Feign实现服务调用

    2.开启gzip压缩

    Feign支持对请求与响应的压缩,以提高通信效率,需要在服务消费者配置文件开启压缩支持和压缩文件的类型

    添加配置

    feign.compression.request.enabled=true
    feign.compression.response.enabled=true
    feign.compression.request.mime-types=text/xml,application/xml,application/json
    feign.compression.request.min-request-size=2048

    3.开启日志

    配置

    logging.level.com.xyz.comsumer.feign.RemoteHelloService=debug

    添加FeignLogConfig类

    package com.xyz.comsumer.configure;
    
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class FeignLogConfig {
        @Bean
        Logger.Level feignLogger(){
            return Logger.Level.FULL;
        }
    }

    输出

    2019-12-07 23:23:03.630 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] <--- HTTP/1.1 200 (671ms)
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] content-length: 14
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] content-type: text/plain;charset=UTF-8
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] date: Sat, 07 Dec 2019 15:23:03 GMT
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] vary: Origin
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] vary: Access-Control-Request-Method
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] vary: Access-Control-Request-Headers
    2019-12-07 23:23:03.631 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello]
    2019-12-07 23:23:03.632 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] hello,provider
    2019-12-07 23:23:03.632 DEBUG 2668 --- [vice-provider-1] c.xyz.comsumer.feign.RemoteHelloService : [RemoteHelloService#hello] <--- END HTTP (14-byte body)

    说明:

      Feign日志记录只能响应DEBUG日志级别

    对每一个Feign客户端,可以配置一个Logger.Level对象,通过该对象控制日志输出内容。

    Logger.Level有如下几种选择:

    NONE, 不记录日志 (默认)。

    BASIC, 只记录请求方法和URL以及响应状态代码和执行时间。

    HEADERS, 记录请求和应答的头的基本信息。

    FULL, 记录请求和响应的头信息,正文和元数据。

    4.替换JDK默认的URLConnection为okhttp
    在默认情况下 spring cloud feign在进行各个子服务之间的调用时,http组件使用的是jdk的HttpURLConnection
    服务之间调用使用的HttpURLConnection,效率非常低
    为了提高效率,可以通过连接池提高效率
    使用okhttp,能提高qps,因为okhttp有连接池和超时时间进行调优
    添加依赖
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
    </dependency>

    修改配置

    禁用默认的http,启用okhttp

    feign.okhttp.enabled=true
    feign.httpclient.enabled=false

    添加FeignOkHttpConfig类

    package com.xyz.comsumer.configure;
    
    import feign.Feign;
    import okhttp3.ConnectionPool;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.AutoConfigureBefore;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.cloud.openfeign.FeignAutoConfiguration;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.concurrent.TimeUnit;
    
    @Configuration
    @ConditionalOnClass(Feign.class)
    @AutoConfigureBefore(FeignAutoConfiguration.class)
    public class FeignOkHttpConfig {
    
        @Bean
        public okhttp3.OkHttpClient okHttpClient(){
            return new okhttp3.OkHttpClient.Builder()
                    .readTimeout(10, TimeUnit.SECONDS)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(20, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .connectionPool(new ConnectionPool())
                    .build();
        }
    }

    5.超时设置

    Feign调用服务的默认时长是1秒钟

    hystrix的超时时间

    hystrix.command.default.execution.timeout.enabled=true
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000

    说明:

      hystrix.command.default.execution.timeout.enabled 执行是否启用超时,默认启用true

      hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 命令执行超时时间,默认1000ms

      常用的配置还有

        hystrix.command.default.execution.isolation.strategy 隔离策略,默认是Thread, 可选THREAD|SEMAPHORE,建议选择SEMAPHORE

    Feign 的负载均衡底层用的就是 Ribbon

    ribbon的超时时间
    ribbon.ReadTimeout=10000
    ribbon.ConnectTimeout=10000

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

    feign启用hystrix,才能熔断、降级

    feign.hystrix.enabled=true

    hystrix服务降级处理 

    RemoteHelloServiceFallbackImpl

    package com.xyz.comsumer.feign.fallback;
    
    import com.xyz.comsumer.feign.RemoteHelloService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    public class RemoteHelloServiceFallbackImpl implements RemoteHelloService {
        private final Logger logger = LoggerFactory.getLogger(RemoteHelloServiceFallbackImpl.class);
    
        @Override
        public String hello() {
            logger.error("feign 查询信息失败:{}");
            return null;
        }
    
    }
  • 相关阅读:
    Using Change Management and Change Control Within a Project
    swift3.0 label改变行间距
    swift清理缓存
    Alamofire的get请求,post请求,以及上传字典
    swift跳转时隐藏tabbar,跳回时显示
    swift获取当前的Version
    swift回收键盘
    OC中常用的设计模式
    关于iOS多线程
    理解 : UDID、UUID、IDFA、IDFV
  • 原文地址:https://www.cnblogs.com/baby123/p/12000316.html
Copyright © 2011-2022 走看看