Skip to content

Commit ee39321

Browse files
committed
优化代码
实现定时清除过期的灰度服务实例
1 parent 07e6587 commit ee39321

File tree

20 files changed

+322
-27
lines changed

20 files changed

+322
-27
lines changed

spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,7 @@ eureka:
5454

5555
gray:
5656
server:
57-
evictionIntervalTimerInMs: 30000
57+
evictionIntervalTimerInMs: 30000
58+
instance:
59+
eviction:
60+
enabled: true
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package cn.springcloud.gray.service.test;
2+
3+
import cn.springcloud.gray.server.app.GrayServerApplication;
4+
import cn.springcloud.gray.server.configuration.properties.GrayServerProperties;
5+
import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor;
6+
import cn.springcloud.gray.server.module.domain.GrayInstance;
7+
import cn.springcloud.gray.server.service.GrayInstanceService;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.junit.Assert;
10+
import org.junit.Test;
11+
import org.junit.runner.RunWith;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.test.context.SpringBootTest;
14+
import org.springframework.test.context.ActiveProfiles;
15+
import org.springframework.test.context.junit4.SpringRunner;
16+
17+
import java.util.List;
18+
19+
@ActiveProfiles({"dev"})
20+
@RunWith(SpringRunner.class)
21+
@SpringBootTest(classes = GrayServerApplication.class)
22+
@Slf4j
23+
public class GrayInstanceRecordEvictionTest {
24+
25+
@Autowired
26+
private GrayServerProperties grayServerProperties;
27+
@Autowired
28+
private GrayInstanceRecordEvictor grayInstanceRecordEvictor;
29+
@Autowired
30+
private GrayInstanceService grayInstanceService;
31+
32+
@Test
33+
public void testEvictGrayInstance() {
34+
GrayServerProperties.InstanceRecordEvictProperties evictProperties =
35+
grayServerProperties.getInstance().getEviction();
36+
List<GrayInstance> befores = grayInstanceService.findAllByEvictableRecords(
37+
evictProperties.getLastUpdateDateExpireDays(), evictProperties.getEvictionInstanceStatus());
38+
39+
if (befores.size() > 0) {
40+
grayInstanceRecordEvictor.evict();
41+
List<GrayInstance> afters = grayInstanceService.findAllByEvictableRecords(
42+
evictProperties.getLastUpdateDateExpireDays(), evictProperties.getEvictionInstanceStatus());
43+
log.info("before:{}, after:{}", befores.size(), afters.size());
44+
Assert.assertTrue("清理失败的灰度服务实例失败", afters.size() == 0);
45+
}
46+
}
47+
}

spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceServiceTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33

44
import cn.springcloud.gray.model.GrayStatus;
5+
import cn.springcloud.gray.model.InstanceStatus;
56
import cn.springcloud.gray.server.app.GrayServerApplication;
67
import cn.springcloud.gray.server.configuration.properties.GrayServerProperties;
78
import cn.springcloud.gray.server.module.domain.GrayInstance;
@@ -16,6 +17,7 @@
1617
import org.springframework.test.context.ActiveProfiles;
1718
import org.springframework.test.context.junit4.SpringRunner;
1819

20+
import java.util.Arrays;
1921
import java.util.List;
2022

2123
@ActiveProfiles({"dev"})
@@ -36,8 +38,17 @@ public class GrayInstanceServiceTest {
3638
@Test
3739
public void test() throws JsonProcessingException {
3840
List<GrayInstance> grayInstances = grayInstanceService.findAllByStatus(
39-
GrayStatus.OPEN, grayServerProperties.getNormalInstanceStatus());
41+
GrayStatus.OPEN, grayServerProperties.getInstance().getNormalInstanceStatus());
4042
log.info("{}", objectMapper.writeValueAsString(grayInstances));
4143

4244
}
45+
46+
47+
@Test
48+
public void testFindAllByEvictableRecords() throws JsonProcessingException {
49+
List<GrayInstance> grayInstances = grayInstanceService.findAllByEvictableRecords(1,
50+
Arrays.asList(InstanceStatus.DOWN, InstanceStatus.UNKNOWN));
51+
System.out.println(objectMapper.writeValueAsString(grayInstances));
52+
}
53+
4354
}

