Commit c0517136 by Nepxion

增加RestTemplateStrategyInterceptor

parent c2da9dfb
......@@ -24,13 +24,13 @@ import org.springframework.web.context.request.ServletRequestAttributes;
public class FeignStrategyInterceptor implements RequestInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(FeignStrategyInterceptor.class);
private String feignHeaders;
private String requestHeaders;
public FeignStrategyInterceptor(String feignHeaders) {
this.feignHeaders = feignHeaders.toLowerCase();
public FeignStrategyInterceptor(String requestHeaders) {
this.requestHeaders = requestHeaders.toLowerCase();
LOG.info("------------- Feign Proxy Information -----------");
LOG.info("Feign interceptor headers are '{}'", feignHeaders);
LOG.info("Feign interceptor headers are '{}'", requestHeaders);
LOG.info("-------------------------------------------------");
}
......@@ -41,18 +41,18 @@ public class FeignStrategyInterceptor implements RequestInterceptor {
return;
}
HttpServletRequest request = attributes.getRequest();
HttpServletRequest previousRequest = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
Enumeration<String> headerNames = previousRequest.getHeaderNames();
if (headerNames == null) {
return;
}
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String header = request.getHeader(headerName);
String header = previousRequest.getHeader(headerName);
if (feignHeaders.contains(headerName.toLowerCase())) {
if (requestHeaders.contains(headerName.toLowerCase())) {
requestTemplate.header(headerName, header);
}
}
......
package com.nepxion.discovery.plugin.strategy.service.aop;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class RestTemplateStrategyInterceptor implements ClientHttpRequestInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(RestTemplateStrategyInterceptor.class);
private String requestHeaders;
public RestTemplateStrategyInterceptor(String requestHeaders) {
this.requestHeaders = requestHeaders.toLowerCase();
LOG.info("------------- RestTemplate Proxy Information -----------");
LOG.info("RestTemplate interceptor headers are '{}'", requestHeaders);
LOG.info("-------------------------------------------------");
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
return execution.execute(request, body);
}
HttpServletRequest previousRequest = attributes.getRequest();
Enumeration<String> headerNames = previousRequest.getHeaderNames();
if (headerNames == null) {
return execution.execute(request, body);
}
HttpHeaders headers = request.getHeaders();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String header = previousRequest.getHeader(headerName);
if (requestHeaders.contains(headerName.toLowerCase())) {
headers.add(headerName, header);
}
}
return execution.execute(request, body);
}
}
\ No newline at end of file
......@@ -23,6 +23,7 @@ import com.nepxion.discovery.plugin.strategy.adapter.DiscoveryEnabledAdapter;
import com.nepxion.discovery.plugin.strategy.constant.StrategyConstant;
import com.nepxion.discovery.plugin.strategy.service.adapter.DefaultDiscoveryEnabledAdapter;
import com.nepxion.discovery.plugin.strategy.service.aop.FeignStrategyInterceptor;
import com.nepxion.discovery.plugin.strategy.service.aop.RestTemplateStrategyInterceptor;
import com.nepxion.discovery.plugin.strategy.service.aop.ServiceStrategyAutoScanProxy;
import com.nepxion.discovery.plugin.strategy.service.aop.ServiceStrategyInterceptor;
import com.nepxion.discovery.plugin.strategy.service.constant.ServiceStrategyConstant;
......@@ -34,14 +35,14 @@ public class ServiceStrategyAutoConfiguration {
@Value("${" + ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES + ":}")
private String scanPackages;
@Value("${" + ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_FEIGN_HEADERS + ":}")
private String feignHeaders;
@Value("${" + ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS + ":}")
private String requestHeaders;
@Bean
@ConditionalOnProperty(value = ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES, matchIfMissing = false)
public ServiceStrategyAutoScanProxy serviceStrategyAutoScanProxy() {
if (StringUtils.isEmpty(scanPackages)) {
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES + " can't be empty, or you can't remove it");
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES + "'s value can't be empty, remove it if useless");
}
if (ServiceStrategyConstant.EXCLUSION_SCAN_PACKAGES.contains(scanPackages)) {
......@@ -55,7 +56,7 @@ public class ServiceStrategyAutoConfiguration {
@ConditionalOnProperty(value = ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES, matchIfMissing = false)
public ServiceStrategyInterceptor serviceStrategyInterceptor() {
if (StringUtils.isEmpty(scanPackages)) {
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES + " can't be empty, or you can't remove it");
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES + " can't be empty, remove it if useless");
}
if (ServiceStrategyConstant.EXCLUSION_SCAN_PACKAGES.contains(scanPackages)) {
......@@ -66,9 +67,23 @@ public class ServiceStrategyAutoConfiguration {
}
@Bean
@ConditionalOnProperty(value = ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_FEIGN_HEADERS, matchIfMissing = false)
@ConditionalOnProperty(value = ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS, matchIfMissing = false)
public FeignStrategyInterceptor feignStrategyInterceptor() {
return new FeignStrategyInterceptor(feignHeaders);
if (StringUtils.isEmpty(requestHeaders)) {
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS + " can't be empty, remove it if useless");
}
return new FeignStrategyInterceptor(requestHeaders);
}
@Bean
@ConditionalOnProperty(value = ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS, matchIfMissing = false)
public RestTemplateStrategyInterceptor restTemplateStrategyInterceptor() {
if (StringUtils.isEmpty(requestHeaders)) {
throw new DiscoveryException(ServiceStrategyConstant.SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS + " can't be empty, remove it if useless");
}
return new RestTemplateStrategyInterceptor(requestHeaders);
}
@Bean
......
......@@ -11,7 +11,7 @@ package com.nepxion.discovery.plugin.strategy.service.constant;
public class ServiceStrategyConstant {
public static final String SPRING_APPLICATION_STRATEGY_SCAN_PACKAGES = "spring.application.strategy.scan.packages";
public static final String SPRING_APPLICATION_STRATEGY_FEIGN_HEADERS = "spring.application.strategy.feign.headers";
public static final String SPRING_APPLICATION_STRATEGY_REQUEST_HEADERS = "spring.application.strategy.request.headers";
public static final String CLASS = "class";
public static final String METHOD = "method";
public static final String PARAMETER_MAP = "parameterMap";
......
......@@ -67,7 +67,7 @@ spring.boot.admin.url=http://localhost:5555
# spring.application.strategy.control.enabled=true
# 开启和关闭Ribbon默认的ZoneAvoidanceRule负载均衡策略。一旦关闭,则使用RoundRobin简单轮询负载均衡策略。缺失则默认为true
# spring.application.strategy.zone.avoidance.rule.enabled=true
# 用户自定义和编程灰度路由策略的时候,需要指定对业务Controller类的扫描路径,以便传递上下文对象。该项配置只对服务有效,对网关无效。缺失则默认关闭该功能
# 用户自定义和编程灰度路由策略的时候,对RPC方法调用拦截的时候,需要指定对业务Controller类的扫描路径,以便传递上下文对象。该项配置只对服务有效,对网关无效。缺失则默认关闭该功能
spring.application.strategy.scan.packages=com.nepxion.discovery.plugin.example.service.feign
# 用户自定义和编程灰度路由策略的时候,如果采用Feign进行Rest调用,需要把来自网关的某些Header参数传递到服务里,如果多个用“;”分隔,不允许出现空格。该项配置只对服务有效,对网关无效。缺失则默认关闭该功能
spring.application.strategy.feign.headers=version;region;token
\ No newline at end of file
# 用户自定义和编程灰度路由策略的时候,对REST调用拦截的时候(支持Feign或者RestTemplate调用),需要把来自外部的指定Header参数传递到服务里,如果多个用“;”分隔,不允许出现空格。该项配置只对服务有效,对网关无效。缺失则默认关闭该功能
spring.application.strategy.request.headers=version;region;token
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment