Day17_16_SpringCloud教程之Feign高级功能详解

Feign高级功能详解

注意:

本篇Feign的高级功能实现请参考上一篇博客.Feign的高级功能实现以上一篇博客代码为基础,我们主要修改service_feign_consumer(服务消费者)客户端代码.

https://mp.csdn.net/postedit/95957488

一. Feign的高级应用

Feign的高级应用大致有如下几条:

  • 1️⃣. feign开启Gzip压缩;

  • 2️⃣. feign开启日志功能;

  • 3️⃣. feign替换JDK默认的URLConnection为okhttp;

  • 4️⃣. feign超时设置;

  • 5️⃣. feign使用hystrix进行熔断、降级处理.

二. Feign的高级功能实现

1. feign开启Gzip压缩

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

在service_feign_consumer的application.yml文件中添加配置.

feign:
  #feign开启Gzip压缩,Feign支持对请求与响应的压缩,以提高通信效率,在服务消费者配置文件开启压缩支持和压缩文件的类型即可
  #请求与响应的压缩
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enabled: true

2. feign开启日志功能

feign开启日志可以分为2步,首先是在配置文件中编辑,然后使用编写Java配置类.

2.1 在application.yml中设置日志输出级别

#设置日志输出级别
logging:
  level:
    com.syc.cloud.service.FeignHelloService: info

2.2 创建FeignLogConfig日志配置类

创建FeignLogConfig类,添加一个LoggerBean.

package com.syc.cloud.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * feign开启日志:
 * feign开启日志有两种方式,一种是使用配置文件,一种是使用java代码.
 * 下面将介绍代码配置方式:
 * 创建FeignLogConfig类,添加一个LoggerBean.
 */
@Configuration
public class FeignLogConfig {

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

3. feign替换JDK默认的URLConnection为okhttp

使用okhttp,能提高qps,因为okhttp有连接池和超时时间进行调优.

3.1 在服务消费者中,添加feign-okhttp依赖

<!--feign替换JDK默认的URLConnection为OkHttp.
使用okhttp,能提高qps,因为okhttp有连接池和超时时间进行调优-->
<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-okhttp</artifactId>
</dependency>

3.2 在配置文件中,禁用默认的http,启用okhttp.

feign:
  #禁用默认的http,启用okhttp
  httpclient:
    enabled: false
  okhttp:
    enabled: true

3.3 创建OkHttpConfig类,添加okhttp的bean

package com.syc.cloud.config;

import feign.Feign;
import okhttp3.ConnectionPool;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * 配置okhttp与连接池,ConnectionPool默认创建5个线程,保持5分钟长连接
 */
@Configuration
@ConditionalOnClass(Feign.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)
        //保持5分钟长连接
        .connectionPool(new ConnectionPool(10, 5L, TimeUnit.MINUTES))
        .build();
    }
}

4. feign超时设置

# hystrix的超时时间
# 超时时间设置为10秒,服务提供者睡眠时间大于10秒,服务消费者就会触发hystrix,进行熔断保护.
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000
#ribbon的超时时间
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
#Feign是自带断路器的,在D版本的Spring Cloud之后,它没有默认打开,需要在配置文件中配置打开它.
#feign启用hystrix,才能熔断、降级.
feign:
  hystrix:
    enabled: true

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

上面feign的超时时间设置为10秒,当服务提供者睡眠时间大于10秒,服务消费者调用服务提供者的方法,就会触发hystrix,进行熔断保护.

5.1 改造服务提供者,让服务睡眠60秒

package com.syc.cloud.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/hello")
    public String sayHi(@RequestParam String name) {

        try {
            //睡眠60秒,测试feign的熔断、降级.
            Thread.sleep(60 * 1000);
        }catch (Exception e){
            e.printStackTrace();
        }

        return "Hello," + name + "! This is " + port;
    }

}

5.2 改造服务消费者,添加feign的熔断、降级方法

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

package com.syc.cloud.service;

import com.syc.cloud.hystrix.FeignHelloServiceHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "eureka-provider",fallback = FeignHelloServiceHystrix.class)
public interface FeignHelloService {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    String sayHello(@RequestParam(value = "name") String name);

}

5.3 FeignHelloServiceHystrix代码

package com.syc.cloud.hystrix;

import com.syc.cloud.service.FeignHelloService;
import org.springframework.stereotype.Component;

/**
 *  feign熔断器处理
 */
@Component
public class FeignHelloServiceHystrix implements FeignHelloService {

    @Override
    public String sayHello(String name) {

        return "Hello "+name+". Please check your network!!!";
    }
}

6. 此时完整的application.yml文件

server:
  port: 8765
spring:
  application:
    name: eureka-feign
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

# hystrix的超时时间
# 超时时间设置为10秒,服务提供者睡眠时间大于10秒,服务消费者就会触发hystrix,进行熔断保护.
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000
# ribbon的超时时间
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
#Feign是自带断路器的,在D版本的Spring Cloud之后,它没有默认打开,需要在配置文件中配置打开它.
#feign启用hystrix,才能熔断、降级.
feign:
  hystrix:
    enabled: true
  #feign开启Gzip压缩,Feign支持对请求与响应的压缩,以提高通信效率,在服务消费者配置文件开启压缩支持和压缩文件的类型即可
  #请求与响应的压缩
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enabled: true
  #禁用默认的http,启用okhttp
  httpclient:
    enabled: false
  okhttp:
    enabled: true
#设置日志输出级别
logging:
  level:
    com.syc.cloud.service.FeignHelloService: info

7. 此时目录结构

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一哥Sun

您的鼓励是我继续创作的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值