自己的微服务框架

微服务的定义

一次编写,处处调用

由于之前的公司没有使用spring系列,也没有使用dubbo系列,而是公司自己弄了一套框架,有许多优点,也有一些不足,在其启发下,自己也搞了一套简化版的微服务架构

主要解决了以下问题

1.一主多从时,多个数据源进行轮询负载均衡

2.分库分表时,自动根据分库分表规则进行sql的改写,定位正确的数据源和表,进行数据操作,程序员正常写sql就行

3.一次编写,处处调用。无论是注册的sql服务,还是注册的本地java程序服务,还是远程服务器的服务,服务调用时,一视同仁,无需关注底层实现

4.大多数服务,通常是调用sql,像mybatis和hibernate,操作数据时特别麻烦,需要写很多的代码,而本框架简单至上,就像李小龙的截拳道一样,简单,直接,有效, 比hibernate和mybatis好用多了,开发效率也能提高很多

调用方式

所有服务的调用都是一样的,只需要知道服务名,传入指定的参数即可
例如:listUser,updateUserInfo等,然后顺序传入sprParam字段里面的参数即可:

 Map<String, Object> mapReq = new HashMap<>();
        mapReq.put("strAction", "listUser");
        mapReq.put("age", "30");
        Return ret = HandlerManager.instance.handler(mapReq);
        if (ret.getCode() != 0) {
            System.out.println("出错了: " + ret.getMsg());
            return;
        }
List<Map<String, Object>> list = ret.getList();
for (Map<String, Object> map : list) {
            String strMobile = map.get("strMobile").toString();
            String strIdentity = map.get("strIdentity").toString();
            ...
}

框架构成

1.sql服务

CREATE TABLE tbSql
(
    lId INT(11) DEFAULT '0' PRIMARY KEY NOT NULL AUTO_INCREMENT,
    strKey VARCHAR(36) NOT NULL COMMENT '编码',
    strName VARCHAR(128) DEFAULT '' COMMENT '名称',
    strSql VARCHAR(1024) DEFAULT '' COMMENT 'sql',
    strParam VARCHAR(128) DEFAULT '' COMMENT '参数',
    dtModifyTime DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
    dtCreateTime DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    strTable VARCHAR(100) DEFAULT '' COMMENT '表名:属于哪个表的sql',
    strResultType VARCHAR(32) DEFAULT '' COMMENT '返回值类型',
    strDataSource VARCHAR(100) DEFAULT '' COMMENT '数据源',
    strDataGroup VARCHAR(64) DEFAULT '' COMMENT '分库分表规则'
);
CREATE UNIQUE INDEX tbSql_strKey_uindex ON tbSql (strKey);
SELECT * FROM tbBorrower WHERE lUserId = '{}'
INSERT INTO stock.tbSql (lId, strKey, strName, strSql, strParam, dtModifyTime, dtCreateTime, strTable, strResultType, strDataSource, strDataGroup) VALUES (1, 'getUserMobile', '获取用户手机号', 'SELECT * FROM tbBorrower WHERE lUserId = 33;', 'lUserId', '2018-04-03 16:08:30', '2018-04-03 16:08:30', 'tbBorrower', 'list', 'stockDataSource', '');


JAVA代码调用形式如下:根据strKey顺序传入参数即可

 DataSource.getDataSource().update("createTaskUser", strTaskName, strType, strMsg, strCondition);

字段说明
strKey :服务名称,调用者根据此获取来调用指定的sql
strResultType:返回类型,有list, map,int三种类型
strDataSource:数据源的名称
strDataGroup:分库分表规则,例如5:100:50000:lUserId,意思是5库百表,每个表里面存50000个用户的数据,分表的规则是根据lUserId来的,如果lUserId = 359000,那么它应该在359000/50000 = tbUser7表中,在7/5= dbUser1库中

数据源管理

数据源的数据也是放到数据库里面的,使用dbcp数据库连接池

CREATE TABLE tbDataSource
(
    lId INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    strKey VARCHAR(36) NOT NULL COMMENT '数据源唯一标示',
    strName VARCHAR(128) DEFAULT '' COMMENT '数据源名称',
    strUsername VARCHAR(128) DEFAULT '' COMMENT '用户名',
    strPassword VARCHAR(128) DEFAULT '' COMMENT '密码',
    strUrl VARCHAR(128) DEFAULT '' COMMENT 'JDBC连接串,一主多从时,多个数据源用逗号分隔',
    strDriverClassName VARCHAR(128) DEFAULT '' COMMENT '驱动名称',
    strConnectionProperties VARCHAR(128) DEFAULT '' COMMENT '连接属性,格式[参数名=参数值]',
    nIsolation INT(4) DEFAULT '2' COMMENT '事务隔离级别',
    nInitialSize INT(8) DEFAULT '5' COMMENT '初始化的连接数',
    nMaxTotal INT(8) DEFAULT '10' COMMENT '最大的连接数',
    nMaxIdle INT(8) DEFAULT '10' COMMENT '最大空闲连接数',
    nMinIdle INT(8) DEFAULT '10' COMMENT '最小空闲连接数',
    nMaxWaitMillis INT(8) DEFAULT '10' COMMENT '从连接池获取一个连接时,最大的等待时间',
    dtModifyTime DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
    dtCreateTime DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    strDataGroup VARCHAR(64) DEFAULT '1' COMMENT '分库分表配置,五个库时值为5,1个库时值为1',
    nState INT(4) DEFAULT '1' COMMENT '1:生效,0:失效'
);
CREATE UNIQUE INDEX tbDataSource_strKey_index ON tbDataSource (strKey);

strUrl 字段,在一主多从的情况下,可以将多个从库的url以逗号分隔,放到里面,在加载数据源时,

 private Map<String, List<BasicDataSource>> mapDataSource = new HashMap<>();

会将它们和strDataSource进行一对多的绑定,在sql调用时,进行轮询负载均衡

strDataGroup 字段,会在加载数据源时,对数据源的url经常处理:
read.user.mysql -->
read0.user.mysql, read1.user.mysql,read2.user.mysql ...
在调用sql服务时,会判断是否分库分表,也就是tbSql.strDataGroup字段是否为空,如果不为空,则会动态计算strDataSource,从而找到正确的数据源,获取正确的Collection,进行数据库操作

调用流程
1.根据服务名去sql服务里面匹配,如果找到了,调用sql查询,返回结果
2.如果没有找到相应的sql服务,去java代码里面找

        //  注册java服务
        HandlerManager.instance.regisger("insertUser", new InsertUserHandler());
        HandlerManager.instance.regisger("listUserByName", new ListUserByNameHandler());
        //  查找java服务
        logger.info("sql 服务没有找到,开始查找注册服务");
        Handler handler = this.map.get(map.get("strAction").toString());
            if (handler != null) {
            return handler.handler(map);
        } else {
            return Return.Error("服务找不到");
        }

3.如果还找不到,就去查询其他服务器是否提供了改服务,进行远程调用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容