#### 为什么选择 Java 11 而不是 Java 8

- var可以减少非常多的代码，使代码更加简介
- Java 11的版本统一了api，Oracle JDK 和 Open JDK 可以无缝切换
- 11对容器支持友好，现在是容器的时代，反观 Java 8 的一些老版本都不支持容器
- Java 8过两年会停止维护，能早用就早用
- 主流的框架全部都已经支持Java 11
- 下个版本的spring boot直接最低版本要求Java 17

---

#### 为什么不选择基于interface（接口）的形式提供RPC，像dubbo那样的RPC

- 基于interface的不够灵活，不方便
- 然interface写同步rpc比较方便，不适合异步的写法。现在流行异步调用链的写法，基于interface有点过时了
- 并不是所有编程语言都有interface的，你用了interface的话其它编程语言就没法用了，就无法跨平台了
- 基于packet的容易扩展，可以轻易跨平台

---

#### zfoo的RPC实现原理

- zfoo的RPC和dubbo实现的原理一样，主要使用CompletableFuture，利用了唯一id

```
zfoo的RPC请求消息体会在IPacket的包后面附加上一个IAttachmet（SignalAttachment）作为同步和异步的信号。
SignalAttachment的signalId就是用于RPC的同步和异步的信号，通过这个唯一ID就可以确定哪个RPC请求对应了哪一个RPC回调。
```

---

#### protocol的实现原理

- 通过递归解析对象的结构，用字节码增强生成顺序的序列化和反序列化函数，可以自己线生成C#协议，就能看到Javassist生成的是什么样的结构

---

#### 为什么选择mongodb

- mongodb可以单机部署也可以分布式部署，是万能的数据库，而且速度足够快
- mongodb，副本集部署（主从模式），可以数据同步，读写分离
- mongodb，分片部署，故障转移（容灾）

---

#### 为什么部署的时候才用main，平时开发的时候从test启动

- 可以很好的隔离部署环境和开发测试环境
- 部署的时候从main启动，平时开发的时候从test启动
- 这样正式环境的配置放在main的resources里，测试环境的配置放在test的resources里，互不干扰
- 从test下启动的程序的配置文件会覆盖main中的配置文件

---

#### 前端h5的后台管理界面使用的技术栈

- 基础框架使用的，vue 2.6，https://cn.vuejs.org/
- UI框架使用的，vuetify 2.3，https://vuetifyjs.com
- 工具库使用的，lodash 4.17，https://www.lodashjs.com/
- icon使用的material font，mdi 5.3.45，https://pictogrammers.github.io/@mdi/font/5.3.45/

---

#### TODO：

1. 参看一下akka的actor实现，进一步优化net的线程模型，统一异步回调的argument参数

2. protocol需要支持更多的语言，python，go，C++

3. Router中的ThreadLocal主要就是让上层@PacketReceiver所表示的收包方法少传一个参数IAttachment，这块设计可以优化

```
提前把这个参数存起来，就不用传到上层去用了，便于优雅的调用，但是也带来了一些不必要的性能损耗
```
