R
R
Rocket-API
Search…
自定义API缓存
当多实例分布式部署时,在页面中编辑脚本后,如何把变更同步到所有实例上,这时可以自定义缓存,通过共公组件如Redis等来维护缓存问题,即所有实例共享一份缓存,跳过变更同步问题。
IApiInfoCache.refreshNotify,receiveNotify,可实现集群环境下不重启实例也能达到各实例缓存的自动刷新和mapping重载问题。基于spring cloud 配置中心刷新思想.触发方式为: 1. 通过页面上的"Rebuild API List" 行为触发 2. 对任一接口进行编辑,新增,删除
如果搞不清楚,那就重启所有实例,没有什么问题是重启不能解决的
实现接口:com.github.alenfive.rocketapi.extend.IApiInfoCache
默认实现:
1
import com.github.alenfive.rocketapi.config.QLRequestMappingFactory;
2
import com.github.alenfive.rocketapi.entity.ApiInfo;
3
import com.github.alenfive.rocketapi.entity.vo.RefreshMapping;
4
import com.github.alenfive.rocketapi.utils.GenerateId;
5
import org.springframework.beans.factory.annotation.Autowired;
6
import org.springframework.stereotype.Component;
7
8
import java.util.Collection;
9
import java.util.Map;
10
import java.util.concurrent.ConcurrentHashMap;
11
12
/**
13
* API信息缓存
14
*/
15
@Component
16
public class DefaultApiInfoCache implements IApiInfoCache {
17
18
private Map<String, ApiInfo> cacheApiInfo = new ConcurrentHashMap<>();
19
20
private String instanceId = GenerateId.get().toHexString();
21
22
@Autowired
23
private QLRequestMappingFactory mappingFactory;
24
25
@Override
26
public ApiInfo get(ApiInfo apiInfo){
27
return cacheApiInfo.get(buildApiInfoKey(apiInfo));
28
}
29
30
@Override
31
public Collection<ApiInfo> getAll() {
32
return cacheApiInfo.values();
33
}
34
35
@Override
36
public void removeAll() {
37
cacheApiInfo.clear();
38
}
39
40
@Override
41
public void remove(ApiInfo apiInfo) {
42
cacheApiInfo.remove(buildApiInfoKey(apiInfo));
43
}
44
45
@Override
46
public void put(ApiInfo apiInfo) {
47
cacheApiInfo.put(buildApiInfoKey(apiInfo),apiInfo);
48
}
49
50
private String buildApiInfoKey(ApiInfo apiInfo) {
51
return apiInfo.getMethod() +" "+ apiInfo.getFullPath();
52
}
53
54
/**
55
* 发送系统缓存刷新的通知
56
* 1. 在页面触发"Rebuild API List"操作时,会触发此方法,refreshMapping为空,可使用Redis消息通知功能重写该方法,
57
* 2. 在页面触发接口编辑"Save"操作时,会触发此方法,refreshMapping为变更记录,可使用Redis消息通知功能重写该方法,
58
* 以达到分布式环境下多实例部署系统更新问题
59
*/
60
@Override
61
public void refreshNotify(RefreshMapping refreshMapping) {
62
this.receiveNotify(instanceId,refreshMapping);
63
}
64
65
/**
66
* 监听 "@refreshNotify"行为,来重载本地request mapping等本地实体行为的重新初始化
67
* @param instanceId
68
*/
69
@Override
70
public void receiveNotify(String instanceId, RefreshMapping refreshMapping) {
71
//避免本实例重复初始化
72
if (this.instanceId.equals(instanceId)){
73
return;
74
}
75
76
//刷新单个接口
77
if (refreshMapping != null){
78
try {
79
mappingFactory.refreshMapping(refreshMapping);
80
}catch (Exception e){
81
e.printStackTrace();
82
}
83
return;
84
}
85
86
//全局刷新
87
try {
88
mappingFactory.buildInit();
89
}catch (Exception e){
90
e.printStackTrace();
91
}
92
}
93
}
Copied!
Last modified 8mo ago
Copy link