sumk - 移动互联网架构神器


Apache 2.0
跨平台
Java

软件简介

sumk是一款 轻量级互联网 框架。拥有 开发速度快性能好、 易于 横向扩展
等特点。并且集成了一些互联网中常见功能, sumk入门文档点这里

主要功能特点简单介绍如下:

  • 配置管理:sumk默认的配置是app.properties,同时内置了http、zookeeper两种统一配置中心。所有这些配置,都支持热变更,而不需要重启应用。并且提供了配置变更的通知机制。大多数配置都能兼容半角和全角符号。

  • 微服务:服务注册、自动发现、故障转移、负载均衡等常见功能这里也都提供,并且使用更简单。服务器端只要在方法上添加@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功能有使用门槛点这里看它的帮助文档

  • 事务:支持读写分离、权重、多数据源

  • 数据库事件监听:通过ORM修改数据表的内容,在事务提交后,可以获取到它的通知。代码示例在这里

  • mybatis支持:sumk有自己的sql执行工具:RawUtil和NamedUtil。它们可以执行sql文件中的sql,但不支持if等标签。如果需要更灵活的操作,请使用mybatis。sumk提供了对mybatis的内置支持。

  • redis封装:封装了redis的连接获取与关闭、失败重试、多数据源路由等。

  • 分布式session:只要在redis.properties里配置了session的地址,就实现了分布式session。否则就是单机运行。切换就是这么简单

  • 异常体系:异常处理很考验开发者的基本功。许多应用的异常体系都是一团糟。sumk可以让开发者从异常中解脱出来,开发人员不需要去catch异常,也不需要做太多的校验,比如空指针之类。

  • 线程管理:sumk将应用的线程管理起来,使得系统的线程不至于暴涨,让线程可以更有效的被利用,并提供工具方法,使得开发人员可以很方便的执行异步任务。此外还提供了限流功能,当线程紧张的时候,低优先级的任务会被直接拒绝。

  • 分布式锁:因为许多应用是分布式部署的,需要用到分布式锁。sumk内置了一套分布式锁,只要有redis就可以运行,不需要开发任何额外的代码。它的原理是基于redis的lua脚本。

  • 日志体系:在高并发应用中,接口调用量很高,很难定位日志是哪个请求打印的。sumk将会记录日志所属的用户或访问,便于日志跟踪。并且会提供统一日志扩展,不需要额外使用logstash等日志工具。具体参见这里

  • 测试框架:数据库和微服务的单元测试一向是痛点。sumk提供了测试接口,在测试模式下,所有的数据库操作都会被回滚。它发起的微服务调用,如果被调用方允许被测试,它所做的数据库修改也会被还原。ORM的redis缓存也会被清理,但是手工修改的redis无法被清理。

  • 其它功能:sumk还提供了web的第三方应用登陆、web的多端互踢、拦截器等功能。它的功能远不止上述那些。它是一个百宝箱,如果你掌握了,开发速度将会大大提升

使用方式:通过maven引入sumk-log、sumk.jar及其依赖包(最新版惨叫maven中央库)。可以通过sumk-
log引入,也可以直接引入sumk.jar,sumk-log是可选的。

<dependency>
    <groupId>com.github.youtongluan</groupId>
    <artifactId>sumk-log</artifactId>
    <version>2.2.1</version>
</dependency>

sumk的四大模块为:数据库操作、微服务、web请求、IOC。除了sumk-db,其它使用很简单。

数据库操作方面,sumk提供了sumk-
db、RawDB(RawDBUtil)、NamedDB(NamedDBUtil)和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());

    }

微服务(sumk-soa)代码示例:

/////////////////////////////////////服务器端:
@Soa
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对象

sumk-http代码示例:

    @Web 
    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":["张三","李四"]}

sumk项目的搭建非常简单,只要app.properties、sumk.jar及其它依赖包,您就自动拥有了架构图中的那些功能。启动方式是调用SumkServer.start()。需要jdk1.8。搭建示例参见文档

使用入门:

只需要引入sumk包,并添加配置文件app.properties,你就能运行sumk应用了。具体步骤参见sumk框架入门.docx

接口压测:

运行org.test.Main,在这个类的相同目录下,有HttpPressTest和RpcPressTest两个文件,分别是http和微服务的压测用例。2个用例的压测结果大概都在2万次每秒(根据机器环境的不同而不同)。

联系方式:

QQ:3205207767