Jarslink Demo源码

https://github.com/baidaguo/jarslink

Jarslink 简介

JarsLink是一个基于JAVA的模块化开发框架,它提供在运行时动态加载模块(JAR包)、卸载模块和模块间调用的API。

优点

隔离性
类隔离:框架为每个模块的Class使用单独的ClassLoader来加载,每个模块可以依赖同一种框架的不同的版本。
实例隔离:框架为每个模块创建了一个独立的Spring上下文,来加载模块中的BEAN,实例化失败不会影响其他模块。
资源隔离:后续会支持模块之间的资源隔离,每个模块使用独立的CPU和内存资源。
动态性
动态发布:模块能在运行时动态加载到系统中,实现不需要重启和发布系统新增功能。支持突破双亲委派机制,在运行时加载父加载器已经加载过的类,实现模块升级依赖包不需要系统发布。
动态卸载:模块能在运行时被动态卸载干净,实现快速下线不需要功能。

应用背景

微服务集成测试, 目前一个微服务是一个FAT
JAR,如果有几十个微服务,则需要启动很多进程,DEBUG端口会很多,使用JarsLink框架合并FAT
JAR,再路由请求到其他JAR,就可以只启动一个进程进行DEBUG测试。
数据管理中心,数据采集的数据源多,而且每种数据源都需要对接和开发,通过模块化开发,实现一个数据源使用一个模块进行对接。
指标计算系统,每个TOPIC一个模块,把消息转发到模块中进行消息处理。
后台管理系统,几乎每个系统都有后台开发的需求,新建应用则应用数多,维护成本高,引入模块化开发,一个二级域一个模块来开发后台功能。
目前蚂蚁金服微贷事业部几个系统和几十个模块已经使用JarsLink框架。

下载

官网:https://github.com/alibaba/jarslink
其它途径:https://oss.sonatype.org/#nexus-search;quick~jarslink

项目总体构造

引入依赖

此处jarslink-api选择引入1.6版本以上 由于在每次开发一个Action就要配置文件中加配置文件<beanid=”” name=”” class=”” />,一旦类多了,这样管理比较麻烦,还好在1.6版本中提供了扫描包的功能。

