前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用webx子容器实现模块隔离思路

利用webx子容器实现模块隔离思路

作者头像
加多
发布2018-09-06 14:44:21
6860
发布2018-09-06 14:44:21
举报
文章被收录于专栏:Java编程技术Java编程技术

一、前言

一个项目随着业务增长,模块的增多,模块间的相互依赖,相互引用,使得项目结构越来越复杂,目前我们使用webx时候虽然分为了一个个模块,但是模块间的bo还是可以随意调用,比如模块A可以调用模块B的bo,那么模块间的耦合度就大大的增加了。好的设计应该是模块之间只通过模块提供的服务接口来访问,而不是随便调用其他模块的bo。其实webx本身就可以做这个事情,稍加改造及科研实现模块间真正隔离,让一个模块调用不到其他模块bo。

二、Webx级联容器

这里引用下webx官方文档里面截图和说明:

screenshot.png

Webx Framework将一个WEB应用分解成多个小应用模块:app1、app2,当然名字可以任意取。 每个小应用模块独享一个Spring Sub Context子容器。两个子容器之间的beans无法互相注入。 所有小应用模块共享一个Spring Root Context根容器。根容器中的bean可被注入到子容器的bean中;反之不可以。将一个大的应用分解成若干个小应用模块,并使它们的配置文件相对独立,这是一种很不错的开发实践。

之前的webx项目我们都是在webx.xml里面配置:

代码语言:javascript
复制
<!-- 引入业务组建定义的Bean.业务Bean定义在component-beans.xml文件中,放在各自Componet中 -->
    <beans:import resource="classpath*:component-beans.xml"/>

这种方式作用是把所有模块组元中提供的bean都注入到了webx顶层容器RootContext,所以每个子模块都可以访问其他模块的注入类,并没有达到模块间隔离。

三、正确使用Webx级联容器实现模块隔离

3.1 bean的正确配置

通过webx 子容器和跟容器关系不难想到,我们可以把每个模块的bean 注入到自己子容器中,而不是注入到根容器中,这样其他模块就访问不到本模块子容器中bean.具体来说就是:

screenshot.png

其中在1配置文件里面配置需要注入到本模块IOC容器中的bean(这些bean只有本模块可以用,包括本模块的screen,rpc,bo类才能引用,其他模块引用不到)。然后在2处文件里面引用该文件:

screenshot.png

介绍到这里我们可以实现每个模块真正隔离,但是每个子模块如何对外提供服务那,目前来看所有模块间都是隔离的,但是肯定有需求模块A需要使用模块B的功能。

3.2 模块间(子容器)服务注册与使用

思路是我们可以做一个服务注册与使用的类,具体可以形如:

代码语言:javascript
复制
public class ServiceUtil {

    private static ConcurrentHashMap<String, Object> services = new ConcurrentHashMap<String, Object>();
    
        //服务注册
    public static void  registerService(String name,Object service){
        services.put(name, service);
    }
    //获取服务
    public static Object getService(String name){
        return services.get(name);
    }
}

然后我们在模块中需要暴露给其他模块的bo中设置如下,进行注册:

代码语言:javascript
复制
public class SpeechTestBoImpl implements SpeechTestBo,InitializingBean {

    @Autowired 
    private SpeechServiceBo speechServiceBo;
    
    @Override
    public String testSpeechBo() {
        // TODO Auto-generated method stub
        return "this is speech service ";
    }

    /**
     * 发布服务
     */
    @Override
    public void afterPropertiesSet() throws Exception {

        ServiceUtil.registerService("speech", this);        
    }

}

通过上面方式可以把当前类注册到服务管理类里面。然后其他模块就可以通过下面的方进行使用该模块服务:

代码语言:javascript
复制
public class SeaServiceRpc {

    @Autowired 
    private SeaServiceBo seaServiceBo;
    /*
     * 应用定时根据port判断是否有client链接进来
     */
    @ResourceMapping("getPortsStatus")
    public ActionResult getPortsStatus(@RequestParam(name = "appKey") String appKey,
            @RequestParam(name = "md5Sign") String md5Sign, ErrorContext context) {
        ActionResult result = new ActionResult();
               //这里使用speech模块的服务
        SpeechTestBo speechServiceBoTest = (SpeechTestBo) ServiceUtil.getService("speech");
        result.setRetValue(speechServiceBoTest.testSpeechBo() + seaServiceBo.startService(0));
        return result;
    }
}

三、总结

本文为项目中模块化隔离提供了一种思路,目前仅是概念上的思路,还没有真正在项目中使用,希望能给对有这种诉求的童鞋提供参考思路。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、Webx级联容器
  • 三、正确使用Webx级联容器实现模块隔离
    • 3.1 bean的正确配置
      • 3.2 模块间(子容器)服务注册与使用
      • 三、总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档