Skip to content
Merged

A #14

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<groupId>cn.springcloud.gray</groupId>
<artifactId>spring-cloud-gray</artifactId>
<packaging>pom</packaging>
<version>2.1.0</version>
<version>A.1.0.1</version>
<url>https://github.com/SpringCloud/spring-cloud-gray</url>
<organization>
<name>Spring Cloud中国社区</name>
Expand Down
7 changes: 6 additions & 1 deletion spring-cloud-gray-client-netflix/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>spring-cloud-gray</artifactId>
<groupId>cn.springcloud.gray</groupId>
<version>2.1.0</version>
<version>A.1.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down Expand Up @@ -50,6 +50,11 @@
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.springcloud.gray.client.netflix.configuration;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.InstanceLocalInfo;
import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceDiscoveryClient;
import cn.springcloud.gray.client.netflix.eureka.EurekaServerExplainer;
Expand All @@ -15,7 +16,7 @@
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnBean(EurekaClient.class)
@ConditionalOnBean({GrayManager.class, EurekaClient.class})
public class GrayClientEurekaAutoConfiguration {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package cn.springcloud.gray.client.netflix.configuration;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.netflix.connectionpoint.DefaultHystrixRibbonConnectionPoint;
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
import cn.springcloud.gray.request.RequestLocalStorage;
import cn.springcloud.gray.request.track.GrayTrackHolder;
import cn.springcloud.gray.web.GrayTrackFilter;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import feign.hystrix.HystrixFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -20,20 +22,30 @@
import java.io.IOException;

@Configuration
@ConditionalOnBean(GrayManager.class)
@ConditionalOnClass({HystrixCommand.class, HystrixFeign.class})
//@Import(HystrixGrayTrackWebConfiguration.class)
public class HystrixGrayAutoConfiguration {


@Autowired
private GrayManager grayManager;


@Bean
public RequestLocalStorage requestLocalStorage() {
return new HystrixRequestLocalStorage();
}


/**
* 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest
*
* @return DefaultHystrixRibbonConnectionPoint
*/
@Bean
public RibbonConnectionPoint hystrixRibbonConnectionPoint(
GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage);
}


@Bean
public GrayTrackFilter grayTrackFilter(
GrayTrackHolder grayTrackHolder,
Expand All @@ -54,5 +66,4 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
}
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import cn.springcloud.gray.client.netflix.ribbon.configuration.GrayRibbonClientsConfiguration;
import cn.springcloud.gray.request.RequestLocalStorage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnBean(GrayManager.class)
@RibbonClients(defaultConfiguration = GrayRibbonClientsConfiguration.class)
public class NetflixGrayAutoConfiguration {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package cn.springcloud.gray.client.netflix.connectionpoint;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.request.RequestLocalStorage;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;

public class DefaultHystrixRibbonConnectionPoint extends DefaultRibbonConnectionPoint {

private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();

public DefaultHystrixRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
super(grayManager, requestLocalStorage);
}


@Override
public void executeConnectPoint(ConnectPointContext connectPointContext) {
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
HystrixRequestContext.initializeContext();
hystrixRequestContextInitialized.set(true);
}
super.executeConnectPoint(connectPointContext);
}

@Override
public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
try {
super.shutdownconnectPoint(connectPointContext);
} finally {
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
HystrixRequestContext.getContextForCurrentThread().shutdown();
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
import cn.springcloud.gray.RequestInterceptor;
import cn.springcloud.gray.request.GrayRequest;
import cn.springcloud.gray.request.RequestLocalStorage;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;

import java.util.List;

public class DefaultRibbonConnectionPoint implements RibbonConnectionPoint {

private GrayManager grayManager;
private RequestLocalStorage requestLocalStorage;
private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();

public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
this.grayManager = grayManager;
Expand All @@ -22,11 +20,6 @@ public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage
@Override
public void executeConnectPoint(ConnectPointContext connectPointContext) {

if (!HystrixRequestContext.isCurrentThreadInitialized()) {
HystrixRequestContext.initializeContext();
hystrixRequestContextInitialized.set(true);
}

ConnectPointContext.setContextLocal(connectPointContext);
GrayRequest grayRequest = connectPointContext.getGrayRequest();
grayRequest.setGrayTrackInfo(requestLocalStorage.getGrayTrackInfo());
Expand All @@ -45,28 +38,21 @@ public void executeConnectPoint(ConnectPointContext connectPointContext) {

@Override
public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
try {
if (requestLocalStorage.getGrayRequest() == null) {
return;
}
// if (requestLocalStorage.getGrayRequest() == null) {
// return;
// }

List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
interceptors.forEach(interceptor -> {
if (interceptor.shouldIntercept()) {
if (!interceptor.after(connectPointContext.getGrayRequest())) {
return;
}
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
interceptors.forEach(interceptor -> {
if (interceptor.shouldIntercept()) {
if (!interceptor.after(connectPointContext.getGrayRequest())) {
return;
}
});
ConnectPointContext.removeContextLocal();
requestLocalStorage.removeGrayTrackInfo();
requestLocalStorage.removeGrayRequest();
} finally {
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
HystrixRequestContext.getContextForCurrentThread().shutdown();
}
}
});
ConnectPointContext.removeContextLocal();
requestLocalStorage.removeGrayTrackInfo();
requestLocalStorage.removeGrayRequest();
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package cn.springcloud.gray.client.netflix.feign.configuration;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.netflix.configuration.HystrixGrayAutoConfiguration;
import cn.springcloud.gray.client.netflix.feign.GrayTrackFeignRequestInterceptor;
import cn.springcloud.gray.request.RequestLocalStorage;
import com.netflix.loadbalancer.ILoadBalancer;
import feign.Feign;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
Expand All @@ -14,8 +16,9 @@
/**
* Created by saleson on 2017/11/9.
*/
@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class})
@Configuration
@ConditionalOnBean(GrayManager.class)
@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class})
@EnableFeignClients(defaultConfiguration = {GrayFeignClientsConfiguration.class})
public class GrayFeignAutoConfiguration {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package cn.springcloud.gray.client.netflix.resttemplate.configuration;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
import cn.springcloud.gray.client.netflix.resttemplate.GrayClientHttpRequestIntercptor;
import cn.springcloud.gray.client.netflix.resttemplate.RestTemplateRequestInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
Expand All @@ -16,7 +17,8 @@
import java.util.List;

@Configuration
@ConditionalOnClass(value = RestTemplate.class)
@ConditionalOnBean({GrayManager.class, RestTemplate.class})
@ConditionalOnClass(value = {RestTemplate.class, LoadBalanced.class})
public class GrayRestTemplateAutoConfiguration {

@Autowired
Expand All @@ -26,20 +28,13 @@ public class GrayRestTemplateAutoConfiguration {


@Bean
@LoadBalanced
@ConditionalOnMissingBean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// restTemplate.getInterceptors().add(grayClientHttpRequestIntercptor);
return restTemplate;
}


@Bean
public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List<RestTemplate> restTemplates) {
public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(
@Autowired(required = false) @LoadBalanced List<RestTemplate> restTemplates) {
GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor(
grayRequestProperties, ribbonConnectionPoint);
restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor));
if (restTemplates != null) {
restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor));
}
return intercptor;
}

