Spring Cloud Alibaba-全局配置自定义和支持的配置项

一、全局配置自定义1、代码配置

  • 方式一:让父子上下文ComponentScan重叠(强烈不建议使用)
    @Configurationpublic class StockFeignConfiguration {/*** 日志级别* 通过源码可以看到日志等级有 4 种,分别是:* NONE:不输出日志 。* BASIC:只输出请求方法的 URL 和响应的状态码以及接口执行的时间 。* HEADERS:将 BASIC 信息和请求头信息输出 。* FULL:输出完整的请求信息 。*/@Beanpublic Logger.Level level(){return Logger.Level.FULL;}}
  • 方式二【唯一正确的途径】: EnableFeignClients(defaultConfiguration=xxx.class)

Spring Cloud Alibaba-全局配置自定义和支持的配置项

文章插图

Spring Cloud Alibaba-全局配置自定义和支持的配置项

文章插图
2、属性配置logging:level:com.nx: debugfeign:client:config:default:loggerLevel: full二、 支持的配置项1、契约配置Spring Cloud 在 Feign 的基础上做了扩展,可以让 Feign 支持 Spring MVC 的注解来调用 。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式来定义客户端也是 可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是 SpringMvcContract 。
1.1代码方式/*** 修改契约配置,这里仅仅支持Feign原生注解* 这里是一个扩展点,如果我们想支持其他的注解,可以更改Contract的实现类 。* @return*/@Beanpublic Contract feignContract(){return new Contract.Default();}注意:这里修改了契约配置之后,我们就只能用Fegin的原生注解
Spring Cloud Alibaba-全局配置自定义和支持的配置项

文章插图
1.2 属性方式
Spring Cloud Alibaba-全局配置自定义和支持的配置项

文章插图
2、编解码Feign 中提供了自定义的编码解码器设置,同时也提供了多种编码器的实现,比如 Gson、Jaxb、Jackson 。我们可以用不同的编码解码器来处理数据的传输 。。
扩展点:Encoder & Decoder
默认我们使用:SpringEncoder和SpringDecoder
package feign.codec;public interface Encoder {void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException;}复制代码package feign.codec;public interface Decoder {Object decode(Response response, Type type) throws IOException, DecodeException, FeignException;}复制代码2.1 代码方式@Beanpublic Decoder decoder(){return new CustomDecoder();}@Beanpublic Encoder encoder(){return new CustomEncoder();}复制代码2.2 属性方式feign:client:config:#想要调用的微服务的名称msb-user:encoder: com.xxx.CustomDecoderdecoder: com.xxx..CustomEncoder复制代码3、拦截器通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头 去传递认证信息,比如 Basic 认证方式 。
3.1 扩展点:package feign;public interface RequestInterceptor {void Apply(RequestTemplate template);}复制代码3.2 使用场景
  1. 统一添加 header 信息;
  2. 对 body 中的信息做修改或替换;
3.3 自定义逻辑package com.msb.order.interceptor;import feign.RequestInterceptor;import feign.RequestTemplate;public class FeignAuthRequestInterceptor implements RequestInterceptor {private String tokenId;public FeignAuthRequestInterceptor(String tokenId) {this.tokenId = tokenId;}@Overridepublic void apply(RequestTemplate template) {template.header("Authorization",tokenId);}}复制代码package com.msb.order.configuration;import com.msb.order.interceptor.FeignAuthRequestInterceptor;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FeignConfig {@Value("${feign.tokenId}")private String tokenId;/*** 自定义拦截器* @return*/@Beanpublic FeignAuthRequestInterceptor feignAuthRequestInterceptor(){return new FeignAuthRequestInterceptor(tokenId);}}复制代码feign:tokenId: d874528b-a9d9-46df-ad90-b92f87ccc557复制代码在msb-stock项目中增加springmvc中的拦截器
拦截器代码:
package com.msb.stock.interceptor;import JAVAx.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Slf4jpublic class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {boolean flag = true;// 逻辑认证String authorization = request.getHeader("Authorization");log.info("获取的认证信息 Authorization:{}",authorization);if(StringUtils.hasText(authorization)){return true;}return false;}}复制代码


推荐阅读