Soul网关源码解析(番外1):soul-admin启动流程

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

参考

Soul 官网

猜你喜欢

转载自blog.csdn.net/S_powerStone/article/details/113030601
今日推荐