Coder Social home page Coder Social logo

swingfrog / summer Goto Github PK

View Code? Open in Web Editor NEW
529.0 34.0 161.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 Issues

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);
    }

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

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

你好

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

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

                                        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...

项目启动报错--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
而且没有数据库文件,后面怎么执行?

StringPasswordLineDecoder有内存泄露

package com.swingfrog.summer.protocol.stringline 

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

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

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

建议在StringPasswordLineDecoder.decode增加

ReferenceCountUtil.release(msg);

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

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

建议

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

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.