Spring Cloud Feign 例子(日志,局部超时,失败断容,脱离SpringCloud使用Feign)

本文主要是介绍Spring Cloud Feign 例子(日志,局部超时,失败断容,脱离SpringCloud使用Feign),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

依赖

    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'implementation 'io.github.openfeign:feign-okhttp'

properties配置


全局超时
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000针对第三方接口超时 
hystrix.command.IService#QueryAll(Integer,String).execution.isolation.thread.timeoutInMilliseconds=20000

config配置

@Configuration // 扫包目录下此注解 为全局配置
public class FeignConfig {private static final int TIME_OUT = 55;@Beanpublic okhttp3.OkHttpClient okHttpClient(CQInterceptor cqInterceptor) {Logger logger = LoggerFactory.getLogger(OkHttpClient.class);HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(logger::info);logInterceptor.level(HttpLoggingInterceptor.Level.BODY);return new OkHttpClient.Builder().connectTimeout(TIME_OUT, TimeUnit.SECONDS).readTimeout(TIME_OUT, TimeUnit.SECONDS).writeTimeout(TIME_OUT, TimeUnit.SECONDS).addInterceptor(cqInterceptor)//自定义拦截器.addInterceptor(logInterceptor)//注入日志拦截.build();}@Beanpublic CQInterceptor cqInterceptor() {return new CQInterceptor();}@Beanpublic Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {return new SpringFormEncoder(new SpringEncoder(messageConverters));}}

自定义拦截器

public class CQInterceptor implements Interceptor {private static final String METHOD_GET = "GET";private static final String METHOD_POST = "POST";@Value(value = "${auth.authKey}")private String authKey;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();boolean isCQRequest = chain.request().url().pathSegments().contains("mock");if (isCQRequest) {if (METHOD_GET.equals(request.method())) {//如果是get请求HttpUrl newUrl = request.url().newBuilder().addEncodedQueryParameter("authKey", authKey).build();request = request.newBuilder().url(newUrl).build();} else if (METHOD_POST.equals(request.method())) {HttpUrl newUrl = request.url().newBuilder().addEncodedQueryParameter("authKey", authKey).build();request = request.newBuilder().url(newUrl).build();}}log.info("Hey there, this is my CQ-request: " + request);Response response = chain.proceed(request);if (isCQRequest) {String contentType = response.header("content-type");if (StringUtils.containsIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE)) {okhttp3.MediaType mediaType = okhttp3.MediaType.parse(contentType);String content = response.body().string();ResponseBody responseBody = ResponseBody.create(JSONUtils.recursive(content).toString(), mediaType);response = response.newBuilder().body(responseBody).build();}}log.info("Hey there, this is my CQ-response: " + response);return response;}}

IService类

@FeignClient(name = "api-service", url = "${demo.baseUrl}", path = "", fallbackFactory = DemoFallbackFactory.class)
public interface IService{@GetMapping(value = "/demo")JsonResult<String> queryAll(@RequestParam(name = "IdNumber") Integer IdNumber, @RequestParam(name = "IdType") String IdType);}

DemoFallbackFactory 用于生成fallback类示例,

@Component
@Slf4j
public class DemoFallbackFactory implements FallbackFactory<IService> {private static JsonResult serviceNotFoundError() {return JsonResult.ret(ResultType.DATA_NO_CONNECTIONINFO);}@Overridepublic IService create(Throwable cause) {Throwable rootCause = ExceptionUtils.getRootCause(cause);if (rootCause instanceof ClientException) {String msg = ((ClientException) rootCause).getErrorMessage();if (StringUtils.startsWith(msg, "Load balancer does not have available server for client")) {String client = msg.replace("Load balancer does not have available server for client:", "");log.error("服务 {} 未启动", client);}} else {log.error("服务调用失败", cause);}return (IService) Enhancer.create(IService.class, (MethodInterceptor) (o, method, objects, methodProxy) -> serviceNotFoundError());}}

Spring boot 使用 Feign 脱离 Spring Cloud Feign

修改 config配置 新增

    @Resourceprivate Encoder feignFormEncoder;@Resourceprivate Decoder feignDecoder;@Resourceprivate LoadBalancerClient loadBalancerClient;@Beanpublic Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {return new SpringFormEncoder(new SpringEncoder(messageConverters));}@Beanpublic Decoder feignDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {return new SpringDecoder(messageConverters);}@BeanIService iService(){loadBalancerClient.choose("WX-MPS").getHost(); //此方法是获取其他微服务Feign的url ,可用于将本地微服务接口 换成 普通接口 ,获取其他微服务host port 作用return Feign.builder().client(new feign.okhttp.OkHttpClient(okHttpClient)).encoder(feignFormEncoder).decoder(feignDecoder).options(new Request.Options(2000, 3500)).retryer(new Retryer.Default(5000, 5000, 3)).contract(new SpringMvcContract())// 加入这个可以可以继续使用@GetMapping之类的接口.target(IService .class, url);}

注释掉 FeignClient 接口

//@FeignClient(name = "api-service", url = "${demo.baseUrl}", path = "", fallbackFactory = DemoFallbackFactory.class)
public interface IService{@GetMapping(value = "/demo")JsonResult<String> queryAll(@RequestParam(name = "IdNumber") Integer IdNumber, @RequestParam(name = "IdType") String IdType);}

调用方法 不变

@RestController
public class QueryController {@Resourceprivate IService iService;@GetMapping(value = "/QueryPersonId")public JsonResult queryPersonId(@RequestParam("IdNumber") Integer IdNumber, @RequestParam(value = "IdType", defaultValue = "C1") String IdType) {JsonResult<String> stringJsonResult = iService.queryAll(IdNumber, IdType);Assert.state(stringJsonResult.isSuccessful(), stringJsonResult.getMsg());return JsonResult.success(stringJsonResult.getObj());}

这篇关于Spring Cloud Feign 例子(日志,局部超时,失败断容,脱离SpringCloud使用Feign)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957776

相关文章

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav