服务探活机制是为了发现系统中上下游服务的的状态。当有新的服务注册时要通知其他系统,当有服务下线时也要告知其他系统。
Soul
网关中有对Http
服务处理的探活,所有的服务对象保存在soul-admin
的UPSTREAM_MAP
中,这里面的服务对象有两个来源,一个来自于原有的数据库,一个来自于其他服务的注册。
@Component
public class UpstreamCheckService {
//保存上游服务
private static final Map<String, List<DivideUpstream>> UPSTREAM_MAP = Maps.newConcurrentMap();
//省略了其他代码
}
在UpstreamCheckService
类中,在构造器执行完后,会执行setup()
方法。里面做了两件事情:
- 1.读取数据库的服务信息,保存到
UPSTREAM_MAP
; - 2.开启定时任务,检查每个方法。
//在构造器只执行完,执行这个方法
@PostConstruct
public void setup() {
PluginDO pluginDO = pluginMapper.selectByName(PluginEnum.DIVIDE.getName());
if (pluginDO != null) {
//省略了其他代码
//来源数据库的服务对象
if (CollectionUtils.isNotEmpty(divideUpstreams)) {
UPSTREAM_MAP.put(selectorDO.getName(), divideUpstreams);
}
}
}
//是否开启探活机制,默认开启
if (check) {
//定时任务,每10秒执行一次
new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), SoulThreadFactory.create("scheduled-upstream-task", false))
.scheduleWithFixedDelay(this::scheduled, 10