热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Day17_16_SpringCloud教程之Feign高级功能详解

Feign高级功能详解注意:本篇Feign的高级功能实现请参考上一篇博客.Feign的高级功能实现以上一篇博客代码为基础,我们主要修改service_feign_consume

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: truemime-types: text/xml,application/xml,application/jsonmin-request-size: 2048response: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,所有.*/@BeanLogger.Level feignLogger(){return Logger.Level.FULL;}
}

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

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

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


io.github.openfeignfeign-okhttp


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

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

7. 此时目录结构



 


推荐阅读
  • 本文详细介绍了RPM包构建过程中Spec文件的结构和各部分的作用,包括包描述、准备阶段、构建过程、安装步骤、清理操作以及文件列表等关键环节。同时,提供了关于RPM宏命令、打包目录结构及常见标签的深入解析。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 想要使用Linux,以下这些命令不可少的哦!我在工作中经常用到的大多数都是一些文件的查找,和上传下载什么的,没什么技术含量& ... [详细]
  • 本文记录了作者在尝试启用IIS的Gzip压缩功能时遇到的挑战,特别是当企业内部网络使用ISA服务器作为代理时的问题。文章详细描述了问题的发现过程、解决步骤以及最终的解决方案。 ... [详细]
  • 探讨如何使用青花瓷抓包工具正确解析GZIP压缩的JSON请求,并寻找替代方案。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 在使用Node.js运行时环境的Next.js应用程序部署过程中,遇到了与目录文件数量相关的错误。本文将详细探讨该问题及其解决方案。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 理解远程服务调用:RPC与HTTP
    本文深入探讨了远程服务调用中的两种主流技术——RPC(远程过程调用)与HTTP(超文本传输协议),分析了它们的工作原理、特点及适用场景。 ... [详细]
  • 本文探讨了通过数组操作、事件委托、插件化开发、字符串拼接优化、HTML5 Data属性的使用、优先采用原生JavaScript以及JavaScript文件的压缩等方法,来提升jQuery应用程序的性能。 ... [详细]
author-avatar
青春脸001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有