Commit 6c1e1f91 authored by 杨锐's avatar 杨锐

Merge branch 'feature_0.3.0'

# Conflicts:
#	brave-spring-boot-starter/pom.xml
#	commons-core/pom.xml
#	commons-spring/pom.xml
#	elastic-job-lite-spring-boot-starter/pom.xml
#	enoch-agent-spring-boot-starter/pom.xml
#	idgenerator-spring-boot-starter/pom.xml
#	pom.xml
#	shutdown-spring-boot-starter/pom.xml
parents 32fff151 d6a8aa68
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
package cn.quantgroup.tech.brave.configuration;
import cn.quantgroup.tech.brave.interceptor.*;
import cn.quantgroup.tech.brave.interceptor.impl.*;
import cn.quantgroup.tech.brave.job.TokenJob;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AuthAutoConfiguration {
@Configuration
public static class NoAuthConfiguration {
@Bean
@ConditionalOnMissingBean(HttpClientRequestInterceptor.class)
public HttpClientRequestInterceptor httpClientRequestInterceptor() {
return new HttpClientNoAuthRequestInterceptor();
}
@Bean
@ConditionalOnMissingBean(OkHttpClientInterceptor.class)
public OkHttpClientInterceptor okHttpClientInterceptor() {
return new OkHttpClientNoAuthInterceptor();
}
@Bean
@ConditionalOnMissingBean(RestTemplateRequestInterceptor.class)
public RestTemplateRequestInterceptor restTemplateRequestInterceptor() {
return new RestTemplateNoAuthRequestInterceptor();
}
}
@Configuration
@ConditionalOnProperty(prefix = "quant.auth", name = {"http", "clientId", "secret", "tokenUrl"})
public static class AuthConfiguration {
@Bean
public HttpClientRequestInterceptor httpClientRequestInterceptor() {
return new HttpClientAuthRequestInterceptor();
}
@Bean
public OkHttpClientInterceptor okHttpClientInterceptor() {
return new OkHttpClientAuthInterceptor();
}
@Bean
public RestTemplateRequestInterceptor restTemplateRequestInterceptor() {
return new RestTemplateAuthRequestInterceptor();
}
@Bean
public TokenJob tokenJob() {
return new TokenJob();
}
}
}
package cn.quantgroup.tech.brave.handler;
public class TokenHandler {
private static String token;
public static void setToken(String token) {
TokenHandler.token = token;
}
public static String getToken() {
return token;
}
}
package cn.quantgroup.tech.brave.interceptor;
import org.apache.http.HttpRequestInterceptor;
public interface HttpClientRequestInterceptor extends HttpRequestInterceptor {
}
package cn.quantgroup.tech.brave.interceptor;
import okhttp3.Interceptor;
public interface OkHttpClientInterceptor extends Interceptor {
}
package cn.quantgroup.tech.brave.interceptor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Slf4j
public abstract class RequestInterceptor {
@Data
static class AuthInfoInMemory {
private static List<String> hosts = new ArrayList<>();
private static long expiration;
}
protected static final String AUTH = "quant-auth";
// 内网
@Value("#{'${quant.auth.http}'.split(',')}")
List<String> authHttpList;
protected boolean auth(String host) {
if (authHttpList == null || authHttpList.isEmpty()) {
return false;
}
if(AuthInfoInMemory.hosts.isEmpty() || System.currentTimeMillis() > AuthInfoInMemory.expiration){
hostsCache();
}
return AuthInfoInMemory.hosts.contains(host);
}
private void hostsCache() {
AuthInfoInMemory.hosts = authHttpList.stream()
.map(RequestInterceptor::apply)
.filter(Optional::isPresent)
.map(Optional::get)
.map(URL::getHost)
.collect(Collectors.toList());
AuthInfoInMemory.expiration = System.currentTimeMillis() + 30 * 60 * 60 * 1000;
}
private static Optional<URL> apply(String http) {
URL url = null;
try {
url = new URL(http);
} catch (MalformedURLException e) {
log.error("无效quant.auth.http = 【{}】", http);
}
return Optional.ofNullable(url);
}
}
package cn.quantgroup.tech.brave.interceptor;
import org.springframework.http.client.ClientHttpRequestInterceptor;
public interface RestTemplateRequestInterceptor extends ClientHttpRequestInterceptor {
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.handler.TokenHandler;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import cn.quantgroup.tech.brave.interceptor.RequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpRequest;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.protocol.HttpContext;
@Slf4j
public class HttpClientAuthRequestInterceptor extends RequestInterceptor implements HttpClientRequestInterceptor {
@Override
public void process(HttpRequest httpRequest, HttpContext httpContext) {
if (auth(((HttpRequestWrapper) httpRequest).getTarget().getHostName())) {
log.info("cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor.process token = 【{}】 ", TokenHandler.getToken());
httpRequest.addHeader(AUTH, TokenHandler.getToken());
}
}
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpRequest;
import org.apache.http.protocol.HttpContext;
@Slf4j
public class HttpClientNoAuthRequestInterceptor implements HttpClientRequestInterceptor {
@Override
public void process(HttpRequest httpRequest, HttpContext httpContext) {
// nothing to do
}
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.handler.TokenHandler;
import cn.quantgroup.tech.brave.interceptor.OkHttpClientInterceptor;
import cn.quantgroup.tech.brave.interceptor.RequestInterceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpClientAuthInterceptor extends RequestInterceptor implements OkHttpClientInterceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.addHeader(AUTH, TokenHandler.getToken());
return chain.proceed(requestBuilder.build());
}
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.interceptor.OkHttpClientInterceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpClientNoAuthInterceptor implements OkHttpClientInterceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder requestBuilder = request.newBuilder();
return chain.proceed(requestBuilder.build());
}
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.handler.TokenHandler;
import cn.quantgroup.tech.brave.interceptor.RequestInterceptor;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
@Slf4j
public class RestTemplateAuthRequestInterceptor extends RequestInterceptor implements RestTemplateRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
if (auth(request.getURI().getHost())) {
log.info("cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor.intercept token = 【{}】 ", TokenHandler.getToken());
request.getHeaders().add(AUTH, TokenHandler.getToken());
}
return execution.execute(request, body);
}
}
package cn.quantgroup.tech.brave.interceptor.impl;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
@Slf4j
public class RestTemplateNoAuthRequestInterceptor implements RestTemplateRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
return execution.execute(request, body);
}
}
package cn.quantgroup.tech.brave.job;
import cn.quantgroup.tech.brave.handler.TokenHandler;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Base64;
import java.util.Map;
@Data
class TokenResp {
private Integer code;
@JsonProperty("access_token")
private String token;
@JsonProperty("expires_in")
private Integer expires;
}
@Slf4j
@EnableScheduling
public class TokenJob {
private static final String CREDENTIAL = "credential";
private static final int SUCCESS = 200;
@Value("${quant.auth.clientId}")
private String clientId;
@Value("${quant.auth.secret}")
private String secret;
@Value("${quant.auth.tokenUrl}")
private String tokenUrl;
@Resource
private ITechRestTemplateBuilder techRestTemplateBuilder;
@Bean
public RestTemplate restTemplate() {
return techRestTemplateBuilder.createRestTemplate();
}
@Scheduled(fixedRate = 1000 * 60 * 30)
public void getToken() {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add(CREDENTIAL, base64ForCredential());
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(requestHeaders);
TokenResp tokenResp = restTemplate().postForObject(tokenUrl, httpEntity, TokenResp.class);
log.info("getToken tokenResp = 【{}】", tokenResp);
boolean tokenValid = tokenResp != null && SUCCESS == tokenResp.getCode() && StringUtils.isNotBlank(tokenResp.getToken());
if (tokenValid) {
TokenHandler.setToken(tokenResp.getToken());
}
}
private String base64ForCredential() {
String credential = clientId + ":" + secret;
return Base64.getEncoder().encodeToString(credential.getBytes());
}
}
package cn.quantgroup.tech.brave.service.impl;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.HttpClientBuilder;
import javax.annotation.Resource;
/**
* @author zhangheng
* create on 2018.05.17
*/
@Slf4j
public class TechHttpClientNoTrace implements ITechHttpClient{
@Resource
private HttpClientRequestInterceptor httpClientRequestInterceptor;
@Override
public HttpClientBuilder createHttpClientBuilder() {
log.info("构建HttpClientBuilder");
return HttpClientBuilder.create();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.addInterceptorFirst(httpClientRequestInterceptor);
return httpClientBuilder;
}
}
......@@ -2,10 +2,13 @@ package cn.quantgroup.tech.brave.service.impl;
import brave.Tracing;
import brave.httpclient.TracingHttpClientBuilder;
import cn.quantgroup.tech.brave.interceptor.HttpClientRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.HttpClientBuilder;
import javax.annotation.Resource;
/**
* @author zhangheng
* create on 2018.05.17
......@@ -18,9 +21,14 @@ public class TechHttpClientTrace implements ITechHttpClient {
this.tracing = tracing;
}
@Resource
private HttpClientRequestInterceptor httpClientRequestInterceptor;
@Override
public HttpClientBuilder createHttpClientBuilder() {
log.info("构建brave-HttpClientBuilder");
return TracingHttpClientBuilder.create(tracing);
HttpClientBuilder httpClientBuilder = TracingHttpClientBuilder.create(tracing);
httpClientBuilder.addInterceptorFirst(httpClientRequestInterceptor);
return httpClientBuilder;
}
}
package cn.quantgroup.tech.brave.service.impl;
import cn.quantgroup.tech.brave.interceptor.OkHttpClientInterceptor;
import cn.quantgroup.tech.brave.service.ITechOkHttpClient;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import javax.annotation.Resource;
/**
* @author zhangheng
* create on 2018.05.17
*/
@Slf4j
public class TechOkHttpClientNoTrace implements ITechOkHttpClient{
public class TechOkHttpClientNoTrace implements ITechOkHttpClient {
@Resource
private OkHttpClientInterceptor okHttpClientInterceptor;
@Override
public OkHttpClient.Builder createOkHttpClientBuilder() {
log.info("构建OkHttpClient.Builder");
return new OkHttpClient.Builder();
return new OkHttpClient.Builder().addNetworkInterceptor(okHttpClientInterceptor);
}
}
......@@ -3,11 +3,14 @@ package cn.quantgroup.tech.brave.service.impl;
import brave.Tracing;
import brave.http.HttpTracing;
import brave.okhttp3.TracingInterceptor;
import cn.quantgroup.tech.brave.interceptor.OkHttpClientInterceptor;
import cn.quantgroup.tech.brave.service.ITechOkHttpClient;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Dispatcher;
import okhttp3.OkHttpClient;
import javax.annotation.Resource;
/**
* @author zhangheng
* create on 2018.05.17
......@@ -20,12 +23,16 @@ public class TechOkHttpClientTrace implements ITechOkHttpClient{
this.tracing = tracing;
}
@Resource
private OkHttpClientInterceptor okHttpClientInterceptor;
@Override
public OkHttpClient.Builder createOkHttpClientBuilder() {
log.info("构建brave-OkHttpClient.Builder");
HttpTracing httpTracing = HttpTracing.create(tracing);
return new OkHttpClient.Builder()
.dispatcher(new Dispatcher(httpTracing.tracing().currentTraceContext().executorService(new Dispatcher().executorService())))
.addNetworkInterceptor(TracingInterceptor.create(httpTracing));
.addNetworkInterceptor(TracingInterceptor.create(httpTracing))
.addNetworkInterceptor(okHttpClientInterceptor);
}
}
package cn.quantgroup.tech.brave.service.impl;
import brave.spring.web.TracingClientHttpRequestInterceptor;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -8,6 +9,7 @@ import org.springframework.context.annotation.Import;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
......@@ -20,6 +22,8 @@ import java.util.List;
public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder {
@Autowired
private TracingClientHttpRequestInterceptor clientInterceptor;
@Resource
private RestTemplateRequestInterceptor restTemplateRequestInterceptor;
@Override
public RestTemplate createRestTemplate() {
......@@ -27,6 +31,7 @@ public class TechRestTemplateBuilderTrace implements ITechRestTemplateBuilder {
RestTemplate restTemplate = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(restTemplate.getInterceptors());
interceptors.add(clientInterceptor);
interceptors.add(restTemplateRequestInterceptor);
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
......
package cn.quantgroup.tech.brave.service.impl;
import cn.quantgroup.tech.brave.interceptor.RestTemplateRequestInterceptor;
import cn.quantgroup.tech.brave.service.ITechRestTemplateBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangheng
* create on 2018.05.17
*/
@Slf4j
public class TechRestTemplateBuliderNoTrace implements ITechRestTemplateBuilder {
@Resource
private RestTemplateRequestInterceptor restTemplateRequestInterceptor;
@Override
public RestTemplate createRestTemplate() {
log.info("构建RestTemplate");
return new RestTemplate();
RestTemplate restTemplate = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(restTemplate.getInterceptors());
interceptors.add(restTemplateRequestInterceptor);
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.quantgroup.tech.brave.configuration.BraveAutoConfiguration
\ No newline at end of file
cn.quantgroup.tech.brave.configuration.BraveAutoConfiguration,\
cn.quantgroup.tech.brave.configuration.AuthAutoConfiguration
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<groupId>cn.quantgroup</groupId>
<artifactId>enoch-agent-spring-boot-starter</artifactId>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>cn.quantgroup</groupId>
<artifactId>commons-parent</artifactId>
<version>0.2.6.2</version>
<version>0.3.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
......@@ -35,7 +35,7 @@
<lombok.version>1.16.20</lombok.version>
<guava.version>23.0</guava.version>
<apollo.client.version>0.10.2</apollo.client.version>
<common.parent.version>0.2.6.2</common.parent.version>
<common.parent.version>0.2.6</common.parent.version>
</properties>
<dependencies>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>commons-parent</artifactId>
<groupId>cn.quantgroup</groupId>
<version>0.2.6.2</version>
<version>0.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
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