OpenFeign 个性化_注解配置_日志_请求拦截_请求透传_FastJson解析

相关组件概念

  1. Ribbon:
    • Ribbon 是 Netflix开源的基于 HTTP 和 TCP 等协议负载均衡组件;
    • Ribbon 可以用来做客户端负载均衡,调用注册中心的服务;
  2. Feign:
    • Feign 是 Spring Cloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端;
    • Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务;
    • Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务;
    • Feign 本身不支持 Spring MVC 的注解,它有一套自己的注解;
  3. OpenFeign:
    • OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 Spring MVC 的注解,如 @RequesMapping 等等。
    • OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

使用 OpenFeign

  1. 导入依赖:

     <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>${feign.version}</version>
    </dependency>
    
  2. 启动类配置:

    @SpringBootApplication
    @EnableFeignClients
    public class FeignDemoApplication {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
    }
    
  3. 配置 FeignClient 接口:

    @FeignClient("stores")
    public interface StoreClient {@RequestMapping(method = RequestMethod.GET, value = "/stores")List<Store> getStores();@RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")Store update(@PathVariable("storeId") Long storeId, Store store);
    }
    

个性化配置 Feign

1. @FeignClient 注解配置

public @interface FeignClient {/*** FeignContext 中 Bean 名称,若使用 Ribbon 则作为服务提供方名称,用于服务发现*/@AliasFor("name")String value() default "";				/*** 替代 value 成为 Client Bean 名称*/String contextId() default "";@AliasFor("value")String name() default "";@DeprecatedString qualifier() default "";/*** Client Bean 别名*/String[] qualifiers() default {};/*** 配置绝对 URL 或可解析的主机名(协议是可选的)*/String url() default "";/*** 404是否应该解码而不是抛出虚假异常*/boolean decode404() default false;/*** 自定义配置类*/Class<?>[] configuration() default {};/*** 定义容错的处理类,也就是回退逻辑* fallback 的类必须实现 Feign Client 的接口,无法知道熔断的异常信息*/Class<?> fallback() default void.class;/*** 定义容错的处理,可以知道熔断的异常信息。可以自定义fallbackFactory*/Class<?> fallbackFactory() default void.class;/*** 所有方法级映射使用的路径前缀*/String path() default "";/*** 对应的是 @Primary 注解,默认为 true*/boolean primary() default true;
}

2. 定义 Feign 配置类

public class FeignConfig {/*** 配置 FeignClient 合约类型* 1. SpringMvcContract,默认;* 2. Default;*/@Beanpublic Contract feignContract() {return new feign.Contract.Default();} /*** 配置 Feign Client 类型:* 1. Client.Default:默认,内部使用 HttpURLConnnection 完成URL请求处理;* 2. ApacheHttpClient:内部使用 Apache httpclient 完成请求处理;* 3. OkHttpClient:内部使用 OkHttp3 完成请求处理;* 4. FeignBlockingLoadBalancerClient:在其他 client 基础上封装 ribbon 技术完成请求处理;* 若引入 Spring Cloud LoadBalancer,则使用 FeignBlockingLoadBalancerClient。* 如果无,则使用默认 Feign 客户端。*/@Beanpublic Client feignClient() {return new Client.Default(null, null);// return new Client.Default(getSSLSocketFactory(), null);}/*** 停用 http ssl 证书检查*/private SSLSocketFactory getSSLSocketFactory() {try {SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();return sslContext.getSocketFactory();} catch (Exception ex) {throw new RuntimeException(ex);}}/*** 配置 Feign 日志级别:* NONE:默认,不显示任何日志* BASIC: 仅记录请求方法、URL、响应状态码及执行时间* HEADERS:除了BASIC中定义的信息之外,还有请求头和响应头信息* FULL:除了HEADERS中定义的信息之外,还有请求的正文和响应数据*/@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}/*** 配置 Feign 的超时时间 (毫秒):* connectTimeoutMillis 连接超时时间* readTimeoutMillis 请求处理时间*/@Beanpublic Request.Options options() {return new Request.Options(5000,10000);}/*** 注入自定义的拦截器*/@Beanpublic RequestInterceptor requestInterceptor() {return new RequestInterceptor(){@Overridepublic void apply(RequestTemplate template) {System.out.println("执行拦截器....");}}}
}

3. 定义 Feign 配置文件

feign:client:config:your-feign-ame:connectTimeout: 5000readTimeout: 5000loggerLevel: BASICerrorDecoder: com.example.SimpleErrorDecoderretryer: com.example.SimpleRetryerdefaultQueryParameters:query: queryValuedefaultRequestHeaders:header: headerValuerequestInterceptors:- com.example.FooRequestInterceptor- com.example.BarRequestInterceptordecode404: falseencoder: com.example.SimpleEncoderdecoder: com.example.SimpleDecodercontract: com.example.SimpleContractokhttp:enabled: true
logging:level:lxllyy.top.feign: debug

4. 配置 Feign 请求透传

public class FeignConfig { @Beanpublic RequestInterceptor requestInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {HttpServletRequest request = getHttpServletRequest();if (request != null) {//第一种 把header里所有的值都透传,简单粗暴Map<String, String> headers = getHeaders(request);for (String headerName : headers.keySet()) {template.header(headerName,getHeaders(getHttpServletRequest()).get(headerName));}//第二种 只针对性的传递想要的header里的值String x_access_token = request.getHeader("x-access-token");if (StringUtils.hasText(x_access_token)) {template.header("x-access-token", x_access_token);}}}private HttpServletRequest getHttpServletRequest() {try {return((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();} catch (Exception e) {e.printStackTrace();return null;}}private Map<String, String> getHeaders(HttpServletRequest request) {Map<String, String> map = new LinkedHashMap<>();Enumeration<String> enumeration = request.getHeaderNames();while (enumeration.hasMoreElements()) {String key = enumeration.nextElement();String value = request.getHeader(key);map.put(key, value);}return map;}};}
}

5. 配置 Feign 异常处理

@FeignClient(name = "service-provider1",fallback = UserFeignClientFallback.class,					// 不推荐fallbackFactory = UserFeignClientFallbackFactory.class		// 推荐
)
public interface UserFeignClient {@RequestMapping(value = "/getNameById/{id}",method = RequestMethod.GET)String getNameById(@PathVariable("id") Integer id);
}@Component
@Slf4j
public class UserFeignClientFallback implements UserFeignClient{@Overridepublic String getNameById(Integer str) {log.error("UserFeignClient #getNameById failed");return null;}
}@Component
@Slf4j
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient>{@Overridepublic UserFeignClient create(Throwable throwable) {log.error("异常原因:{}", throwable.getMessage(), throwable);return new UserFeignClient(){@Overridepublic Object getNameById(Integer str) {//出现异常,自定义返回内容,保证接口安全return null;}};}
}

6. 配置 Feign FastJson

public class MyFeignConfig {@Beanpublic Encoder feignEncoder() {return new SpringEncoder(feignHttpMessageConverter());}@Beanpublic Decoder feignDecoder() {return new SpringDecoder(feignHttpMessageConverter());}/*** 设置解码器为fastjson** @return*/private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter());return () -> httpMessageConverters;}private FastJsonHttpMessageConverter getFastJsonConverter() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();List<MediaType> supportedMediaTypes = new ArrayList<>();MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE);supportedMediaTypes.add(mediaTypeJson);converter.setSupportedMediaTypes(supportedMediaTypes);FastJsonConfig config = new FastJsonConfig();config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer());config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);converter.setFastJsonConfig(config);return converter;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CompletableFuture 详解

目录 简单介绍 常见操作 创建 CompletableFuture new 关键字 静态工厂方法 处理异步结算的结果 简单介绍 CompletableFuture 同时实现了 Future 和 CompletionStage 接口。 public class CompletableFuture<T> implements Future<T>, CompletionStage<T…

Android 11.0 系统限制上网系统之iptables用IOemNetd实现app上网白名单的功能实现

1.前言 在10.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置app上网白名单的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app上网白名单的的相关功能,就是在 系统中只能允许某个app上网,就是…

springboot通过接口执行本地shell脚本

首先创建springboot项目 shell脚本 #!/bin/shecho Hello World&#xff01;然后编写执行shell脚本的util类 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List;pub…

selenium-web自动化测试

一、selenium环境部署 1.准备chrome浏览器&#xff08;其他浏览器也行&#xff09; 2.准备chrome驱动包 步骤一&#xff1a;查看自己的谷歌浏览器版本(浏览器版本和驱动版本一定要对应) 步骤二&#xff1a;下载对应的驱动包, 下载路径 : ChromeDriver - WebDriver for Chrom…

初识IDA工具

工具 IDA工具 链接&#xff1a;https://pan.baidu.com/s/1Zgzpws6l2M5j1wkCZHrffw 提取码&#xff1a;ruyu 里面有安装密码&#xff1a; PassWord:qY2jts9hEJGy 里面分析32位和64位启动快捷方式 打开IDA工具&#xff0c;拖入so文件 ARM AND THUMB MODE SWITCH INSTRUCTION…

PyTorch BatchNorm2d详解

通常和卷积层&#xff0c;激活函数一起使用

视频传输网安全防护体系

在电脑、手机信息安全保护得到广泛关注和普及的今天&#xff0c;监控摄像头等设备的安全防护仍为大众所忽略&#xff0c;大量视频监控网络的前端设备和数据没有任何保护&#xff0c;完全暴露在互联网中。 前端IP接入设备与后端业务系统处于直连状态&#xff0c;一旦有攻击者或…

vue3项目中数字滚动效果

前言&#xff1a; 目前大多数新的vue项目都采用了vue3去写&#xff0c; 在最近的项目中&#xff0c;需要展示数字滚动的效果&#xff0c;我就想到了之前用多的vue-count-to数字滚动插件&#xff0c;发现这个插件只使用于vue2项目&#xff0c;在vue3项目中并不试用。。。由于自己…

spring boot项目整合spring security权限认证

一、准备一个spring boot项目 1、引入基础依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.sp…

自定义类型讲解

&#x1f495;痛苦难道是白忍受的吗&#xff1f;&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;自定义类型讲解 一.结构体 定义&#xff1a; 数组&#xff1a;多组相同类型元素的集合 结构体&#xff1a;多组不同类型元素的集合-->管理多组不同类型数据…

计算机视觉实验:人脸识别系统设计

实验内容 设计计算机视觉目标识别系统&#xff0c;与实际应用有关&#xff08;建议&#xff1a;最终展示形式为带界面可运行的系统&#xff09;&#xff0c;以下内容选择其中一个做。 1. 人脸识别系统设计 (1) 人脸识别系统设计&#xff08;必做&#xff09;&#xff1a;根据…

tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 -量勺

tinkerCAD案例&#xff1a;24. Ruler - Measuring Lengths 标尺 - 测量长度 Project Overview: 项目概况&#xff1a; A machine shop, where any idea can become a reality, can cost millions and million of dollars. Still, the most important tool in the shop is the…

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

Android 面试题 应用程序结构 十

&#x1f525; Intent 传递数据 &#x1f525; Activity、Service、BroadcastReceiver之间的通信载体 Intent 来传递数据。而ContentProvider则是共享文件。 Intent可传递的数据类型&#xff1a; a. 8种基本数据类型&#xff08;boolean byte char short int long float double…

如何配置一个永久固定的公网TCP地址来SSH远程树莓派?

文章目录 如何配置一个永久固定的公网TCP地址来SSH远程树莓派&#xff1f;前置条件命令行使用举例&#xff1a;修改cpolar配置文件 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 …

第1集丨Vue 江湖 —— Hello Vue

目录 一、简介1.1 参考网址1.2 下载 二、Hello Vue2.1 创建页面2.2 安装Live Server插件2.4 安装 vue-devtools2.5 预览效果 一、简介 Vue&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设…

app自动化测试之Appium问题分析及定位

使用 Appium 进行测试时&#xff0c;会产生大量日志&#xff0c;一旦运行过程中遇到报错&#xff0c;可以通过 Appium 服务端的日志以及客户端的日志分析排查问题。 Appium Server日志-开启服务 通过命令行的方式启动 Appium Server&#xff0c;下面来分析一下启动日志&#…

使用web-view实现网页端和uni-app端是数据传输

要实现这个功能 第一步&#xff1a;要在vue的public文件夹下面引入 <script type"text/javascript" src"https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script> 第二步&#xff1a;建立一个新的空的uni-app项目…

DHorse v1.3.0 发布,基于k8s的发布平台

综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统&#xff0c;具有持续集成、持续部署、微服务治理等功能&#xff0c;无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用&#xff0c;主要特点&#xff1a;部署简单、操作简洁、功能快速。 新增特…