Skip to content
Merged

2.0 #12

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.0.0</version>
<version>2.1.0</version>
<url>https://github.com/SpringCloud/spring-cloud-gray</url>
<organization>
<name>Spring Cloud中国社区</name>
Expand Down
2 changes: 1 addition & 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.0.0</version>
<version>2.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
import cn.springcloud.gray.request.GrayHttpTrackInfo;
import cn.springcloud.gray.request.GrayInfoTracker;
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;
Expand All @@ -18,9 +17,7 @@
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;

@Configuration
@ConditionalOnClass({HystrixCommand.class, HystrixFeign.class})
Expand All @@ -39,9 +36,9 @@ public RequestLocalStorage requestLocalStorage() {

@Bean
public GrayTrackFilter grayTrackFilter(
RequestLocalStorage requestLocalStorage,
List<GrayInfoTracker<GrayHttpTrackInfo, HttpServletRequest>> trackors) {
return new GrayTrackFilter(requestLocalStorage, trackors) {
GrayTrackHolder grayTrackHolder,
RequestLocalStorage requestLocalStorage) {
return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
Expand Down
4 changes: 2 additions & 2 deletions 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.0.0</version>
<version>2.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down Expand Up @@ -56,7 +56,7 @@
<dependency>
<groupId>cn.springcloud.gray</groupId>
<artifactId>spring-cloud-gray-utils</artifactId>
<version>2.0.0</version>
<version>2.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package cn.springcloud.gray;

import cn.springcloud.gray.communication.HttpInformationClient;
import cn.springcloud.gray.communication.InformationClient;
import cn.springcloud.gray.communication.RetryableInformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;

import java.util.List;
Expand All @@ -12,9 +10,12 @@ public abstract class AbstractCommunicableGrayManager extends SimpleGrayManager
private GrayClientConfig grayClientConfig;
private InformationClient informationClient;

public AbstractCommunicableGrayManager(GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper, List<RequestInterceptor> requestInterceptors) {
public AbstractCommunicableGrayManager(
GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
List<RequestInterceptor> requestInterceptors, InformationClient informationClient) {
super(grayDecisionFactoryKeeper, requestInterceptors);
this.grayClientConfig = grayClientConfig;
this.informationClient = informationClient;
createInformationClient();
}

Expand All @@ -29,13 +30,6 @@ public InformationClient getGrayInformationClient() {

protected void createInformationClient() {

GrayClientConfig clientConfig = getGrayClientConfig();
InformationClient httpClient = new HttpInformationClient(clientConfig.getServerUrl());
if (clientConfig.isRetryable()) {
informationClient = new RetryableInformationClient(Math.max(3, clientConfig.getRetryNumberOfRetries()), httpClient);
} else {
informationClient = httpClient;
}

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package cn.springcloud.gray;

import cn.springcloud.gray.communication.InformationClient;

public interface CommunicableGrayManager extends GrayManager {
public interface CommunicableGrayManager extends GrayManager, GrayServerCommunicable {

InformationClient getGrayInformationClient();

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cn.springcloud.gray;


import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
import cn.springcloud.gray.communication.InformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
import cn.springcloud.gray.model.GrayInstance;
import cn.springcloud.gray.model.GrayService;
Expand All @@ -16,46 +17,80 @@
public class DefaultGrayManager extends AbstractCommunicableGrayManager {

private Timer updateTimer = new Timer("Gray-Update-Timer", true);

public DefaultGrayManager(GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
List<RequestInterceptor> requestInterceptors) {
super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors);
private GrayLoadProperties grayLoadProperties;

public DefaultGrayManager(
GrayClientConfig grayClientConfig,
GrayLoadProperties grayLoadProperties,
GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
List<RequestInterceptor> requestInterceptors,
InformationClient informationClient) {
super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors, informationClient);
this.grayLoadProperties = grayLoadProperties;
openForWork();
}


public void openForWork() {
log.info("拉取灰度列表");
doUpdate();
updateTimer.schedule(new UpdateTask(),
getGrayClientConfig().getServiceUpdateIntervalTimerInMs(),
getGrayClientConfig().getServiceUpdateIntervalTimerInMs());
}
if (getGrayInformationClient() != null) {
doUpdate();
int timerMs = getGrayClientConfig().getServiceUpdateIntervalTimerInMs();
if (timerMs > 0) {
updateTimer.schedule(new UpdateTask(), timerMs, timerMs);
}
} else {
loadPropertiesGrays();
}

}

private void doUpdate() {
try {
log.debug("更新灰度服务列表...");

List<GrayInstance> grayInstances = getGrayInformationClient().allGrayInstances();
Map<String, GrayService> grayServices = new ConcurrentHashMap<>();
grayInstances.forEach(instance -> {
updateGrayInstance(grayServices, instance);
});
grayInstances.forEach(
instance -> {
updateGrayInstance(grayServices, instance);
});
joinLoadedGrays(grayServices);
this.grayServices = grayServices;
} catch (Exception e) {
log.error("更新灰度服务列表失败", e);
}
}


private void loadPropertiesGrays() {
Map<String, GrayService> grayServices = new ConcurrentHashMap<>();
joinLoadedGrays(grayServices);
this.grayServices = grayServices;
}


/**
* 加入配置文件中的灰度实例,但不会覆盖列表中的信息
*
* @param grayServices 更新的灰度列表
*/
private void joinLoadedGrays(Map<String, GrayService> grayServices) {
if (grayLoadProperties != null && grayLoadProperties.isEnabled()) {
grayLoadProperties.getGrayInstances().forEach(
instance -> {
if (grayServices.containsKey(instance.getServiceId())
|| grayServices.get(instance.getServiceId())
.getGrayInstance(instance.getInstanceId()) != null) {
updateGrayInstance(grayServices, instance);
}
});
}
}

class UpdateTask extends TimerTask {

@Override
public void run() {
doUpdate();
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public interface GrayClientConfig {


/**
* 更新灰度列表的时间间隔(ms)
* 更新灰度列表的时间间隔(ms),小于等于0将不会开启定时轮询
*
* @return 返回更新灰度列表的时间间隔(ms)
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package cn.springcloud.gray;

import cn.springcloud.gray.communication.InformationClient;

public interface GrayServerCommunicable {

InformationClient getGrayInformationClient();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package cn.springcloud.gray;

public interface InstanceLocalInfoAware {

void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
import cn.springcloud.gray.*;
import cn.springcloud.gray.client.GrayClientInitializingDestroyBean;
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
import cn.springcloud.gray.communication.HttpInformationClient;
import cn.springcloud.gray.communication.InformationClient;
import cn.springcloud.gray.communication.RetryableInformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
import cn.springcloud.gray.request.RequestLocalStorage;
import cn.springcloud.gray.request.ThreadLocalRequestStorage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -30,9 +35,27 @@ public class GrayClientAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public GrayManager grayManager(GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
@Autowired(required = false) List<RequestInterceptor> requestInterceptors) {
return new DefaultGrayManager(grayClientProperties, grayDecisionFactoryKeeper, requestInterceptors);
@ConditionalOnProperty(value = "gray.client.serverUrl")
public InformationClient informationClient() {
InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl());
if (grayClientProperties.isRetryable()) {
return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient);
} else {
return httpClient;
}
}


@Bean
@ConditionalOnMissingBean
public GrayManager grayManager(
@Autowired(required = false) GrayLoadProperties grayLoadProperties,
GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
@Autowired(required = false) List<RequestInterceptor> requestInterceptors,
InformationClient informationClient) {
return new DefaultGrayManager(
grayClientProperties, grayLoadProperties, grayDecisionFactoryKeeper,
requestInterceptors, informationClient);
}


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

import cn.springcloud.gray.InstanceLocalInfo;
import cn.springcloud.gray.InstanceLocalInfoAware;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GrayClientBeanPostProcessorConfiguration {


@Bean
// @ConditionalOnBean(InstanceLocalInfo.class)
public BeanPostProcessor beanPostProcessor(InstanceLocalInfo instanceLocalInfo) {
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof InstanceLocalInfoAware) {
((InstanceLocalInfoAware) bean).setInstanceLocalInfo(instanceLocalInfo);
}
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {


return bean;
}
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import cn.springcloud.gray.event.GrayEventListener;
import cn.springcloud.gray.event.stream.StreamInput;
import cn.springcloud.gray.event.stream.StreamMessageListener;
import cn.springcloud.gray.request.track.CommunicableGrayTrackHolder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
Expand All @@ -18,8 +19,9 @@ public class GrayEventAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public GrayEventListener grayEventListener(CommunicableGrayManager grayManager) {
return new DefaultGrayEventListener(grayManager);
public GrayEventListener grayEventListener(
CommunicableGrayTrackHolder grayTrackHolder, CommunicableGrayManager grayManager) {
return new DefaultGrayEventListener(grayTrackHolder, grayManager);
}


Expand Down
Loading