Skip to content

Commit 10916a7

Browse files
committed
优化代码
添加gray decision缓存
1 parent b4812a8 commit 10916a7

File tree

18 files changed

+353
-31
lines changed

18 files changed

+353
-31
lines changed

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
<commons-lang3.version>3.5</commons-lang3.version>
7171
<guava.version>27.0.1-jre</guava.version>
7272
<mapstruct.version>1.1.0.Final</mapstruct.version>
73-
73+
<caffeine.version>2.7.0</caffeine.version>
7474
</properties>
7575

7676

@@ -92,6 +92,11 @@
9292
<!-- <scope>import</scope>-->
9393
<!-- </dependency>-->
9494

95+
<dependency>
96+
<groupId>com.github.ben-manes.caffeine</groupId>
97+
<artifactId>caffeine</artifactId>
98+
<version>${caffeine.version}</version>
99+
</dependency>
95100

96101
<dependency>
97102
<groupId>io.springfox</groupId>

spring-cloud-gray-client/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
<artifactId>spring-boot-autoconfigure</artifactId>
2626
<scope>provided</scope>
2727
</dependency>
28+
<dependency>
29+
<groupId>com.github.ben-manes.caffeine</groupId>
30+
<artifactId>caffeine</artifactId>
31+
</dependency>
2832
<dependency>
2933
<groupId>cn.springcloud.gray</groupId>
3034
<artifactId>spring-cloud-gray-core</artifactId>

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractGrayManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
/**
2020
* GrayManager的抽象实现类实现了基础的获取灰度列表, 创建灰度决策对象的能力
2121
*/
22-
public abstract class AbstractGrayManager implements GrayManager {
22+
public abstract class AbstractGrayManager implements UpdateableGrayManager {
2323
private static final Logger log = LoggerFactory.getLogger(AbstractGrayManager.class);
2424

2525

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cn.springcloud.gray;
2+
3+
import cn.springcloud.gray.decision.GrayDecision;
4+
5+
import java.util.List;
6+
7+
public interface CacheableGrayManager extends UpdateableGrayManager {
8+
9+
10+
Cache<String, List<GrayDecision>> getGrayDecisionCache();
11+
12+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package cn.springcloud.gray;
2+
3+
import cn.springcloud.gray.communication.InformationClient;
4+
import cn.springcloud.gray.decision.GrayDecision;
5+
import cn.springcloud.gray.model.GrayInstance;
6+
import cn.springcloud.gray.model.GrayService;
7+
8+
import java.util.Collection;
9+
import java.util.List;
10+
import java.util.function.Supplier;
11+
12+
public class CachedDelegateGrayManager implements CacheableGrayManager, CommunicableGrayManager {
13+
14+
private GrayManager delegate;
15+
private Cache<String, List<GrayDecision>> grayDecisionCache;
16+
17+
18+
public CachedDelegateGrayManager(GrayManager delegate, Cache<String, List<GrayDecision>> grayDecisionCache) {
19+
this.delegate = delegate;
20+
this.grayDecisionCache = grayDecisionCache;
21+
}
22+
23+
@Override
24+
public boolean hasGray(String serviceId) {
25+
return delegate.hasGray(serviceId);
26+
}
27+
28+
@Override
29+
public Collection<GrayService> allGrayServices() {
30+
return delegate.allGrayServices();
31+
}
32+
33+
@Override
34+
public GrayService getGrayService(String serviceId) {
35+
return delegate.getGrayService(serviceId);
36+
}
37+
38+
@Override
39+
public GrayInstance getGrayInstance(String serviceId, String instanceId) {
40+
return delegate.getGrayInstance(serviceId, instanceId);
41+
}
42+
43+
@Override
44+
public List<GrayDecision> getGrayDecision(GrayInstance instance) {
45+
return getCacheGrayDecision(instance.getInstanceId(), () -> delegate.getGrayDecision(instance));
46+
}
47+
48+
@Override
49+
public List<GrayDecision> getGrayDecision(String serviceId, String instanceId) {
50+
return getCacheGrayDecision(instanceId, () -> delegate.getGrayDecision(serviceId, instanceId));
51+
}
52+
53+
54+
@Override
55+
public Cache<String, List<GrayDecision>> getGrayDecisionCache() {
56+
return grayDecisionCache;
57+
}
58+
59+
60+
@Override
61+
public void updateGrayInstance(GrayInstance instance) {
62+
delegate.updateGrayInstance(instance);
63+
invalidateCache(instance.getServiceId(), instance.getInstanceId());
64+
}
65+
66+
@Override
67+
public void closeGray(GrayInstance instance) {
68+
delegate.closeGray(instance);
69+
invalidateCache(instance.getServiceId(), instance.getInstanceId());
70+
}
71+
72+
@Override
73+
public void closeGray(String serviceId, String instanceId) {
74+
delegate.closeGray(serviceId, instanceId);
75+
invalidateCache(serviceId, instanceId);
76+
}
77+
78+
@Override
79+
public List<RequestInterceptor> getRequeestInterceptors(String interceptroType) {
80+
return delegate.getRequeestInterceptors(interceptroType);
81+
}
82+
83+
@Override
84+
public void setup() {
85+
delegate.setup();
86+
}
87+
88+
@Override
89+
public void shutdown() {
90+
delegate.shutdown();
91+
}
92+
93+
@Override
94+
public void setGrayServices(Object grayServices) {
95+
if (delegate instanceof UpdateableGrayManager) {
96+
((UpdateableGrayManager) delegate).setGrayServices(grayServices);
97+
grayDecisionCache.invalidateAll();
98+
}
99+
}
100+
101+
@Override
102+
public void setRequestInterceptors(Collection<RequestInterceptor> requestInterceptors) {
103+
if (delegate instanceof UpdateableGrayManager) {
104+
((UpdateableGrayManager) delegate).setRequestInterceptors(requestInterceptors);
105+
}
106+
}
107+
108+
private List<GrayDecision> getCacheGrayDecision(String key, Supplier<List<GrayDecision>> supplier) {
109+
return grayDecisionCache.get(key, k -> supplier.get());
110+
}
111+
112+
private void invalidateCache(String serviceId, String instanceId) {
113+
grayDecisionCache.invalidate(instanceId);
114+
}
115+
116+
@Override
117+
public InformationClient getGrayInformationClient() {
118+
if (delegate instanceof CommunicableGrayManager) {
119+
return ((CommunicableGrayManager) delegate).getGrayInformationClient();
120+
}
121+
throw new UnsupportedOperationException("delegate不是CommunicableGrayManager的实现类");
122+
}
123+
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@ public DefaultGrayManager(
2727
InformationClient informationClient) {
2828
super(grayClientConfig, grayDecisionFactoryKeeper, informationClient);
2929
this.grayLoadProperties = grayLoadProperties;
30-
// openForWork();
3130
}
3231

3332
@Override
3433
public void setup() {
3534
super.setup();
36-
openForWork();
35+
updateTimer.schedule(new TimerTask() {
36+
@Override
37+
public void run() {
38+
openForWork();
39+
}
40+
}, getGrayClientConfig().getServiceInitializeDelayTimeInMs());
3741
}
3842

3943
@Override
@@ -67,7 +71,7 @@ private void doUpdate() {
6771
updateGrayInstance(grayServices, instance);
6872
});
6973
joinLoadedGrays(grayServices);
70-
this.grayServices = grayServices;
74+
setGrayServices(grayServices);
7175
} catch (Exception e) {
7276
log.error("更新灰度服务列表失败", e);
7377
} finally {
@@ -79,7 +83,7 @@ private void doUpdate() {
7983
private void loadPropertiesGrays() {
8084
Map<String, GrayService> grayServices = new ConcurrentHashMap<>();
8185
joinLoadedGrays(grayServices);
82-
this.grayServices = grayServices;
86+
setGrayServices(grayServices);
8387
}
8488

8589

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ public interface GrayClientConfig {
3333
int getServiceUpdateIntervalTimerInMs();
3434

3535

36+
int getServiceInitializeDelayTimeInMs();
3637
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientInitializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ private <T> T getBean(String beanName, Class<T> cls) {
5151
private void initGrayManagerRequestInterceptors() {
5252
Map<String, RequestInterceptor> requestInterceptors = cxt.getBeansOfType(RequestInterceptor.class);
5353
GrayManager grayManager = GrayClientHolder.getGrayManager();
54-
if (grayManager instanceof AbstractGrayManager) {
55-
((AbstractGrayManager) grayManager).setRequestInterceptors(requestInterceptors.values());
54+
if (grayManager instanceof UpdateableGrayManager) {
55+
((UpdateableGrayManager) grayManager).setRequestInterceptors(requestInterceptors.values());
5656
}
5757
grayManager.setup();
5858
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/SimpleGrayManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,12 @@ public void shutdown() {
112112
}
113113

114114

115+
@Override
116+
public void setGrayServices(Object grayServices) {
117+
if (grayServices instanceof Map) {
118+
this.grayServices = (Map<String, GrayService>) grayServices;
119+
} else {
120+
throw new UnsupportedOperationException("setGrayServices(grayServices) 无法支持的参数类型");
121+
}
122+
}
115123
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cn.springcloud.gray;
2+
3+
import java.util.Collection;
4+
5+
public interface UpdateableGrayManager extends GrayManager {
6+
7+
void setGrayServices(Object grayServices);
8+
9+
void setRequestInterceptors(Collection<RequestInterceptor> requestInterceptors);
10+
11+
12+
}

0 commit comments

Comments
 (0)