spring-cloud-gray-server/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414

1515
<dependencies>
16+
<dependency>
17+
<groupId>cn.springcloud.gray</groupId>
18+
<artifactId>spring-cloud-gray-utils</artifactId>
19+
</dependency>
1620
<dependency>
1721
<groupId>cn.springcloud.gray</groupId>
1822
<artifactId>spring-cloud-gray-core</artifactId>
Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,82 @@
11
package cn.springcloud.gray.server;
22

3+
import cn.springcloud.gray.concurrent.DefaultThreadFactory;
4+
import cn.springcloud.gray.server.configuration.properties.GrayServerProperties;
35
import cn.springcloud.gray.server.manager.GrayServiceManager;
6+
import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.beans.BeansException;
49
import org.springframework.beans.factory.InitializingBean;
10+
import org.springframework.context.ApplicationContext;
11+
import org.springframework.context.ApplicationContextAware;
512

613
import javax.annotation.PreDestroy;
14+
import java.util.concurrent.ScheduledExecutorService;
15+
import java.util.concurrent.ScheduledThreadPoolExecutor;
16+
import java.util.concurrent.TimeUnit;
717

8-
public class GrayServerInitializingDestroyBean implements InitializingBean {
18+
@Slf4j
19+
public class GrayServerInitializingDestroyBean
20+
implements InitializingBean, ApplicationContextAware {
921
private GrayServiceManager grayServiceManager;
22+
private GrayServerProperties grayServerProperties;
23+
private ScheduledExecutorService scheduledExecutorService =
24+
new ScheduledThreadPoolExecutor(1, new DefaultThreadFactory("initDestory"));
25+
private ApplicationContext appCxt;
1026

11-
public GrayServerInitializingDestroyBean(GrayServiceManager grayServiceManager) {
27+
public GrayServerInitializingDestroyBean(
28+
GrayServiceManager grayServiceManager, GrayServerProperties grayServerProperties) {
1229
this.grayServiceManager = grayServiceManager;
30+
this.grayServerProperties = grayServerProperties;
1331
}
1432

1533
@Override
1634
public void afterPropertiesSet() {
1735
initToWork();
1836
}
1937

20-
2138
private void initToWork() {
2239
grayServiceManager.openForWork();
23-
}
2440

41+
// 初始化灰度实例的回收任务
42+
initGrayInstanceRecordEvictionTask();
43+
}
2544

2645
@PreDestroy
2746
public void shutdown() {
2847
grayServiceManager.shutdown();
48+
scheduledExecutorService.shutdown();
49+
}
50+
51+
@Override
52+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
53+
appCxt = applicationContext;
54+
}
55+
56+
private void initGrayInstanceRecordEvictionTask() {
57+
GrayServerProperties.InstanceRecordEvictProperties evictProperties =
58+
grayServerProperties.getInstance().getEviction();
59+
if (!evictProperties.isEnabled()) {
60+
return;
61+
}
62+
String beanName = "grayInstanceRecordEvictor";
63+
GrayInstanceRecordEvictor instanceRecordEvictor =
64+
getBean(beanName, GrayInstanceRecordEvictor.class);
65+
if (instanceRecordEvictor == null) {
66+
log.error("没有找到名为{}的GrayInstanceRecordEvictor类型或者为GrayInstanceRecordEvictor类型的实例", beanName);
67+
throw new NullPointerException("没有找到GrayInstanceRecordEvictor类型的实例");
68+
}
69+
scheduledExecutorService.schedule(
70+
() -> instanceRecordEvictor.evict(),
71+
evictProperties.getEvictionIntervalTimerInMs(),
72+
TimeUnit.MILLISECONDS);
73+
}
74+
75+
private <T> T getBean(String beanName, Class<T> cls) {
76+
T t = appCxt.getBean(beanName, cls);
77+
if (t == null) {
78+
t = appCxt.getBean(cls);
79+
}
80+
return t;
2981
}
3082
}

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/DBStorageConfiguration.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import cn.springcloud.gray.event.GrayEventPublisher;
44
import cn.springcloud.gray.server.configuration.properties.GrayServerProperties;
5+
import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor;
56
import cn.springcloud.gray.server.module.GrayServerModule;
67
import cn.springcloud.gray.server.module.GrayServerTrackModule;
7-
import cn.springcloud.gray.server.module.SimpleGrayServerModule;
8-
import cn.springcloud.gray.server.module.SimpleGrayServerTrackModule;
8+
import cn.springcloud.gray.server.module.jpa.JPAGrayInstanceRecordEvictor;
9+
import cn.springcloud.gray.server.module.jpa.JPAGrayServerModule;
10+
import cn.springcloud.gray.server.module.jpa.JPAGrayServerTrackModule;
911
import cn.springcloud.gray.server.service.*;
1012
import org.springframework.beans.factory.annotation.Autowired;
1113
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
15+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1216
import org.springframework.boot.autoconfigure.domain.EntityScan;
1317
import org.springframework.context.annotation.Bean;
1418
import org.springframework.context.annotation.ComponentScan;
@@ -39,19 +43,38 @@ public GrayServerModule grayServerModule(
3943
GrayEventPublisher grayEventPublisher,
4044
GrayServiceService grayServiceService, GrayInstanceService grayInstanceService,
4145
GrayDecisionService grayDecisionService, GrayPolicyService grayPolicyService) {
42-
return new SimpleGrayServerModule(
46+
return new JPAGrayServerModule(
4347
grayServerProperties, grayEventPublisher, grayServiceService, grayInstanceService,
4448
grayDecisionService, grayPolicyService);
4549
}
4650

4751

4852
@Bean
4953
public GrayServerTrackModule grayServerTrackModule(GrayEventPublisher grayEventPublisher, GrayTrackService grayTrackService) {
50-
return new SimpleGrayServerTrackModule(grayEventPublisher, grayTrackService);
54+
return new JPAGrayServerTrackModule(grayEventPublisher, grayTrackService);
5155
}
5256

5357
}
5458

