美文网首页
Day3 Ribbon Feign

Day3 Ribbon Feign

作者: 小周爱吃瓜 | 来源:发表于2022-01-25 15:49 被阅读0次

Ribbon 部分

Feign底层默认使用了Ribbon.
Ribbon,使用的是LoadBalanceIntercceptor,对请求的路径进行了拦截,拦截到请求后根据该地址从Nacos列表获取真实的地址替换成真实的Ip地址加端口,因为Client本地会维护一份缓存列表,可以通过该列表取注册中心获取地址。

  • 关于拦截器的使用.


    Screen Shot 2022-01-17 at 12.11.46 PM.png
  • 模拟原理

    ![ Screen Shot 2022-01-17 at 12.10.17 PM.png

Feign 底层封装了Ribbon.

EnableFeignClients 封装了Import注解,导入类FeignClientRegistrar配置类,
然后该实现了BeanDefinitionRegistrar注解.

private void registerFeignClient(BeanDefinitionRegistry registry,
            AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
        String className = annotationMetadata.getClassName();
        BeanDefinitionBuilder definition = BeanDefinitionBuilder
                .genericBeanDefinition(FeignClientFactoryBean.class);
        validate(attributes);

注册的信息中,通过FeignClientFactoryBeanl生成

    FeignContext context = applicationContext.getBean(FeignContext.class);
        Feign.Builder builder = feign(context);
        Targeter targeter = get(context, Targeter.class);
        return (T) targeter.target(this, builder, context,
                new HardCodedTarget<>(type, name, url));

生成代理对象.

对象是LoadBalancerFeignClient.
然后该对象调用execute的时候,会调用到Ribbon 的方法.

 Response execute(Request request, Request.Options options) throws IOException {
        try {
            URI asUri = URI.create(request.url());
            String clientName = asUri.getHost();
            URI uriWithoutHost = cleanUrl(request.url(), clientName);
            FeignLoadBalancer.RibbonRequest ribbonRequest = new FeignLoadBalancer.RibbonRequest(
                    this.delegate, request, uriWithoutHost);

            IClientConfig requestConfig = getClientConfig(options, clientName);
            return lbClient(clientName)
                    .executeWithLoadBalancer(ribbonRequest, requestConfig).toResponse();

底层调用的是Ribbon.

Ribbon源码分析.png
  • Feign参数如何微调?

OpenFeign相对于Feign主要是增加了对于SpringMVC支持.
具体参数如下

        private Logger.Level loggerLevel;

        private Integer connectTimeout;

        private Integer readTimeout;

        private Class<Retryer> retryer;

        private Class<ErrorDecoder> errorDecoder;

        private List<Class<RequestInterceptor>> requestInterceptors;

        private Map<String, Collection<String>> defaultRequestHeaders;

        private Map<String, Collection<String>> defaultQueryParameters;

        private Boolean decode404;

        private Class<Decoder> decoder;

        private Class<Encoder> encoder;

        private Class<Contract> contract;

        private ExceptionPropagationPolicy exceptionPropagationPolicy;

feign:
  client:
    config:
      default:
        connectioinTimout: 5000
        readTimout: 5000
      serviceC:
        connectioinTimout: 5000
        readTimout: 5000
    httpclient: # 替换成ApacheClient或者Okhttp
      enable: true
  compression: # 开启gzip压缩
    request:
      enabled: true
      min-request-size: 10 #默认开启的压缩阀值是10字节
      mime-types: text/html,application/xml,application/json
    response:
      enabled: true

关于参数额微调:

  1. 采用okhttp替换原生的httpclient,默认使用了gzip压缩.
  2. 对于个别的服务,设置微调的超时时间和读取时间.
  3. 接下来就是对于Okhttp的连接池,参数配置了.

相关文章

网友评论

      本文标题:Day3 Ribbon Feign

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