mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-05-18 17:27:10 +00:00
203 lines
8.2 KiB
Markdown
203 lines
8.2 KiB
Markdown
<p align="center">
|
||
<a href="https://github.com/zfoo-project/zfoo"><img src="/doc/image/logo.jpg"></a>
|
||
</p>
|
||
<p align="center">
|
||
👉 <strong>为性能而生的Java服务器框架</strong>👈
|
||
</p>
|
||
|
||
<p align="center">
|
||
<a target="_blank" href="https://spring.io">
|
||
<img src="https://img.shields.io/badge/spring-5.3.4-yellowgreen" />
|
||
</a>
|
||
<a target="_blank" href="https://openjdk.java.net/projects/jdk/">
|
||
<img src="https://img.shields.io/badge/JDK-11+-green.svg" />
|
||
</a>
|
||
<a target="_blank" href="http://www.apache.org/licenses/LICENSE-2.0">
|
||
<img src="https://img.shields.io/badge/license-Apache--2.0-blue" />
|
||
</a>
|
||
</p>
|
||
|
||
<br/>
|
||
|
||
-----------
|
||
Why is zfoo protocol ?
|
||
-----------
|
||
- Java二进制序列化速度最快的自定义格式框架,并且为序列化字节最少的框架,更加安全,可前后兼容
|
||
- 协议目前原生支持 C++ C# Java Javascript TypeScript GDScript Lua,可以轻易实现跨平台
|
||
- 单线程的Benchmark测试中,序列化和反序列化速度比Protobuf快50%,比Kryo快100%
|
||
|
||
Ⅰ. zfoo简介🚩
|
||
-----------
|
||
|
||
- **极致性能,天生异步,Actor设计思想,无锁化设计,基于Spring的MVC式用法的万能RPC框架**
|
||
- **极致序列化**,原生集成目前二进制序列化和反序列化速度最快的 [zfoo protocol](protocol/README.md) 作为网络通讯协议
|
||
- **高可拓展性**,单台服务器部署,微服务部署,注册中心加集群部署,网关加集群部署,随意搭配
|
||
- **上能做游戏服务器框架,下能做应用网站服务器框架**
|
||
|
||
完善的工作开发流程,完整的线上解决方案
|
||
|
||
- 普通java项目,spring项目,分布式项目,容器项目, **不停机完美热更新代码** [hotswap](hotswap/src/test/java/com/zfoo/hotswap/ApplicationTest.java)
|
||
- Excel配置自动映射和解析,**在线不停机热更新Excel配置** [storage](storage/src/test/java/com/zfoo/storage/ApplicationTest.java)
|
||
- MongoDB的自动映射框架 [orm](orm/README.md)
|
||
- 事件总线 [event](event/src/test/java/com/zfoo/event/ApplicationTest.java)
|
||
- 时间任务调度 [scheduler](scheduler/README.md)
|
||
- 内置在程序里的**轻量级cpu,内存,硬盘,网络监控,** 无需代码和额外工具,解放运维生产力 [monitor](monitor/src/test/java/com/zfoo/monitor/ApplicationTest.java)
|
||
|
||
Ⅱ. 背景和适用项目
|
||
---------------
|
||
|
||
- 性能需求极高的项目,如网站和游戏服务器框架,单服滚服,全球服,直播聊天,IM系统,实时推送
|
||
- 节省研发成本的项目,如想节省,开发,部署,运维成本
|
||
- 适合作为 **Godot,Unity,Cocos,Webgl,H5** 的后端基础框架,网络通信协议支持 tcp udp websocket http
|
||
- 喜欢 [KISS法则](https://baike.baidu.com/item/KISS原则/3242383) 的项目 ,简单的配置,优雅的代码
|
||
|
||
Ⅲ. 详细的教程和完整的工程案例
|
||
--------------------
|
||
|
||
- 有问题,先看 [FAQ](./doc/FAQ.md),每个工程目录的test文件夹下都有标准的demo展示和注释说明,可以直接运行
|
||
- [问题讨论群QQ: 876280300](https://qm.qq.com/cgi-bin/qm/qr?k=uSo2FnXz50i5UZ1LYZS1sPsVWW9A34v-&jump_from=webapi) <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=uSo2FnXz50i5UZ1LYZS1sPsVWW9A34v-&jump_from=webapi"><img src="https://img.shields.io/badge/qq%E8%AE%A8%E8%AE%BA%E7%BE%A4-876280300-green"/></a>
|
||
|
||
|
||
- [tank-game-server](https://github.com/zfoo-project/tank-game-server) 网络游戏《进击的坦克(The Fight of Tanks)》,新手友好,难度2星
|
||
- 快速体验,tank游戏入口 [tank.zfoo.net](http://tank.zfoo.net)
|
||
- 快速体验,tank后台管理 [tank-admin.zfoo.net](http://tank-admin.zfoo.net)
|
||
|
||
- [zapp](https://github.com/zfoo-project/zapp) 图片分享聊天网站,标准的https企业级网站,难度5星
|
||
|
||
Ⅳ. 安装和使用⭐
|
||
------------
|
||
|
||
#### 1. 环境要求
|
||
|
||
**JDK 11+**,可以在 **OpenJDK** 和 **Oracle JDK** 无缝切换
|
||
|
||
```
|
||
如果你没有安装JDK 11+,快速的安装方法是在Idea的右上角Project Structure,Platform Settings,SDKs中直接下载
|
||
```
|
||
|
||
#### 2. [protocol](protocol/README.md) 目前性能最好的Java序列化和反序列化库
|
||
|
||
```
|
||
// zfoo协议注册,只能初始化一次
|
||
ProtocolManager.initProtocol(Set.of(ComplexObject.class, ObjectA.class, ObjectB.class));
|
||
|
||
// 序列化
|
||
ProtocolManager.write(byteBuf, complexObject);
|
||
|
||
// 反序列化
|
||
var packet = ProtocolManager.read(byteBuf);
|
||
```
|
||
|
||
#### 3. [net](net/README.md) 目前速度最快的RPC框架,支持 tcp udp websocket http
|
||
|
||
```
|
||
// 服务提供者,只需要在方法上加个注解,则自动注册接口
|
||
@PacketReceiver
|
||
public void atUserInfoAsk(Session session, UserInfoAsk ask) {
|
||
}
|
||
|
||
// 消费者,同步请求远程用户信息,会阻塞当前的线程,慎重考虑使用同步请求
|
||
var userInfoAsk = UserInfoAsk.valueOf(userId);
|
||
var answer = NetContext.getCosumer().syncAsk(userInfoAsk, UserInfoAnswer.class, userId).packet();
|
||
|
||
// 消费者,异步请求远程用户信息,不会柱塞当前的线程,异步请求成功过后依然会在userId指定的线程执行逻辑
|
||
NetContext.getCosumer()
|
||
.asyncAsk(userInfoAsk, UserInfoAnswer.class, userId)
|
||
.whenComplete(sm -> {
|
||
// do something
|
||
);
|
||
```
|
||
|
||
#### 4. [hotswap](hotswap/src/test/java/com/zfoo/hotswap/ApplicationTest.java) 热更新代码,不需要停止服务器,不需要额外的任何配置,一行代码开启热更新
|
||
|
||
```
|
||
// 传入需要更新的class文件
|
||
HotSwapUtils.hotswapClass(bytes);
|
||
```
|
||
|
||
#### 5. [orm](orm/README.md) 基于mongodb的自动映射框架,使用 [caffeine](https://github.com/ben-manes/caffeine) 设计了二级缓存,充分释放数据库压力
|
||
|
||
```
|
||
// 无需自己写sql和任何配置,直接通过注解定义在数据库中定义一张表
|
||
@EntityCache(cacheStrategy = "tenThousand", persister = @Persister("time30s"))
|
||
public class UserEntity implements IEntity<Long> {
|
||
@Id
|
||
private long id;
|
||
private String name;
|
||
}
|
||
|
||
// 更新数据库的数据
|
||
entityCaches.update(userEntity);
|
||
```
|
||
|
||
#### 6. [event](event/src/test/java/com/zfoo/event/ApplicationTest.java) 事件总线解耦不同模块,提高代码的质量,核心思想是观察者设计模式
|
||
|
||
```
|
||
// 接收一个事件,只需要在需要接收事件的方法上加一个注解就会自动监听这个事件
|
||
@EventReceiver
|
||
public void onMyNoticeEvent(MyNoticeEvent event) {
|
||
// do something
|
||
}
|
||
|
||
// 抛出一个事件
|
||
EventBus.syncSubmit(MyNoticeEvent.valueOf("同步事件"));
|
||
EventBus.asyncSubmit(MyNoticeEvent.valueOf("异步事件"));
|
||
```
|
||
|
||
#### 7. [scheduler](scheduler/README.md) 基于cron表达式的定时任务调度框架
|
||
|
||
````
|
||
@Scheduler(cron = "0/1 * * * * ?")
|
||
public void cronSchedulerPerSecond() {
|
||
// do something
|
||
}
|
||
````
|
||
|
||
#### 8. [storage](storage/src/test/java/com/zfoo/storage/ApplicationTest.java) Excel和Java类自动映射框架,只需要定义一个和Excel对应的类,直接解析Excel
|
||
|
||
```
|
||
@Resource
|
||
public class StudentResource {
|
||
@Id
|
||
private int id;
|
||
@Index
|
||
private String name;
|
||
private int age;
|
||
}
|
||
```
|
||
|
||
Ⅴ. 提交规范👏
|
||
----------
|
||
|
||
- 欢迎喜欢这个项目的人来一起维护这个项目,提交代码的时候注意下面规范
|
||
- Java项目格式化代码的方式采用IntelliJ Idea默认的格式化
|
||
- 代码提交的说明(commit message)按照下面给出的些常用格式
|
||
|
||
```
|
||
feat[module]: 新增某一项功能
|
||
perf[module]: 优化了模块代码或者优化了什么功能
|
||
fix[module]: 修改了什么bug
|
||
test[module]: 测试了什么东西
|
||
del[module]: 删除了某些功能或者无用代码
|
||
ref[module]: 重命名或者重构了模块
|
||
doc[module]: 增加了什么文档
|
||
```
|
||
|
||
Ⅵ. License
|
||
-----------
|
||
|
||
zfoo使用 [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||
|
||
```
|
||
Copyright (C) 2020 The zfoo Authors
|
||
|
||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||
in compliance with the License. You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
|
||
on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
See the License for the specific language governing permissions and limitations under the License.
|
||
```
|