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

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
layui-soul-table 是一款基于layui框架开发的用于展示数据的表格件。要快速隐藏列,可以通过以下步骤进行操作: 1. 首先,确保已加载layui和layui-soul-table的相关资文件。可以在页面中引入layui和layui-soul-table的CSS和JS文件,例如: ```html <link rel="stylesheet" href="path/to/layui/css/layui.css"> <link rel="stylesheet" href="path/to/layui-soul-table/soulTable.css"> <script src="path/to/layui/layui.js"></script> <script src="path/to/layui-soul-table/soulTable.js"></script> ``` 2. 在HTML页面中,创建一个具有固定id的表格元素,例如: ```html <table id="demo" lay-filter="test"></table> ``` 3. 在JavaScript代码中,使用layui-soul-table的自定义参数来创建表格,并设置隐藏列的显示属性。例如: ```javascript layui.use(['table', 'soulTable'], function(){ var table = layui.table; var soulTable = layui.soulTable; table.render({ elem: '#demo', url: '/api/data', // 数据接口 cols: [[ {field:'id', title: 'ID'}, {field:'name', title: '名称'}, {field:'age', title: '年龄'}, // 其他列 {field:'操作', title: '操作', toolbar: '#barDemo', width: 150} // 需要隐藏的列 ]], }); soulTable.on('filter(test)', function(data){ // 判断隐藏列的显示状态 var isHide = data.isHide; if(isHide){ $('#demo .layui-table-view .layui-table').find('[data-field="操作"]').hide(); }else{ $('#demo .layui-table-view .layui-table').find('[data-field="操作"]').show(); } }); }); ``` 通过以上步骤,就可以在 layui-soul-table 中快速隐藏指定的列。具体实现是通过监听"filter(test)"事件,判断隐藏列的状态,然后利用jQuery的hide()和show()方法来控制目标列的显示属性。使用这种方法,我们可以方便地实现快速隐藏列功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值