<dependency><groupId>com.alipay.jarslink</groupId><artifactId>jarslink-api</artifactId><version>1.6.1.20180301</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.5.RELEASE</version><optional>true</optional></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>${apache.commons.lang.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.7</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>${apache.commons.collections.version}</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>17.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency>

主模块引入子模块jar包

jarslink.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--模块加载引擎--><bean id="moduleLoader" name="moduleLoader" class="com.alipay.jarslink.api.impl.ModuleLoaderImpl" /><!--模块管理器--><bean id="moduleManager" name="moduleManager" class="com.alipay.jarslink.api.impl.ModuleManagerImpl" /><!--可以通过该对象获取所有模块信息--><bean id="moduleRefreshScheduler" name="moduleRefreshScheduler" class="com.alibaba.service.ModuleRefreshSchedulerImpl"><property name="moduleLoader" ref="moduleLoader" /><property name="moduleManager" ref="moduleManager" /></bean></beans>

子模块一配置及Action

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:webflow="http://www.springframework.org/schema/webflow-config"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"default-autowire="byName"><context:annotation-config/><!--创建Action--><bean id="helloWorldAction" class="com.alibaba.action.HelloWorldAction"/><bean id="welComeAction" class="com.alibaba.action.WelComeAction" /></beans>
public class HelloWorldAction implements Action<String, String> {@Overridepublic String execute(String s) {return s + ":hello world222";}@Overridepublic String getActionName() {return "hello-world-action";}}
public class WelComeAction implements Action<String, String> {@Overridepublic String execute(String s) {return "welcome " + s;}@Overridepublic String getActionName() {return "welcome-action";}
}

子模块二配置及Action

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:webflow="http://www.springframework.org/schema/webflow-config"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"default-autowire="byName"><context:annotation-config/></beans>
@Configuration
public class StringToLongAction implements Action<String, Long> {@Overridepublic Long execute(String s) {return Long.valueOf(s);}@Overridepublic String getActionName() {return "string-to-long";}
}

编译文件然后导出Jar包 这样一个模块就开发完成(一个模块的Action开发就是这么简单,1.创建自己的Action;2.配置文件中配置bean信息) 对应模块下有自己对应的Action

测试

此处我们选择子模块一HelloAction进行调用测试

运行结果如下

可以看到HelloAction已调用 而后修改完成子模块重新打包jar,并且拷贝到主模块下
更新HelloAction后会实现热插拔动态部署 再次看结果如下:

到这里 整个demo就已经演示完毕 下一篇我们将着重讲下Jarslink的1.6后新版本的新特性(https://blog.csdn.net/weixin_45735355/article/details/118599122?spm=1001.2014.3001.5502) 有帮助一键三连呦

Jarslink Demo Alibaba(教程 源码)相关推荐

  1. Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索

    Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...

  2. Alibaba Druid 源码阅读(一) 数据库连接池初步

    Alibaba Druid 源码阅读(一) 数据库连接池初步 简介 本文将初步探索数据库连接池的应用场景,为后面的源码分析做些准备 数据库连接池的应用场景 在没有连接池之前,在使用中,需要访问数据库时 ...

  3. 阿里api网关接口客户端demo,java实现源码,其他语言可参考

    访问阿里api网关接口客户端demo,java实现源码,其他语言可参考 上一篇文章 <阿里api网关接口创建.发布.授权.调试> 中,介绍了3个典型接口的创建并在阿里控制台调试完成,地址: ...

  4. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  5. create-react-app教程-源码篇

    原文链接:create-react-app教程-源码篇 之前介绍了create-react-app的基本使用, 为了便于理解一个脚手架脚本是如何运作的,现在来看一下 create-react-app ...

  6. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  7. Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索

    Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索 简介 上文中分析了数据库连接池的初始化部分,接下来我们来看看获取连接部分的代码 数据库连接池中连接获取 下面的相关的代码,在代码 ...

  8. Alibaba Druid 源码阅读(三) 数据库连接池初始化探索

    Alibaba Druid 源码阅读(三) 数据库连接池初始化探索 简介 上文中探索了Alibaba Druid的连接池初始化和获取连接的关键代码,接下来详细看看初始化部分 数据库连接池初始化 对整个 ...

  9. 抖音最近很火的游戏直播:挤地铁教程+源码+软件下载

    抖音最近很火的游戏直播:挤地铁教程+源码+软件 先上车先吃肉,卡好后带货,卖号,引私域,接星途广告,接小程序广告,带小游戏赚收益均可 源码下载:抖音最近很火的游戏直播:挤地铁教程+源码+软件下载-小程 ...

  10. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏

    在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...

最新文章

  1. spring 组件基于注解的注册方式
  2. JavaScript初学者编程题(19)
  3. 如何让类对象只在栈(堆)上分配空间?(转)
  4. EdgeConneX公司在都柏林数据中心园区新建数据中心
  5. [Win10]鼠标没用,插入USB口电脑提示USB Optical Mouse找不到驱动程序的解决方案
  6. 每日一句(2014-9-22)
  7. 20应用统计考研复试要点(part15)--应用多元分析
  8. Ubuntu下libvirt kvm配置
  9. Data intensive Application (1)
  10. php get请求_《细说PHP》第四版 样章 第23章 自定义PHP接口规范 10
  11. JAVA遇见HTML——JSP篇(JavaBeans)
  12. 关系查询处理 查询优化 论文_叮!你有一份留学论文攻略,请查收~
  13. Leetcode 690
  14. linux libimf.so,如何安装Linux版FLOW-3D及注意事项
  15. 制作Camtasia 2020击键标记动画
  16. Copula函数理论及实现(三维)-MATLAB
  17. 遗传算法MATLAB
  18. 黑盒测试的常见测试方法
  19. Unity Shader - shader lab 的 SRP Batcher compatible 兼容性(未使用 RenderDoc 验证 API)
  20. ffmpeg 双轨的mp3转成8k的wav 脚本

热门文章

  1. javascript在firefox中对Dom的处理的一个问题
  2. python机器学习实战(四)
  3. java类的成员变量和局部变量的区别
  4. 将 php 转换/编译为 EXE
  5. Android项目文件的目录结构(1)
  6. 微技能|几分钟搭建网站内容平台
  7. 用Hello World校验Docker的安装
  8. Charles(网络封包分析工具)
  9. “深度学习”是人工智能的一场革命吗?
  10. 不好的测试实践——软件测试的尽早介入