• Feign HttpClient连接池


    原文链接:https://zhuanlan.zhihu.com/p/81107006

    1.概念部分

    http 的背景原理
    a. 两台服务器建立 http 连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并
    且也很耗时间。
    b. Http 连接需要的 3 次握手 4 次分手开销很大,这一开销对于大量的比较小的 http 消
    息来说更大。
    2优化解决方案
    a. 如果我们直接采用 http 连接池,节约了大量的 3 次握手 4 次分手;这样能大大提升吞
    吐率。
    b. feign 的 http 客户端支持 3 种框架;HttpURLConnection、httpclient、okhttp;默认是
    HttpURLConnection。
    c. 传统的 HttpURLConnection 是 JDK 自带的,并不支持连接池,如果要实现连接池的
    机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的
    其他方案,也没有必要自己去管理连接对象。
    d. HttpClient 相比传统 JDK 自带的 HttpURLConnection,它封装了访问 http 的请求头,
    参数,内容体,响应等等;它不仅使客户端发送 HTTP 请求变得容易,而且也方便了开发人
    员测试接口(基于 Http 协议的),即提高了开发的效率,也方便提高代码的健壮性;另外
    高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。

    2.在consumer端添加httpClient相关坐标

    注意:httpClien与feign版本之间的适配

    Dalston.SR5版本

    <!-- 添加 Feign 坐标 -->
    <dependency>
       <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    <!-- 使用Apache HttpClient替换Feign原生httpURLConnection -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
    </dependency>
    <dependency>
      <groupId>com.netflix.feign</groupId>
      <artifactId>feign-httpclient</artifactId>
      <version>8.17.0</version>
    </dependency>

    Greenwich.SR2版本

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- 使用Apache HttpClient替换Feign原生httpURLConnection -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>10.1.0</version>
    </dependency>

    3.修改application.properties

    #启用 httpclient
    feign.httpclient.enabled=true

    4.案例

    server端

    注意:
        1.在传递对象时在server端@RequestBody注解可写可不写
        2.与默认的相比支持get和post方式传递对象
        3.1.x版本需在@RequestMapping注解中指定consumes属性,而2.x版本不需要

    Dalston.SR5版本

    //添加商品传递多个参数 方式二 :POST 方式
    @RequestMapping(value="/add2",method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
    public Product addProduct2(@RequestBody Product product);
    //使用 HttpClient 工具 添加商品传递多个参数 :基于 GET 方式
    @RequestMapping(value="/add3",method=RequestMethod.GET,consumes=MediaType.APPLICATION_JSON_VALUE)
        public Product addProduct3(Product product);
    }

    Greenwich.SR2版本

    //传递对象  post方式
    @PostMapping(value = "/add2")
    String addItem2( Item item);
    //传递对象  get方式
    @GetMapping(value = "/add3")
    String addItem3( Item item);

    provier端

    注意: 1.传递对象时必须在参数前使用@RequestBody注解

    2.普通参数需使用@requestParam注解

    //post方式传递对象
    @Override
    public String addItem2(@RequestBody Item item) {
        System.out.println(item);
        return "添加商品Ok";
    }
    //get方式传递对象
    @Override
    public String addItem3(@RequestBody Item item) {
        System.out.println(item);
        return "添加商品Ok";
    }

    consumer端

    service层

    @FeignClient(name = "feign-provider")
    public interface ItemConsumerService  extends ItemService {
    }

    controller层

    //post方式传递对象
    @GetMapping("/add2")
    public String addItem2(Item item){
        return itemConsumerService.addItem2(item);
    }
    //post方式传递对象
    @GetMapping("/add3")
    public String addItem3(Item item){
        return itemConsumerService.addItem3(item);
    }

     

    启动器

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

     

    applicaton.properties

    spring.application.name=feign-consumer
    server.port=6001
    eureka.client.service-url.defaultZone=http://root:root@eureka1:8761/eureka/,http://root:root@eureka2:8761/eureka/
    #-----------------------------feign gzip
    #配置请求 GZIP 压缩
    feign.compression.request.enabled=true
    #配置响应 GZIP 压缩
    feign.compression.response.enabled=true
    #配置压缩支持的 MIME TYPE
    feign.compression.request.mime-types=text/xml,application/xml,application/json
    #配置压缩数据大小的最小阀值,默认 2048
    feign.compression.request.min-request-size=512
    
    #-----------------------------spring boot gzip
    #是否启用压缩
    server.compression.enabled=true
    server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
    
    #启用 httpclient
    feign.httpclient.enabled=true
  • 相关阅读:
    webstorm一键格式化为Eslint标准
    Promise 对象
    ES6类的继承
    RabbitMQ之pika模块
    常见操作
    增量式爬虫
    分布式爬虫(scrapy-redis)
    crawlspider
    scrapy框架学习
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/fswhq/p/13572448.html
Copyright © 2020-2023  润新知