移动互联网架构神器 sumk

码农软件 · 软件分类 · Web框架 · 2019-03-25 21:42:06

软件介绍

       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次请求。

本文地址:https://www.codercto.com/soft/d/2154.html

腾讯传

腾讯传

吴晓波 / 浙江大学出版社 / 2017-1-1 / 58.00元

腾讯官方唯一授权的权威传记 著名财经作家吴晓波倾力之作 当市值最高的中国互联网公司,遇上中国财经界最冷静的一双眼睛 读懂腾讯,读懂中国互联网 . 内容简介 本书全景式地记录了腾讯崛起的经历,并以互联网的视角重新诠释了中国在融入全球化进程中的曲折与独特性。 从1998年开始创业到成为世界级互联网巨头,腾讯以即时通信工具起步,逐渐进入社交网络、互动娱乐、网络媒......一起来看看 《腾讯传》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具