# grain **Repository Path**: gary/grain ## Basic Information - **Project Name**: grain - **Description**: grain是一款极简、颗粒化的RPC框架,同时包含多对多关系的分布式锁等组件,按需选择组件,不绑架用户不耍流氓。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 49 - **Created**: 2017-09-30 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # grain # grain是一款极简、颗粒化的RPC框架,同时包含多对多关系的分布式锁等组件,按需选择组件,不绑架用户不耍流氓。 ## grain架构图 ![架构图](./grain.bmp "grain.bmp") # 正如名字grain本着极简、颗粒化的原则,就算一步一步开发到distributedlock(多对多关系的分布式锁),也仅仅使用了三个外部jar包。 # 开发者可根据项目情况按需选择组件,例如: >1、如果你想使用distributedlock(多对多关系的分布式锁),那需要选择他依赖的六个组件和三个外部jar包。 >2、如果你想使用rpc(远程对象访问),那需要选择他依赖的五个组件和三个外部jar包。 >3、如果你想使用threadmsg(系统多线程模型,线程消息通讯),那需要选择他依赖的三个组件,不需要任何外部jar包。 >4、如果你想使用threadkeylock(支持锁类型单键值与双键值的多线程锁),那仅仅只需要他依赖的一个组件和他本身。 ## 组件介绍 #### 1、grain-log(日志接口) 如果想打印日志,需要实现此日志接口并将实现的类的对象传递到各个组件初始化函数中。 [日志组件-更多信息](./grain-log) --- #### 2、grain-msg(通用消息) 可进行消息的注册、监听、派发等功能。(当前线程) [消息组件-更多信息](./grain-msg) --- #### 3、grain-thread(系统多线程模型) grain最核心的组件,支撑起上层很多组件包含threadmsg(线程消息通讯)、rpc(远程对象访问)、distributedlock(多对多关系的分布式锁)。 grain-thread支持创建多线程池,业务轮询精准注入指定线程ID,任意消息(例如:msg、tcp、websocket等)精准注入指定线程ID。 [系统多线程模型-更多信息](./grain-thread) --- #### 4、grain-threadmsg(线程消息通讯) 系统多线程之间的通讯,业务线程跳转都依赖此组件。 [线程消息通讯-更多信息](./grain-threadmsg) --- #### 5、grain-tcp(TCP客户端与服务器) 通过grain-tcp可创建TCP客户端与服务器进行通讯,客户端支持断线重连。通讯消息序列化与反序列化,粘包问题等都已内部解决。 [TCP客户端与服务器-更多信息](./grain-tcp) 例子:grain-tcp-clienttest、grain-tcp-servertest直接运行main函数即可 --- #### 6、grain-rpc(远程对象访问) 通过grain-rpc可以创建RPC客户端与服务器进行远程对象访问。多线程阻塞,唤醒等复杂的多线程业务都已内部解决。 简单例子: 1、创建消息包 RPCTestC.Builder builder = RPCTestC.newBuilder(); builder.setName("RPC你好啊"); TcpPacket pt = new TcpPacket(TestTCode.TEST_RPC_C, builder.build()); 2、远程调用 TcpPacket ptReturn = WaitLockManager.lock(session, pt); [远程对象访问-更多信息](./grain-rpc) 例子:grain-rpc-clienttest、grain-rpc-servertest直接运行main函数即可 --- #### 7、grain-distributedlock(多对多关系的分布式锁) 去中心化思路,通过grain-distributedlock可以创建分布式锁服务器与锁客户端。 grain-distributedlock不同类型互不影响,相同类型不同键值互不影响。仅仅当类型与键值都相等时会进行分布式阻塞。 锁客户端与锁服务器的双向线程阻塞,服务器匹配、类型键值与线程ID的匹配都已内部解决。 简单例子: // 获取锁 int lockId = DistributedLockClient.getLock("111", "user"); if (lockId == 0) { return; } /*********** 执行分布式锁业务逻辑 *********/ System.out.println("分布式锁id为:" + lockId); /*********** 执行分布式锁业务逻辑 *********/ // 释放锁 DistributedLockClient.unLock("111", "user", lockId); [多对多关系的分布式锁-更多信息](./grain-distributedlock) 例子:grain-distributedlock-clienttest、grain-distributedlock-servertest直接运行main函数即可 --- #### 8、grain-config(通用配置加载管理) grain-config可以进行配置的加载,管理等工作。支持模板类文件与json文件。 [通用配置加载管理-更多信息](./grain-config) --- #### 9、grain-threadkeylock(支持锁类型单键值与双键值的多线程锁) 在多线程业务中,支持锁类型的单键值与双键值,并且支持锁函数 简单例子1(锁函数):当类型为TEST1,键值为111同时调用函数时,会进行锁定。 public String lockFunction(Object... params) {} String str = (String) KeyLockManager.lockMethod("111", TEST1, (params) -> lockFunction(params), new Object[] { "222", 111 }); 简单例子2(锁函数):当类型为TEST1,键值为111或222同时调用函数时,会进行锁定。 String str = (String) KeyLockManager.lockMethod("111", "222", TEST1, (params) -> lockFunction(params), new Object[] { "222", 111 }); [支持锁类型单键值与双键值的多线程锁--更多信息](./grain-threadkeylock) --- #### 10、grain-reds、grain-mongodb、grain-mariadb(持久与缓存) 更简洁的操作redis、mongodb、mariadb。 [redis--更多信息](./grain-redis) [mongodb--更多信息](./grain-mongodb) [mariadb--更多信息](./grain-mariadb) ---