- 授权协议: Apache 2.0
- 开发语言: Java
- 操作系统: 跨平台
- 软件首页: https://github.com/youtongluan/sumk
- 软件文档: https://github.com/youtongluan/sumk
- 官方下载: https://github.com/youtongluan/sumk
软件介绍
sumk的定位是提供一个开发速度快、又能进行横向扩展的高性能框架。sumk的设计思路是简化开发工作,将开发工作变为填空题。通过优化框架来改变系统行为。这样做的好处是代码更容易被管理,也更容易适应变化。
主要功能特点简单介绍如下:
-
微服务:服务注册、自动发现、故障转移、负载均衡等常见功能这里也都提供,并且使用更简单。服务器端只要在方法上添加@Soa注解,就能被其它实例调用,并且它还能在调用链上自动传递userId参数。客户端提供了同步、异步两种调用方式。
-
Web服务:主要针对移动端访问(PC端也可以使用),也可以用作微服务的网关。只要在方法上添加@Web注解就可以被html访问,比spring mvc更方便(spring mvc还需要在参数上添加注解)。本模块可以不使用tomcat,因为sumk内置了jetty服务器。还内置了通信加密,参数的签名验证等功能,可以在http模式下享受https的安全性
-
IOC:类似于spring的IOC功能,但拥有自己的特色。比如支持数组、集合方式的注入
-
ORM:类似于Hibernate的ORM,支持分表。它的特点是可以结合redis做准实时缓存,它跟hibernate二级缓存的显著区别就在于准实时。开发人员在操作数据库的时候,默认情况下,他并不关心数据来自缓存还是数据库。整个sumk框架,只有ORM功能有使用门槛。点这里看它的帮助文档。
-
事务:支持读写分离、权重、多数据源
-
mybatis支持:sumk有自己的sql执行工具:RawUtil和NamedUtil。它们可以执行sql文件中的sql,但不支持if等标签。如果需要更灵活的操作,请使用mybatis。sumk提供了对mybatis的内置支持。
-
redis封装:封装了redis的连接获取与关闭、失败重试、多数据源路由等。
-
分布式session:只要在redis.properties里配置了session的地址,就实现了分布式session。否则就是单机运行。切换就是这么简单
-
数据事件体系:使用ORM方式对数据库进行操作,会将操作的事件发布出来,开发者可以在代码中对事件进行监听,以便做视图之类的,也可以利用这个功能,跟ElasticSearch、mongodb等nosql结合起来。
-
异常体系:异常处理很考验开发者的基本功。许多应用的异常体系都是一团糟。sumk可以让开发者从异常中解脱出来,开发人员不需要去catch异常,也不需要做太多的校验,比如空指针之类。
-
线程管理:sumk将应用的线程管理起来,使得系统的线程不至于暴涨,让线程可以更有效的被利用,并提供工具方法,使得开发人员可以很方便的执行异步任务。此外还提供了限流功能,当线程紧张的时候,低优先级的任务会被直接拒绝。
-
配置式:sumk的许多内容,比如单机或集群,以及内置的各种参数,都可以通过app.properties来配置。也可以通过扩展,改到zookeeper等统一配置管理平台上。
-
分布式锁:因为许多应用是分布式部署的,需要用到分布式锁。sumk内置了一套分布式锁,只要有redis就可以运行,不需要开发任何额外的代码。它的原理是基于redis的lua脚本。
-
日志体系(建设中):在高并发应用中,接口调用量很高,很难定位日志是哪个请求打印的。sumk将会记录日志所属的用户或访问,便于日志跟踪。并且会提供统一日志扩展,不需要额外使用logstash等日志工具
-
测试框架:数据库和微服务的单元测试一向是痛点。sumk提供了测试接口,在测试模式下,所有的数据库操作都会被回滚。它发起的微服务调用,如果被调用方允许被测试,它所做的数据库修改也会被还原。ORM的redis缓存也会被清理,但是手工修改的redis无法被清理。
-
其它功能:sumk还提供了“web的第三方应用登陆”、“web的多端互踢”、“拦截器”、“工具”等功能。它的功能远不止上述那些。它是一个百宝箱,如果你掌握了,开发速度将会大大提升
通过maven引入sumk.jar及其依赖包:
<dependency> <groupId>com.github.youtongluan</groupId> <artifactId>sumk</artifactId> <version>1.9.0</version> </dependency>
sumk的四大模块为:数据库操作、微服务、web请求、IOC。除了sumk-db,其它使用很简单。仔细阅读一下说明,再配合源码工程test目录下的例子,你就能很快搭建一个互联网工程了。
数据库操作方面,sumk提供了sumk-db、RawDB、NamedDB和Mybatis4种方式,以下是代码示例:
@Box //@Box表示启用sumkDB的事务管理,类似于spring的@Transaction public void test() { //sumk-db类似于hibernate,以下是示例 DemoUser user = new DemoUser(); user.setAge(30); user.setName("张三"); user.setLastUpdate(new Date()); DB.insert(user).execute(); //插入对象 //多条件查询,sumk不好入门的也就只有这个。这个功能是可选的,不用也没关系 List list=DB.select().tableClass(DemoUser.class) .lessThan("lastupdate", new Date()) .orderByAsc("lastupdate") .offset(10) .limit(10) .queryList(); //sumk-db例子结束 // RawDB使用的是原生的sql,后面跟的是要注入的参数。参数个数与sql中的?的个数一致 RawDB.list("select * from demouser where name=? and age=?", "登陆",12); //NamedDB类似于mybatis,目前只支持#{}方式,不支持等标签。 NamedDB.count("select count(1) from demouser where name=#{name}", SBuilder.map("name", "登陆").toMap()); }
数据库读写分离的配置实例(db/sumk.ini文件):
#以下所列的是必须参数,它支持所有的dbcp参数,以便调优。 #默认驱动是com.mysql.jdbc.Driver,可以配置driverClassName改为其它驱动,orm的某些功能只支持mysql [db1] #type:wr表示可读可写,read是读,write是写 type=wr url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&cachePrepStmts=true username=root password=root #如果只有一台数据库,以下就不需要了 [db2] type=read url=jdbc:mysql://127.0.0.1:3307/test?useUnicode=true&characterEncoding=utf-8&cachePrepStmts=true username=root password=root
微服务(sumk-soa)代码示例:
/////////////////////////////////////服务器端: @Soa //只需要这个注解,就能接收RPC请求,默认接口名是 groupId.appId.小写的方法名 public List echo(String echo,List names){ ............ return list; } //////////////////////// 客户端调用 List names=Arrays.asList("游夏","游侠"); String echo=",how are you"; String result=Rpc.call("groupId.appId.echo", echo,names); //返回是json格式的List对象
soa配置:
# 以下配置项是在app.properties中 # soa使用的zookeeper地址,如果不用微服务功能,就不需要配置(服务器端跟客户端都要) sumk.zkurl=127.0.0.1:2181 # 如果不做微服务的服务器端,就不需要配置(服务器端跟客户端都要) sumk.groupId=** # 如果不做微服务的服务器端,就不需要配置(服务器端跟客户端都要) sumk.appId=** # soa监听的端口(服务器端才要) soa.port=919 # 这个是服务器端才需要的配置。soa接口所放置的包路径,会扫描它的所有子文件夹。多个包路径用逗号隔开(服务器端才要) soa=org.test # 这个是微服务客户端才需要的配置。如果想通过微服务调用其它应用的接口,就需要这一行配置(客户端才要) soa.client.start=1
sumk-http代码示例:
@Web //只需要这个注解就表示可以接受http请求 public List echo(String echo,List names){ List list=new ArrayList(); for(String name:names){ list.add(echo+" "+name); } return list; } //客户端就是一般的http请求 //请求路径是http://localhost/intf/rest/echo //请求实体是data={"echo":"hi","name":["张三","李四"]}
IOC示例(很像spring):
@Bean public class UserDao{ } @Bean public class UserService{ @Inject private UserDao dao; @Inject private UserDao[] daos; }
Redis的使用例子:
// 需要在redis.properties中配置default=ip:port Redis redis1=RedisPool.defaultRedis(); // redis类的api与jedis一样,但不需要手动关闭连接。它具备自动重试、连接管理等功能。 // 而且不需要担心重复创建连接池。同时sumk还考虑了
sumk项目的搭建非常简单,只要app.properties、sumk.ini(可选)、app.properties(可选)、sumk.jar及其它依赖包,您就自动拥有了架构图中的那些功能。启动方式是调用SumkServer.start()。需要jdk1.8
使用入门:
用maven导入sumk及其依赖包,将测试类拷到本地工程,运行org.test.Main就可以启动内置zookeeper、web服务、微服务服务。org.test.soa.client.RpcTest是微服务调用例子,org.test.web.client.HttpTest是web使用例子。如果在tomcat中使用sumk的http功能,就在web.xml中配置SumkLoaderListener监听器。
更详细的参见githup上的说明,git中还有一个简单的web例子(sumk-http-demo)。
接口压测:
运行org.test.Main,在这个类的相同目录下,有HttpPressTest和RpcPressTest两个文件,分别是http和微服务的压测用例。2个用例的压测结果大概是http每秒3k-10k次请求,rpc每秒6k-20k次请求。