Soul网关源码解析(番外1):soul-admin启动流程
Soul网关源码解析(番外1):soul-admin启动流程Soul-admin启动流程流程图小结参考
Soul-admin启动流程
首先load并执行sql脚本
#LocalDataSourceLoader 实现 InstantiationAwareBeanPostProcessor接口
public Object postProcessAfterInitialization(@NonNull final Object bean, final String beanName) throws BeansException {
if (bean instanceof DataSourceProperties) {
this.init((DataSourceProperties) bean);
}
return bean;
}
@SneakyThrows// 消除throw new RunTimeException这样的代码
protected void init(final DataSourceProperties properties) {
// 如果jdbc的url中指定了soul,则会被去掉,因为执行sql时不需要指定数据库,
String jdbcUrl = StringUtils.replace(properties.getUrl(), "/soul?", "?");
Connection connection = DriverManager.getConnection(jdbcUrl, properties.getUsername(), properties.getPassword());
this.execute(connection);
}
private void execute(final Connection conn) throws Exception {
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(null);
Resources.setCharset(StandardCharsets.UTF_8);
// 获取schema.sql文件
Reader read = Resources.getResourceAsReader(schemaSQLFile);
log.info("execute soul schema sql: {}", schemaSQLFile);
// 执行sql
runner.runScript(read);
runner.closeConnection();
conn.close();
}
初始化认证AppAuthService bean
#AppAuthServiceImpl
@Autowired(required = false)
public AppAuthServiceImpl(final AppAuthMapper appAuthMapper,
final ApplicationEventPublisher eventPublisher,
final AuthParamMapper authParamMapper,
final AuthPathMapper authPathMapper) {
this.appAuthMapper = appAuthMapper;
this.eventPublisher = eventPublisher;
this.authParamMapper = authParamMapper;
this.authPathMapper = authPathMapper;
}
初始化元数据MetaDataService bean
#MetaDataServiceImpl
@Autowired(required = false)
public MetaDataServiceImpl(final MetaDataMapper metaDataMapper, final ApplicationEventPublisher eventPublisher) {
this.metaDataMapper = metaDataMapper;
this.eventPublisher = eventPublisher;
}
插件PluginService bean
#PluginServiceImpl
@Autowired(required = false)
public PluginServiceImpl(final PluginMapper pluginMapper,
final SelectorMapper selectorMapper,
final SelectorConditionMapper selectorConditionMapper,
final RuleMapper ruleMapper,
final RuleConditionMapper ruleConditionMapper,
final ApplicationEventPublisher eventPublisher) {
this.pluginMapper = pluginMapper;
this.selectorMapper = selectorMapper;
this.selectorConditionMapper = selectorConditionMapper;
this.ruleMapper = ruleMapper;
this.ruleConditionMapper = ruleConditionMapper;
this.eventPublisher = eventPublisher;
}
初始化选择器SelectorService bean
#SelectorServiceImpl
@Autowired(required = false)
public SelectorServiceImpl(final SelectorMapper selectorMapper,
final SelectorConditionMapper selectorConditionMapper,
final PluginMapper pluginMapper,
final RuleMapper ruleMapper,
final RuleConditionMapper ruleConditionMapper,
final ApplicationEventPublisher eventPublisher) {
this.selectorMapper = selectorMapper;
this.selectorConditionMapper = selectorConditionMapper;
this.pluginMapper = pluginMapper;
this.ruleMapper = ruleMapper;
this.ruleConditionMapper = ruleConditionMapper;
this.eventPublisher = eventPublisher;
}
选择器规则RuleService Bean
#RuleServiceImpl
public RuleServiceImpl(final RuleMapper ruleMapper,
final RuleConditionMapper ruleConditionMapper,
final SelectorMapper selectorMapper,
final PluginMapper pluginMapper,
final ApplicationEventPublisher eventPublisher) {
this.ruleMapper = ruleMapper;
this.ruleConditionMapper = ruleConditionMapper;
this.selectorMapper = selectorMapper;
this.pluginMapper = pluginMapper;
this.eventPublisher = eventPublisher;
}
初始化插件处理器PluginHandleService Bean
#PluginHandleServiceImpl
@Autowired(required = false)
public PluginHandleServiceImpl(final PluginHandleMapper pluginHandleMapper, final SoulDictMapper soulDictMapper) {
this.pluginHandleMapper = pluginHandleMapper;
this.soulDictMapper = soulDictMapper;
}
初始化上游检测服务?这里初始化了Divide插件
#UpstreamCheckService
@Autowired(required = false)
public UpstreamCheckService(final SelectorService selectorService, final SelectorMapper selectorMapper,
final ApplicationEventPublisher eventPublisher, final PluginMapper pluginMapper) {
this.selectorService = selectorService;
this.selectorMapper = selectorMapper;
this.eventPublisher = eventPublisher;
this.pluginMapper = pluginMapper;
}
@PostConstruct
public void setup() {
PluginDO pluginDO = pluginMapper.selectByName(PluginEnum.DIVIDE.getName());
if (pluginDO != null) {
List<SelectorDO> selectorDOList = selectorMapper.findByPluginId(pluginDO.getId());
for (SelectorDO selectorDO : selectorDOList) {
List<DivideUpstream> divideUpstreams = GsonUtils.getInstance().fromList(selectorDO.getHandle(), DivideUpstream.class);
if (CollectionUtils.isNotEmpty(divideUpstreams)) {
UPSTREAM_MAP.put(selectorDO.getName(), divideUpstreams);
}
}
}
if (check) {
new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), SoulThreadFactory.create("scheduled-upstream-task", false))
.scheduleWithFixedDelay(this::scheduled, 10, scheduledTime, TimeUnit.SECONDS);
}
}
初始化客户端注册服务 SoulClientRegisterService Bean
#SoulClientRegisterServiceImpl
@Autowired(required = false)
public SoulClientRegisterServiceImpl(final MetaDataMapper metaDataMapper,
final ApplicationEventPublisher eventPublisher,
final SelectorService selectorService,
final RuleService ruleService,
final RuleMapper ruleMapper,
final UpstreamCheckService upstreamCheckService,
final SelectorMapper selectorMapper,
final PluginMapper pluginMapper) {
this.metaDataMapper = metaDataMapper;
this.eventPublisher = eventPublisher;
this.selectorService = selectorService;
this.ruleService = ruleService;
this.ruleMapper = ruleMapper;
this.upstreamCheckService = upstreamCheckService;
this.selectorMapper = selectorMapper;
this.pluginMapper = pluginMapper;
}
初始化字典SoulDictService Bean
#SoulDictServiceImpl
@Autowired(required = false)
public SoulDictServiceImpl(final SoulDictMapper soulDictMapper) {
this.soulDictMapper = soulDictMapper;
}
初始化数据变化事件调度器 Bean
#DataChangedEventDispatcher 实现 implements ApplicationListener<DataChangedEvent>, InitializingBeanApplicationListener<DataChangedEvent>, InitializingBean
public DataChangedEventDispatcher(final ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
设置Soul程序上下文
#SoulApplicationContextAware 实现 ApplicationContextAware
public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
SpringBeanUtils.getInstance().setCfgContext((ConfigurableApplicationContext) applicationContext);
}
设置Soul程序的Domain
#ApplicationStartListener 实现 ApplicationListener<WebServerInitializedEvent>
public void onApplicationEvent(final WebServerInitializedEvent event) {
int port = event.getWebServer().getPort();
final String host = IpUtils.getHost();
final String domain = System.getProperty("soul.httpPath");
if (StringUtils.isBlank(domain)) {
SoulDomain.getInstance()
.setHttpPath("http://" + String.join(":", host, String.valueOf(port)));
} else {
SoulDomain.getInstance()
.setHttpPath(domain);
}
}
流程图

小结
本小结主体debug soul-admin模块启动时会初始化哪些Bean以及初始化过程干了什么事,初始化过程首先load Soul网关核心的db数据,这其中就有plugin和plugin_handle表数据,然后是授权,元数据,插件,选择器,规则等等Service Bean,再往后则是监听和调度相关的Bean,为事件发生变化做出对应的处理,最后再获取环境的httpPath(ip端口),至此soul-admin初始化结束。希望能帮到你,初识soul这样一个极致性能的网关项目。

701

被折叠的 条评论
为什么被折叠?



