Coder Social home page Coder Social logo

swingfrog / summer Goto Github PK

View Code? Open in Web Editor NEW
528.0 34.0 160.0 652 KB

这是一个轻量级的、一站式的java游戏服务器框架,也可用于开发简单的web服务。基于netty实现了高性能通讯,支持tcp、http、websocket等协议,支持protobuf、json两种数据格式,支持以配置的形式轻松开启多端口网络服务。支持RPC远程调用,支持以优雅的方式实现远程调用,支持调用超时重试、幂等调用。封装了持久化层,提供数据访问和数据落地接口,支持异步新增、保存、删除数据,支持主键或指定其他字段进行数据缓存。支持简单的ioc,业务层使用依赖注入实现逻辑。封装了伪协程实现方案Promise,可用于解决地狱式回调等问题。支持MVC、领域、ECS架构。

License: Apache License 2.0

Java 99.93% HTML 0.07%
java game server distributed mmo netty rpg mmorpg-server ioc-container server-framework

summer's People

Contributors

dependabot[bot] avatar swingfrog avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

summer's Issues

建议

我用了你的框架,感觉有一个问题要解决:就是游戏服务器的多线程复杂问题。虽然你分了几个事件队列,但感觉依然解决不了并发的风险问题。我们项目用你的这个框架,在并发问题上放弃了,最后还是回到单线程模型。建议你可以研究一下AKKA和STM。

StringPasswordLineDecoder有内存泄露

package com.swingfrog.summer.protocol.stringline 

包下的 StringPasswordLineDecoder在使用了ByteBuf后未进行资源回收

在server.properties中开启密码验证,使用websocket连接长时间运行后,会导致netty报内存不足。

使用netty自带的工具可以检测出来,启动项目时添加vm参数
-Dio.netty.leakDetectionLevel=PARANOID

建议在StringPasswordLineDecoder.decode增加

ReferenceCountUtil.release(msg);

在多服务器下的一些问题和建议

作者大大你好,这几天我测试了1000人在多服务器下的运作发现几个问题和需要优化的地方
1.Summer.getRandomRemoteClient 这个方法需要优化一下,假如随机拿到一个远程的服务器调用,此时这个服务器如果挂掉,会造成请求超时。建议优化成Summer.(a)syncSendRandomRemoteClitent,当有一台不可用的时候,进行轮询/随机切换到可用的为止
2.多台服务器之间进行连接时,部分服务器会一直不停 remove和add其他服务器,我查看代码貌似发现是一直在不停的触发channelInactive ,触发非常频繁。这个我不清楚是怎么造成的。

SessionContext里面保存waitWriteQueue貌似有问题

因为Java对于所有对象都是复制拷贝的,所以如果使用Summer框架的逻辑代码里从框架获取了SessionContext对象,然后再用这个对象去调用syncPushToSessionContext,就会出现重复返回数据包的问题。
譬如逻辑代码是一个函数,函数开头从框架获取了SessionContext sctx;此时sctx里面的waitWriteQueue有5个包,当逻辑代码的函数执行完了,需要向这个sctx推送一条数据。此时逻辑代码里保存的sctx里面还是有5个包,但是框架里可能已经把这5个包都发出去了。此时调用syncPushToSessionContext(stcx)的时候,又会把这5个包重新发出去一次。
我觉得可以考虑把waitWriteQueue移出SessionContext,或者不允许逻辑代码获取SessionContext,或者将所有pushToSessionContext有关的函数都设置成private,不允许逻辑代码调用。

RpcClientMgr.java在一个Cluster下多个不同serverName时出现的BUG

Summer/src/main/java/com/swingfrog/summer/server/rpc/RpcClientMgr.java:29

    public void add(SessionContext sctx, String cluster, String serverName) {
		log.debug("server register rpc client cluster[{}] serverName[{}] sessionContext[{}]", cluster, serverName, sctx);
		RpcClientCluster clientCluster = nameToCluster.get(cluster);
		if (clientCluster == null) {
			clientCluster = new RpcClientCluster();
			clientCluster.addClient(serverName, new RpcClientGroup());
			nameToCluster.put(cluster, clientCluster);
		}
		clientCluster.getRpcClientGroup(serverName).addClient(sctx);
	}

第一个serverName插入时会new RpcClientGroup(),第二个不会,应该改成

    public void add(SessionContext sctx, String cluster, String serverName) {
        log.debug("server register rpc client cluster[{}] serverName[{}] sessionContext[{}]", new Object[]{cluster, serverName, sctx});
        RpcClientCluster clientCluster = (RpcClientCluster)this.nameToCluster.get(cluster);
        if (clientCluster == null) {
            clientCluster = new RpcClientCluster();
            this.nameToCluster.put(cluster, clientCluster);
        }

        RpcClientGroup rcg = clientCluster.getRpcClientGroup(serverName);
        if (rcg == null) {
            rcg = new RpcClientGroup();
            clientCluster.addClient(serverName, rcg);
        }

        rcg.addClient(sctx);
    }

项目启动报错--hello, you need to fill in two parameters to start the application.

报错信息如下:
hello, you need to fill in two parameters to start the application.

args:
[app jar] [main class]

example:
xxx.jar xxx.xxx.xxx.xxx

看样子要给vm传一个jar包的名字作为参数,后面的我猜应该传ip但是,传了以后继续报错如下:
Connected to the target VM, address: '127.0.0.1:64461', transport: 'socket'
����: �Ҳ������޷��������� Summer.jar
Disconnected from the target VM, address: '127.0.0.1:64461', transport: 'socket'

Process finished with exit code 1
而且没有数据库文件,后面怎么执行?

启动的报这个错,好象是那个异步数据仓库加载初始化的时候报错!请问是什么原因?

                                        Summer Server Powered by Toke 2018

2019-10-23 17:55:03:272 [main] INFO [] summer init...
2019-10-23 17:55:03:272 [main] INFO [] config load...
2019-10-23 17:55:03:382 [main] ERROR [] null
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.valueOf(Integer.java:766)
at com.swingfrog.summer.config.ConfigUtil.getValueByTypeAndString(ConfigUtil.java:49)
at com.swingfrog.summer.config.ConfigUtil.loadDataWithBean(ConfigUtil.java:34)
at com.swingfrog.summer.db.repository.AsyncCacheRepositoryMgr.loadConfig(AsyncCacheRepositoryMgr.java:41)
at com.swingfrog.summer.app.Summer.hot(Summer.java:90)
at com.test.summerDemo.game.GameApp.main(GameApp.java:29)
2019-10-23 17:55:03:397 [main] INFO [] async cache repository manager loading config, core thread num[16]
2019-10-23 17:55:03:397 [main] INFO [] task init
2019-10-23 17:55:03:444 [main] INFO [] container init...
2019-10-23 17:55:03:460 [main] INFO [] register remote ChatRemote
2019-10-23 17:55:03:460 [main] INFO [] server init...

你好

请问一下初学 请问一下能不能提供有一些具体的业务的项目参考一下 有具体的http来往的业务

建议:增加节点间传输的protobuf

目前条件比较有限,如果网关和客户端之间使用protobuf,网关需要转发给其他服务处理业务,最好是直接把protobuf丢到其他节点.但是看到ClientInitializer里面只支持到两种,如果加上protobuf就有意思啦,不过总体来说Summer用起来还是挺舒服

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.