Summer
这是一个轻量级的、一站式的java游戏服务器框架,也可用于开发简单的web服务。基于netty实现了高性能通讯,支持tcp、http、websocket等协议,支持protobuf、json两种数据格式,支持以配置的形式轻松开启多端口网络服务。支持RPC远程调用,支持以优雅的方式实现远程调用,支持调用超时重试、幂等调用。封装了持久化层,提供数据访问和数据落地接口,支持异步新增、保存、删除数据,支持主键或指定其他字段进行数据缓存。支持简单的ioc,业务层使用依赖注入实现逻辑。封装了伪协程实现方案Promise,可用于解决地狱式回调等问题。支持MVC、领域、ECS架构。
Install / Use
/learn @SwingFrog/SummerREADME
Summer
- 这是一个轻量级的、一站式的java游戏服务器框架,也可用于开发简单的web服务。
- 基于netty实现了高性能通讯,支持tcp、http、websocket等协议,支持protobuf、json两种数据格式,支持以配置的形式轻松开启多端口网络服务。
- 支持RPC远程调用,支持以优雅的方式实现远程调用,支持调用超时重试、幂等调用。
- 封装了持久化层,提供数据访问和数据落地接口,支持异步新增、保存、删除数据,支持主键或指定其他字段进行数据缓存。
- 支持简单的ioc,业务层使用依赖注入实现逻辑。
- 封装了伪协程实现方案Promise,可用于解决地狱式回调等问题。
- 支持MVC、领域、ECS架构。
目录
更新说明
1.1.19 - 2024-08-23
- 新增@ShardingKey注解,可对Repository进行分表,在test.sharding有相关例子。 - 2024-07-14
- 修复Http协议下,上传文件WebFileUpload不能正确保存的问题。 - 2024-07-24
- 优化Summer.getRandomClientRemote(),在调用ClientRemote时可自动轮训到可用的节点再发出RPC请求,感谢 whxlxl 大佬指出问题。 - 2024-07-29
- 优化Client断线重连的方式。- 2024-07-29
- 优化ModelView生成方式,由原来template->heapBuffer->directBuffer改为template->directBuffer,减少了一次内存拷贝。- 2024-08-17
- 新增WebResponseHandler,可用于在HttpServer响应前修改WebView或HttpResponse。- 2024-08-23
- 将原来的WebRequestHandler更名为ServerWebHandler。新增WebRequestHandler,可用于在HttpServer响应前修改WebRequest。- 2025-04-13
- 将RemoteStatistics默认设为关闭状态,通过RemoteStatistics.open手动开启。
1.1.18 - 2023-12-15
- Summer启动时可选择加载的模块,通过Summer.addModuleNet()、addModuleDb、addModuleRedis加载模块,或者通过addModuleAll加载所有模块。
1.1.17 - 2023-09-20
- 新增网络协议Custom,通过ProtocolCustomMgr设置ProtocolCustomHandler可实现自定义协议处理。 - 2023-03-09
1.1.16 - 2022-10-17
- 修复了使用注解@Optional,当参数类型为基本类型会报错的问题,修改后可选的基本类型参数将提供默认参数值。
- 注解@Optional,新增默认值。
- 优化MySQL、Redis的Connection链路关闭权限,由发起者来关闭链路。
- @Service支持事务管理,使用时需在方法上加上注解@Transaction,在SummerConfig中设置enableServiceRemoteProxy为true。
- 移除Quartz任务调度框架,改用Spring的Cron表达式解析器配合ScheduledExecutorService实现定时任务调度。
- 移除Druid数据库连接池框架,改用Hikari。
1.1.15 - 2022-09-19
- 修复Http协议下,数据未发完链路关闭的问题。 - 2022-07-13
- 将所有网络IO相关的buffer分配,由原来的非池化堆内缓存改为池化堆外缓存。 - 2022-09-19
- WebView的onRender返回值调整,由原来的ChunkedInput<ByteBuf>改为WebViewRender,可使用默认实现DefaultWebViewRender。其中FileView,由原来的ChunkedFile改为FileRegion。 - 2022-09-19
1.1.14 - 2022-07-07
- Http协议下,只能处理get/post方法,其他方法将直接关闭链路。 - 2022-02-08
- 修复StringLine协议下会导致内存泄漏的问题,感谢 whxlxl 大佬指出问题。 - 2022-06-16
- Http协议下,处理完请求发送响应后自动关闭链路。 - 2022-07-07
1.1.13 - 2022-01-24
- 修复在RemoteTinyDispatchMgr抛出异常RemoteRuntimeException时,参数显示错误的问题。
- 新增AsyncAddRepository,可用于日志异步插入。
- 新增RepositoryEntity,仓库中的实体类实现此接口,即可直接执行 实体对象.add() 实体对象.save() 实体对象.remove()操作,而不再需要像以前 仓库对象.add(实体对象) 仓库对象.save(实体对象) 仓库对象.remove(实体对象),在一些场景下或许有助于提高开发速度。
1.1.12 - 2021-09-30
- SummerConfig中新增字段enableServiceRemoteProxy,用以控制Summer启动时是否启用service和remote的代理。增强后的service、remote对于现在项目来说不一定有帮助,例如remote中的数据库事务处理操作,在异步仓库的环境下用处不大。故默认设置为不开启,如需启用请将此字段设置为true。
- 新增@Dao注解下的类可使用@Autowired注解注入对象,为了使用起来更方便。之前的设计是从remote->service->dao,在业务不复杂的情况下,可以忽略service,直接remote->dao。
- 对WebView进行简单的抽象。
1.1.11 - 2021-07-31
- 新增网络协议,Tiny JSON。
- 修复RemoteDispatchMgr.invoke解析方法参数,AutowireParam无效的问题。
- 修复AsyncCacheRepository的removeAll不能达到期望效果的问题。在数据库还有旧数据时,刚启动程序先执行removeAll,再执行get或者list等查询操作,依旧可以查询到数据。由于removeAll是异步操作,所以会出现此问题,目前解决方案就是当执行removeAll时,任何查询操作只在缓存中查找不从数据库加载,只有removeAll执行完毕才恢复。
1.1.10 - 2021-06-30
- Lifecycle新增destroy,触发时机为在EventBus关闭后,在Repository关闭前执行,所以destroy中不应该再抛出事件。
- RepositoryBeanProcessor在极端条件下遍历columnHandlers可能出现并发问题,原因是DBUtils的ServiceLoader的遍历操作不是线程安全的,所以现调整为在类加载时先遍历一次ServiceLoader并存入ArrayList,此后只遍历ArrayList。
1.1.9 - 2021-05-31
- 修复SessionHandler.handleReady在http协议下不生效的问题。
1.1.8 - 2021-04-30
- 将框架中用到的LinkedList替换为ArrayList。ArrayList与LinkedList对比
- RepositoryDao新增onLoadAfter、onSaveBefore方法,当对象从数据库加载后调用onLoadAfter,当对象在数据库写入前调用onSaveBefore。
- Rpc轮询机制调整,优先使用可用的client。
1.1.7 - 2021-03-31
- SessionHandler新增方法handleReady,在处理请求前触发此回调,与receive的不同之处是在此方法内可抛出异常,且在会话队列中执行。
- 新增接口RemoteHandler、RemoteProtobufHandler,其中RemoteProtobufHandler仅用于protobuf协议。在使用注解@Remote的类上实现此接口。即可进行一些拦截或其他业务处理。与SessionHandler.handleReady的区别是,触发范围缩小,仅会对进入此类寻求处理方法的协议进行触发。
- Repository新增支持过滤的list方法,新增stream方法获取数据。
1.1.6 - 2021-02-28
- 新增注解@ParamPacking,当接口的参数过多时,可使用一个类包装起来,并在参数前加上此注解。(建议对外开放的接口,不要传递JSON格式的数据)
- 新增WebTokenHandler,在http协议下可自定义token的生成和解析方式。
- 修复Web模式下,设置ErrorView无法渲染的问题。
- 新增WebContentTypes拓展名与内容类型的映射库。
- 优化Web模式下,Url的解析方式。
- 修复仓库模式,当字段设置为readOnly时,在某些情况下会构建出错误的sql语句的问题。
- AsyncCacheRepositoryDao新增showDelaySaveInfo方法,可用于关闭延迟保存数据信息的输出。
1.1.5 - 2021-01-31
- 修复在程序关闭时,异步事件中有推送异步消息的操作导致异常的问题。
- 优化ServerPush,新增简单的调用接口。
- 优化CacheRepositoryDao.list(Map<String, Object> optional),在筛选数据的过程中改用stream,在最后才进行collect操作。
- 新增默认配置,在未明确指定配置文件路径的时候,并且默认路径下的配置文件不存在,则会启用默认配置。例如,在项目中引入summer依赖,无需本地配置文件,即可直接使用Summer.hot启动。
- 通过Summer.hot启动时,未明确指定libPath时将不再通过默认路径"lib"去扫描加载jar。(mvn打包时可通过配置插件自动拷贝依赖以及在程序启动时加载指定依赖)
1.1.4 - 2020-12-31
- 修复异步响应Summer.asyncResponse无法发送错误码。
1.1.3 - 2020-11-30
- Repository中add操作不再执行insertSql语句,修改为replaceSql语句。
- Repository增加listSingleCache方法,当实体只包含一个cacheKey时,可直接调用此方法查询数据。
- Repository采用原子性、自旋等方式替换掉原有的同步锁。
- AsyncCacheRepository中的add、remove增加版本号控制,定时器触发时只会对最新版本的数据进行数据库操作。
- 新增@RequestMapping,可自定义请求映射的接口名称。
- Repository新增removalAll方法。
- EventBus新增订阅和派送方式,使用注解@AcceptEvent,无需设定事件名称,该注解下的方法只允许一个参数,并且该参数的类型将作为"事件名称"用于事件派送,详细请看test中的例子。
- 修复RPC在一个Cluster下多个不同serverName时出现的BUG。感谢 kingo132 大佬指出问题。
1.1.2 - 2020-10-31
- 异步请求远程接口增加RemoteCallbackQuick接口,可用于接收响应的数据。
- 新增meter包,可用于编写压测程序。
- 新增promise包,可用于异步有序执行。
- 优化SessionContextGroup,让SessionContext与Channel直接绑定。
- 优化SessionQueueMgr。
- 新增ecs包,实现了简单的ECS(Entity-Component-System)架构。
- 优化RPC,在底层确保接口幂等性,所有client共用worker、event线程池。
- CodeMsg、CodeException中的code由long调整为int。
1.1.1 - 2020-09-19
- 新增协议,支持protobuf。
- 新增标准的WebSocket协议,与原来的区别是去掉了包头的四个字节。
- remote中的方法限定符如果不是public将不对远程开放。
1.0.18 - 2020-09-13
- 心跳机制优化。
- 用户请求默认在用户队列中进行处理,@SessionQueue废弃。
1.0.17 - 2020-09-08
- SessionContext调整,新增属性token,token可以在用户登录以后手动设置为用户ID,以此作为用户的唯一标识。
- SessionQueueMgr、SingleQueueMgr优化。SessionQueueMgr,不再使用直接使用SessionContext分配队列,改为使用SessionContext中的token分配队列,当token未设置时使用sessionId。
- http协议下,sessionId不再作为用户的唯一标识,sessionId仅作为链路标识。当用户请求接口携带的cookie数据中不存在token时,响应时会下发通过UUID生成的32位字符串作为token,用户下一次请求时就会携带有token。通过sessionContext.getToken()获取token,通过sessionContext.clearToken()清空token。
- 修复部分因为hashcode引发的问题。修复方式,将set改为list,重写hashcode,map中的key如果无法重写hashcode则对结构进行调整。
- 修正SessionHandler中的accept拼写错误
- test例子取消lombok依赖。
1.0.14 - 2020-05-18
- 缓存仓库调整,当PrimaryKey为非自增模式时,使用CacheKey查询经历过remove,add的相同PrimaryKey的实体时,尽管实体中的CacheKey与查询的值不同也依旧能命中缓存,现将其进行修复。当主动remove时,会将存有对应PrimaryKey的CacheKey缓存清除。
1.0.13 - 2020-05-09
- ServerBootstrap启动参数中的ChannelOption.SO_BACKLOG改为读取配置表,并将ChannelOption.ALLOCATOR设为PooledByteBufAllocator.DEFAULT
- 仓库调整,增加getOrCreate方法。
- 当项目未能在预期情况下运行时(例如端口被占用),及时终止进程。
1.0.10 - 2020-04-28
- 当使用仓库时,实体的某个字段的类型如果为Array、Collection(List Set Queue)、Map、以及自定义的类时,需设定length。当length<=255,使用CHAR类型;当length<=16383,使用VARCHAR类型;当length>16383,使用TEXT类型。
- SessionContext中的address分为directAddress和realAddress,其中directAddress为链路IP,realAddress通过Head中的"X-Forwarded-For"获取客户端真实IP,仅在HTTP、WEBSOCKET协议且在使用反向代理的情况下生效。
- AsyncResponseMgr新增process方法可用于捕获异常以及自动发送响应。
1.0.3 - 2020-01-17
- 日志调整,由原来的log4j改为logback,并且移除直接调用log4j的所有代码,完成了日志解耦,可自由替换成slf4j的其他实现。
- 由于不再强制加载日志配置文件,Summer.hot移除了日志配置文件路径的参数。
- Remote新增异步响应请求,可参考test中的例子。
1.0.0 - 2019-12-27
使用mvn重构项目
0.9.1 - 2019-12-26
- 异步缓存仓库调整,修复了异步add、异步remove在一起使用时,可能导致remove失败的问题,并进行了一定的优化,对同一对象先后进行add、remove,当发生在定时器同一执行期内,其操作相互抵消,不再进行数据库操作
- Http协议下,抛出CodeException异常时,日志输出级别由error改为warn
0.9.0 - 2019-12-05
- 缓存仓库调整,移除查询列表时按主键的hash code排序,以此提高性能。如果有业务需求,可以考虑在前端进行排序,分散后端压力。
0.8.0 - 2019-11-07
- 异步缓存仓库调整,当有一个持久化对象,对它进行add、remove、add、remove操作时不能达到预期效果,因为id在第二次add时就发生变动,由于是同一个对象,所以当定时器触发写库时,第一个add的id已经变成了第二个add时的id,第一个remove的id也发生了变化。正确的用法是clone对象后再进行第二次add、remove,但考虑到有些场景是可以复用对象的,于是对异步缓存仓库层进行了调整,add或remove时会记录当时的id,再进行操作。
0.7.3 - 2019-10-25
- 修复某些情况下请求接口时会出现参数错误的问题
0.7.2 - 2019-10-17
- 修复部分线程池不能优雅关闭
- EventMgr改名为EventBusMgr
- 修改了业务线程池和推