59+
60+
@Configuration
61+
@ConditionalOnProperty("gray.server.instance.eviction.enabled")
62+
public static class JPAGrayInstanceRecordEvictionConfiguration {
63+
64+
@Bean
65+
@ConditionalOnMissingBean
66+
public GrayInstanceRecordEvictor grayInstanceRecordEvictor(
67+
GrayInstanceService grayInstanceService, GrayServerProperties grayServerProperties) {
68+
GrayServerProperties.InstanceRecordEvictProperties evictProperties =
69+
grayServerProperties.getInstance().getEviction();
70+
return new JPAGrayInstanceRecordEvictor(grayInstanceService,
71+
evictProperties.getEvictionInstanceStatus(),
72+
evictProperties.getLastUpdateDateExpireDays());
73+
}
74+
75+
76+
}
77+
5578
@Bean
5679
public PlatformTransactionManager transactionManager(DataSource dataSource) {
5780
return new DataSourceTransactionManager(dataSource);

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/GrayServerAutoConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ public class GrayServerAutoConfiguration {
3333
@Autowired
3434
private GrayServerProperties grayServerConfig;
3535

36-
@Autowired
37-
private GrayServerModule grayServerModule;
3836

3937
@Bean
4038
@ConditionalOnMissingBean
@@ -44,14 +42,15 @@ public RestTemplate restTemplate() {
4442

4543
@Bean
4644
@ConditionalOnMissingBean
47-
public DefaultGrayServiceManager defaultGrayServiceManager(GrayServerEvictor grayServerEvictor) {
45+
public DefaultGrayServiceManager defaultGrayServiceManager(
46+
GrayServerEvictor grayServerEvictor, GrayServerModule grayServerModule) {
4847
return new DefaultGrayServiceManager(grayServerConfig, grayServerModule, grayServerEvictor);
4948
}
5049

5150

5251
@Bean
5352
public GrayServerInitializingDestroyBean grayServerInitializingBean(GrayServiceManager grayServiceManager) {
54-
return new GrayServerInitializingDestroyBean(grayServiceManager);
53+
return new GrayServerInitializingDestroyBean(grayServiceManager, grayServerConfig);
5554
}
5655

5756

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/properties/GrayServerProperties.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,56 @@
88
import java.util.Arrays;
99
import java.util.HashSet;
1010
import java.util.Set;
11+
import java.util.concurrent.TimeUnit;
1112

1213
@Setter
1314
@Getter
1415
@ConfigurationProperties(prefix = "gray.server")
1516
public class GrayServerProperties {
1617

17-
private int evictionIntervalTimerInMs = 60000;
18+
private long evictionIntervalTimerInMs = TimeUnit.SECONDS.toMillis(60);
1819

19-
private Set<InstanceStatus> normalInstanceStatus =
20-
new HashSet<>(Arrays.asList(InstanceStatus.STARTING, InstanceStatus.UP));
20+
private InstanceProperties instance = new InstanceProperties();
2121

22+
@Setter
23+
@Getter
24+
public static class InstanceProperties {
2225

26+
private Set<InstanceStatus> normalInstanceStatus =
27+
new HashSet<>(Arrays.asList(InstanceStatus.STARTING, InstanceStatus.UP));
28+
29+
30+
private InstanceRecordEvictProperties eviction = new InstanceRecordEvictProperties();
31+
32+
33+
}
34+
35+
36+
/**
37+
* 灰度实例的清理配置参数
38+
*/
39+
@Setter
40+
@Getter
41+
public static class InstanceRecordEvictProperties {
42+
43+
private boolean enabled;
44+
45+
/**
46+
* 定时执行的时间周期
47+
*/
48+
private long evictionIntervalTimerInMs = TimeUnit.DAYS.toMillis(1l);
49+
50+
51+
/**
52+
* 将被清理的状态
53+
*/
54+
private Set<InstanceStatus> evictionInstanceStatus =
55+
new HashSet<>(Arrays.asList(InstanceStatus.DOWN, InstanceStatus.UNKNOWN));
56+
57+
58+
/**
59+
* 最后更新时间过期天数
60+
*/
61+
private int lastUpdateDateExpireDays = 1;
62+
}
2363
}

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.*;
44

55
import javax.persistence.*;
6+
import java.util.Date;
67

78
@Setter
89
@Getter
@@ -21,6 +22,8 @@ public class GrayInstanceDO {
2122
private String host;
2223
@Column(length = 5)
2324
private Integer port;
25+
@Column
26+
private Date lastUpdateDate;
2427

2528
/**
2629
* 实例状态

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/repository/GrayInstanceRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.data.jpa.repository.JpaRepository;
77
import org.springframework.stereotype.Repository;
88

9+
import java.util.Date;
910
import java.util.List;
1011

1112
@Repository
@@ -21,4 +22,7 @@ public interface GrayInstanceRepository extends JpaRepository<GrayInstanceDO, St
2122
List<GrayInstanceDO> findAllByServiceIdAndInstanceStatusIn(String serviceId, String[] instanceStatus);
2223

2324
List<GrayInstanceDO> findAllByGrayStatusAndInstanceStatusIn(String grayStatus, String[] instanceStatus);
25+
26+
27+
List<GrayInstanceDO> findAllByLastUpdateDateBeforeAndInstanceStatusIn(Date lastUpdateDate, String[] instanceStatus);
2428
}

0 commit comments

Comments
 (0)