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这样一个极致性能的网关项目。