Expand All @@ -48,7 +43,6 @@ public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBala
@ConditionalOnProperty(value = "gray.request.track.enabled", matchIfMissing = true)
public static class GrayTrackRestTemplateConfiguration {


@Bean
public RestTemplateRequestInterceptor restTemplateRequestInterceptor() {
return new RestTemplateRequestInterceptor();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.netflix.GrayClientHolder;
import cn.springcloud.gray.model.GrayService;
import cn.springcloud.gray.servernode.ServerExplainer;
import cn.springcloud.gray.request.GrayRequest;
import cn.springcloud.gray.request.RequestLocalStorage;
import cn.springcloud.gray.servernode.ServerExplainer;
import com.google.common.base.Optional;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.*;
Expand Down Expand Up @@ -61,7 +61,7 @@ public Server choose(Object key) {
GrayService grayService = grayManager.getGrayService(serviceId);
List<Server> servers = lb.getAllServers();
List<Server> grayServers = new ArrayList<>(grayService.getGrayInstances().size());
List<Server> normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size());
List<Server> normalServers = new ArrayList<>(Math.min(servers.size(), grayService.getGrayInstances().size()));

for (Server server : servers) {
// ServerSpec serverSpec = serverExplainer.apply(server);
Expand Down Expand Up @@ -93,7 +93,7 @@ public void setLoadBalancer(ILoadBalancer lb) {
super.setLoadBalancer(lb);
}

private Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {
protected Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {
Optional<Server> server = serverPredicate.chooseRoundRobinAfterFiltering(servers, key);
if (server.isPresent()) {
return server.get();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.springcloud.gray.client.netflix.zuul.configuration;

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
import cn.springcloud.gray.client.netflix.configuration.HystrixGrayAutoConfiguration;
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
Expand All @@ -8,12 +9,14 @@
import cn.springcloud.gray.client.netflix.zuul.ZuulRequestInterceptor;
import com.netflix.zuul.http.ZuulServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnBean(GrayManager.class)
@ConditionalOnClass(value = ZuulServlet.class)
public class GrayZuulAutoConfiguration {

Expand Down
7 changes: 6 additions & 1 deletion spring-cloud-gray-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>spring-cloud-gray</artifactId>
<groupId>cn.springcloud.gray</groupId>
<version>2.1.0</version>
<version>A.1.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down Expand Up @@ -63,6 +63,11 @@
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<scope>compile</scope>
</dependency>

</dependencies>

Expand Down
Loading