Soul-源码阅读7-http插件注册简析

本文详细介绍了SoulClientController在启动http-example服务时如何注册服务到SoulAdmin的步骤。当服务接口被调用时,会注册URL到SoulAdmin,并处理选择器和规则注册。若注册超时,则会触发错误处理。同时,文章还涵盖了数据更新、事件发布和监听机制。

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

SoulClientController- registerSpringMvc

  • 启动http-example的服务时(Started SoulTestHttpApplication) ,会来调用这个方法,注册服务到soul-admin。

     @PostMapping("/springmvc-register")
        public String registerSpringMvc(@RequestBody final SpringMvcRegisterDTO springMvcRegisterDTO) {
            return soulClientRegisterService.registerSpringMvc(springMvcRegisterDTO);
        }
    
  • 注册soul-admin的url 是:http://localhost:9095/soul-client/springmvc-register

  • 服务的所有control接口都会去注册调用一遍。(如:/http/order/save 会调用1次,/http/order/path/**/name会调用1次。。。)

  • 注册接口超过10秒,会读取超时:

     o.d.s.client.common.utils.RegisterUtils  : cannot register soul admin param, url: http://localhost:9095/soul-client/springmvc-register, request body: {"appName":"http","context":"/http","path":"/http/test/**","pathDesc":"","rpcType":"http","host":"192.168.101.146","port":8188,"ruleName":"/http/test/**","enabled":true,"registerMetaData":false}
    
    java.net.SocketTimeoutException: Read timed out
    

soulClientRegisterService.registerSpringMvc

handlerSpringMvcSelector(dto)

selectorService.findByName(contextPath);

查询选择器是否存在,根据上下文(“/http”)查询数据库是否已经存在,

不存在则调用 注册选择器到数据库的方法。

registerSelector(final String contextPath, final String rpcType, final String appName, final String uri);

存在则更新数据:

selectorId = selectorDO.getId();
            //update upstream 接口上游信息 //[{"upstreamHost":"localhost","protocol":"http://","upstreamUrl":"1...46:8188","weight":50,"status":true,"timestamp":0,"warmup":0}]
            String handle = selectorDO.getHandle();
 // 更新URI
DivideUpstream addDivideUpstream = buildDivideUpstream(uri);
// update db
selectorMapper.updateSelective(selectorDO);

// submit upstreamCheck
upstreamCheckService.submit(final String selectorName, final DivideUpstream divideUpstream);

缓存在一个 Map<String, List> UPSTREAM_MAP里,有定时任务每10秒查缓存UPSTREAM_MAP是否有效。

new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), SoulThreadFactory.create("scheduled-upstream-task", false))
                    .scheduleWithFixedDelay(this::scheduled, 10, scheduledTime, TimeUnit.SECONDS);

发布事件后通过监听器 监听数据(SelectorData )改变

// publish change event.
eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.UPDATE,
        Collections.singletonList(selectorData)));

handlerSpringMvcRule(selectorId, dto);

先查询规则是否已经存在,不存在则注册规则(registerRule)。

private void handlerSpringMvcRule(final String selectorId, final SpringMvcRegisterDTO dto) {
    RuleDO ruleDO = ruleMapper.findByName(dto.getRuleName());
    if (Objects.isNull(ruleDO)) {
        registerRule(selectorId, dto.getPath(), dto.getRpcType(), dto.getRuleName());
    }
}

根据rpcType获得RuleHandle,http->DivideRuleHandle.class, DUBBO -> DubboRuleHandle.class,SOFA -> SofaRuleHandle.class

RuleHandle ruleHandle = RuleHandleFactory.ruleHandle(RpcTypeEnum.acquireByName(rpcType), path);

保存规则和规则数据细表。

ruleMapper.insertSelective(ruleDO);
            ruleConditions.forEach(ruleConditionDTO -> {
                ruleConditionDTO.setRuleId(ruleDO.getId());
                ruleConditionMapper.insertSelective(RuleConditionDO.buildRuleConditionDO(ruleConditionDTO));
            });

推送数据改变的事件

publishEvent(final RuleDO ruleDO, final List<RuleConditionDTO> ruleConditions)

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值