spring-cloud:feign的要点记录

1.什么是Feign?

     Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)。

2.什么是声明式,有什么作用,解决什么问题?

    a.声明式调用就像调用本地方法一样调用远程方法;无感知远程http请求。

    b.Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务 时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

    c.它像Dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的Http Client构造请求再解析返回数据。

    d.它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

3、声明式服务调用的入门例子提要

     <dependency>

            <groupId>org.springframework.cloud</groupId>

             <artifactId>spring-cloud-starter-feign</artifactId>

       </dependency>

      利用facade设计模式 consumer和provider关联同一个子项目provider-api,provider实现api内的接口,consumer内的接口继承api的接口

     consumer启动类标签:@EnableFeignClients

                                         @EnableDiscoveryClient

                                       @SpringBootApplication

                     接口标签:@FeignClient(name="provider的项目名")

       provider启动类标签:@EnableEurekaClient

                                     @SpringBootApplication

4.剖析:feign对复杂参数请求的处理

          HttpURLConnection方式(默认):

                        一个参数:@RequestParam(name="id")Integer id

                          多个参数:@RequestParam(name="id") Integer id,@RequestParam(name="name") String name

         httpclient方式:

              consumer的pom文件:

                          <dependency>

                                    <groupId>org.apache.httpcomponents</groupId>

                                     <artifactId>httpclient</artifactId>

                                    <version>4.5.3</version>

                          </dependency>

                         <dependency>

                                     <groupId>com.netflix.feign</groupId>

                                     <artifactId>feign-httpclient</artifactId>

                                     <version>8.18.0</version>

                        </dependency>

             consumer的配置文件:

                           #启用httpclient

                          feign.httpclient.enabled=true

             一个参数:

                          eq:

                                 api中的接口: @RequestMapping(value="getById",method=RequestMethod.GET)

                                                        public Product getById(@RequestParam(name="id") Integer id);

                                privider中的实现:

                                                       public Product getById( Integer id)

            多个参数:

                          eq:

                                api中的接口:

                                    @RequestMapping(value="get1",method=RequestMethod.GET,

                                                               consumes=MediaType.APPLICATION_JSON_VALUE)

                                      public Product getProduct1(Product obj);

                                privider中的实现:

                                   public Product getProduct1(@RequestBody Product obj)

5、性能优化

(1)加入基于GZip压缩算法,提升网络通信速度

                     ********光是feign,调用过程中压缩

                     # 配置请求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

                   # 配置压缩数据大小的下限

                      feign.compression.request.min-request-size=512

*********整个项目传输压缩(springboot)

                server.compression.enabled=true

                server.compression.mime- types=application/json,application/xml,text/html,text/xml,text/plain

(2)采用连接池,提升feign的并发吞吐量

            默认的HttpURLConnection换成httpclient方式连接

                consumer的pom文件:

                <dependency>

                        <groupId>org.apache.httpcomponents</groupId>

                         <artifactId>httpclient</artifactId>

                       <version>4.5.3</version>

               </dependency>

              <dependency>

                       <groupId>com.netflix.feign</groupId>

                         <artifactId>feign-httpclient</artifactId>

                       <version>8.18.0</version>

                   </dependency>

consumer的配置文件:

       #启用httpclient

       feign.httpclient.enabled=true

6.如何在微服务的日志中记录每个接口URL、状态码和耗时信息?

           consumer的启动类中:加入以下这个bean

          @Bean

              public Logger.Level feignLoggerLevel(){

                // NONE, 不记录任何信息,默认值。

               // BASIC, 记录请求方法、请求URL、状态码和用时。

                 // HEADERS, 在BASIC的基础上再记录一些常用信息。

                      // FULL: 记录请求和响应报文的全部内容。

               return Logger.Level.FULL;

            }

            并且日志的配置文件中(我用的logback)

                          日志级别改成debug(之前是info,一直不显示调用信息)

7、对feign的负载均衡进行优化配置

                 #全局配置

                  # 请求连接的超时时间

                  ribbon.ConnectTimeout=5000

                 # 请求处理的超时时间

                 ribbon.ReadTimeout=5000

            #局部配置

                   # 对所有操作请求都进行重试

                   e-book-product.ribbon.OkToRetryOnAllOperations=true

                   # 对当前实例的重试次数

                   e-book-product.ribbon.MaxAutoRetries=2

                   # 切换实例的重试次数

                   e-book-product.ribbon.MaxAutoRetriesNextServer=0

                # 请求连接的超时时间

                    e-book-product.ribbon.ConnectTimeout=3000

                 # 请求处理的超时时间

                     e-book-product.ribbon.ReadTimeout=3000

                     # 指定具体的服务实例清单

                #e-book-product.ribbon.listOfServers=

猜你喜欢

转载自blog.csdn.net/gzc_870301/article/details/81275314
今日推荐