mirror of
https://github.com/duanhf2012/origin.git
synced 2026-03-17 06:57:31 +08:00
新增v2版本说明
This commit is contained in:
230
README.md
230
README.md
@@ -1,5 +1,5 @@
|
|||||||
origin 游戏服务器引擎简介
|
origin 游戏服务器引擎简介
|
||||||
=========================
|
-------------------------
|
||||||
|
|
||||||
origin 是一个由 Go 语言(golang)编写的分布式开源游戏服务器引擎。origin适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。
|
origin 是一个由 Go 语言(golang)编写的分布式开源游戏服务器引擎。origin适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。
|
||||||
|
|
||||||
@@ -19,6 +19,10 @@ Hello world!
|
|||||||
```go
|
```go
|
||||||
go get -v -u github.com/duanhf2012/origin/v2
|
go get -v -u github.com/duanhf2012/origin/v2
|
||||||
```
|
```
|
||||||
|
建议使用origin v2版本(import引用中都加入v2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[README.md](README.md)
|
[README.md](README.md)
|
||||||
于是下载到GOPATH环境目录中,在src中加入main.go,内容如下:
|
于是下载到GOPATH环境目录中,在src中加入main.go,内容如下:
|
||||||
|
|
||||||
@@ -26,7 +30,7 @@ go get -v -u github.com/duanhf2012/origin/v2
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/duanhf2012/origin/node"
|
"github.com/duanhf2012/origin/v2/node"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -53,29 +57,140 @@ origin引擎三大对象关系
|
|||||||
|
|
||||||
origin集群核心配置文件在config的cluster目录下,如github.com/duanhf2012/originserver的config/cluster目录下有cluster.json与service.json配置:
|
origin集群核心配置文件在config的cluster目录下,如github.com/duanhf2012/originserver的config/cluster目录下有cluster.json与service.json配置:
|
||||||
|
|
||||||
cluster.json如下:
|
## origin配置说明
|
||||||
------------------
|
|
||||||
|
origin的配置文件以json格式,主要包含Discovery、RpcMode、NodeList、Service部分,具体格式如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Discovery":{},
|
||||||
|
"RpcMode":{},
|
||||||
|
"NodeList":[],
|
||||||
|
"Service":{},
|
||||||
|
"Global": {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Discovery部分
|
||||||
|
|
||||||
|
origin目前支持etcd与origin自带的服务发现类型。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Etcd方式示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"Discovery": {
|
||||||
|
"Etcd": {
|
||||||
|
"TTLSecond": 10,
|
||||||
|
"DialTimeoutMillisecond": 3000,
|
||||||
|
"EtcdList": [
|
||||||
|
{
|
||||||
|
"NetworkName": ["network1"],
|
||||||
|
"Endpoints": ["http://192.168.13.24:12379"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
TTLSecond:表示健康检查TTL失效时间10秒
|
||||||
|
|
||||||
|
DialTimeoutMillisecond: 与etcd连接超时时间
|
||||||
|
|
||||||
|
EtcdList:Etcd列表,可以多个Etcd服务器连接
|
||||||
|
|
||||||
|
NetworkName:所在的网络名称,可以配置多个。node会往对应的网络名称中注册、监听发现Service。NetworkName也起到发现隔离的作用。
|
||||||
|
|
||||||
|
Endpoints:Etcd服务器地址
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Origin方式示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Discovery": {
|
||||||
|
"Origin":{
|
||||||
|
"TTLSecond": 10,
|
||||||
|
"MasterNodeList": [
|
||||||
|
{
|
||||||
|
"NodeId": "test_1",
|
||||||
|
"ListenAddr": "127.0.0.1:8801"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
TTLSecond:表示健康检查TTL失效时间10秒
|
||||||
|
|
||||||
|
MasterNodeList:指定哪些Node为服务发现Master结点,需要配置NodeId与ListenAddr,注意它们要与实际的Node配置一致。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### RpcMode部分
|
||||||
|
|
||||||
|
默认模式
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"RpcMode":{
|
||||||
|
"Type": "Default"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
默认模式下,origin的node之前通过tcp连接组网。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Nats模式
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"RpcMode":{
|
||||||
|
"Type": "Nats",
|
||||||
|
"remark": "support Default or Nats",
|
||||||
|
"Nats": {
|
||||||
|
"NatsUrl":"127.0.0.1:4222",
|
||||||
|
"NoRandomize": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
NatsUrl:Nats连接url串
|
||||||
|
|
||||||
|
NoRandomize:在多连接集群模式下,连接nats节点是否顺序策略。false表示随机连接,true表示顺序连接。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### NodeList部分
|
||||||
|
|
||||||
```
|
```
|
||||||
{
|
{
|
||||||
"NodeList":[
|
"NodeList":[
|
||||||
{
|
{
|
||||||
"NodeId": 1,
|
"NodeId": "node_1",
|
||||||
"Private": false,
|
"Private": false,
|
||||||
"ListenAddr":"127.0.0.1:8001",
|
"ListenAddr":"127.0.0.1:8001",
|
||||||
"MaxRpcParamLen": 409600,
|
"MaxRpcParamLen": 409600,
|
||||||
"CompressBytesLen": 20480,
|
"CompressBytesLen": 20480,
|
||||||
"NodeName": "Node_Test1",
|
|
||||||
"remark":"//以_打头的,表示只在本机进程,不对整个子网公开",
|
"remark":"//以_打头的,表示只在本机进程,不对整个子网公开",
|
||||||
"ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","_TcpService","HttpService","WSService"]
|
"ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","_TcpService","HttpService","WSService"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"NodeId": 2,
|
"NodeId": "node_2",
|
||||||
"Private": false,
|
"Private": false,
|
||||||
"ListenAddr":"127.0.0.1:8002",
|
"ListenAddr":"127.0.0.1:8002",
|
||||||
"MaxRpcParamLen": 409600,
|
"MaxRpcParamLen": 409600,
|
||||||
"CompressBytesLen": 20480,
|
"CompressBytesLen": 20480,
|
||||||
"NodeName": "Node_Test1",
|
|
||||||
"remark":"//以_打头的,表示只在本机进程,不对整个子网公开",
|
"remark":"//以_打头的,表示只在本机进程,不对整个子网公开",
|
||||||
"ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","TcpService","HttpService","WSService"]
|
"ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","TcpService","HttpService","WSService"]
|
||||||
}
|
}
|
||||||
@@ -86,27 +201,27 @@ cluster.json如下:
|
|||||||
|
|
||||||
以上配置了两个结点服务器程序:
|
以上配置了两个结点服务器程序:
|
||||||
|
|
||||||
* NodeId: 表示origin程序的结点Id标识,不允许重复。
|
* NodeId: 表示origin程序的结点Id标识,同一个服务发现网络中不允许重复。
|
||||||
* Private: 是否私有结点,如果为true,表示其他结点不会发现它,但可以自我运行。
|
* Private: 是否私有结点,如果为true,表示其他结点不会发现它,但可以自我运行。
|
||||||
* ListenAddr:Rpc通信服务的监听地址
|
* ListenAddr:Rpc通信服务的监听地址
|
||||||
* MaxRpcParamLen:Rpc参数数据包最大长度,该参数可以缺省,默认一次Rpc调用支持最大4294967295byte长度数据。
|
* MaxRpcParamLen:Rpc参数数据包最大长度,该参数可以缺省,默认一次Rpc调用支持最大4294967295byte长度数据。
|
||||||
* CompressBytesLen:Rpc网络数据压缩,当数据>=20480byte时将被压缩。该参数可以缺省或者填0时不进行压缩。
|
* CompressBytesLen:Rpc网络数据压缩,当数据>=20480byte时将被压缩。该参数可以缺省或者填0时不进行压缩。
|
||||||
* NodeName:结点名称
|
|
||||||
* remark:备注,可选项
|
* remark:备注,可选项
|
||||||
* ServiceList:该Node拥有的服务列表,注意:origin按配置的顺序进行安装初始化。但停止服务的顺序是相反。
|
* ServiceList:该Node拥有的服务列表,注意:origin按配置的顺序进行安装初始化。但停止服务的顺序是相反。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
在启动程序命令originserver -start nodeid=1中nodeid就是根据该配置装载服务。
|
在启动程序命令originserver -start nodeid="node_1"中nodeid就是根据该配置装载服务。
|
||||||
更多参数使用,请使用originserver -help查看。
|
更多参数使用,请使用originserver -help查看。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Service 部分
|
||||||
|
|
||||||
service.json如下:
|
service.json如下:
|
||||||
------------------
|
|
||||||
|
|
||||||
```
|
```
|
||||||
{
|
{
|
||||||
"Global": {
|
|
||||||
"AreaId": 1
|
|
||||||
},
|
|
||||||
"Service":{
|
"Service":{
|
||||||
"HttpService":{
|
"HttpService":{
|
||||||
"ListenAddr":"0.0.0.0:9402",
|
"ListenAddr":"0.0.0.0:9402",
|
||||||
@@ -206,6 +321,32 @@ service.json如下:
|
|||||||
* PendingWriteNum:发送网络队列最大数量
|
* PendingWriteNum:发送网络队列最大数量
|
||||||
* MaxMsgLen:包最大长度
|
* MaxMsgLen:包最大长度
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Global部分
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Global": {
|
||||||
|
"AreaId": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
这部分,在所有的服务中都可以类似以下代码获取:
|
||||||
|
|
||||||
|
```go
|
||||||
|
globalCfg := cluster.GetCluster().GetGlobalCfg()
|
||||||
|
mapGlobal, ok := globalCfg.(map[string]interface{})
|
||||||
|
if ok == false {
|
||||||
|
return fmt.Errorf("Canot find Global from config.")
|
||||||
|
}
|
||||||
|
|
||||||
|
areaId, ok := mapGlobal["AreaId"]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
第一章:origin基础:
|
第一章:origin基础:
|
||||||
@@ -219,8 +360,8 @@ simple_service/TestService1.go如下:
|
|||||||
package simple_service
|
package simple_service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/duanhf2012/origin/node"
|
"github.com/duanhf2012/origin/v2/node"
|
||||||
"github.com/duanhf2012/origin/service"
|
"github.com/duanhf2012/origin/v2/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
//模块加载时自动安装TestService1服务
|
//模块加载时自动安装TestService1服务
|
||||||
@@ -230,7 +371,6 @@ func init(){
|
|||||||
|
|
||||||
//新建自定义服务TestService1
|
//新建自定义服务TestService1
|
||||||
type TestService1 struct {
|
type TestService1 struct {
|
||||||
|
|
||||||
//所有的自定义服务必需加入service.Service基服务
|
//所有的自定义服务必需加入service.Service基服务
|
||||||
//那么该自定义服务将有各种功能特性
|
//那么该自定义服务将有各种功能特性
|
||||||
//例如: Rpc,事件驱动,定时器等
|
//例如: Rpc,事件驱动,定时器等
|
||||||
@@ -249,8 +389,8 @@ simple_service/TestService2.go如下:
|
|||||||
|
|
||||||
```
|
```
|
||||||
import (
|
import (
|
||||||
"github.com/duanhf2012/origin/node"
|
"github.com/duanhf2012/origin/v2/node"
|
||||||
"github.com/duanhf2012/origin/service"
|
"github.com/duanhf2012/origin/v2/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init(){
|
func init(){
|
||||||
@@ -274,7 +414,7 @@ func (slf *TestService2) OnInit() error {
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/duanhf2012/origin/node"
|
"github.com/duanhf2012/origin/v2/node"
|
||||||
//导入simple_service模块
|
//导入simple_service模块
|
||||||
_"orginserver/simple_service"
|
_"orginserver/simple_service"
|
||||||
)
|
)
|
||||||
@@ -291,10 +431,9 @@ func main(){
|
|||||||
{
|
{
|
||||||
"NodeList":[
|
"NodeList":[
|
||||||
{
|
{
|
||||||
"NodeId": 1,
|
"NodeId": "nodeid_1",
|
||||||
"Private": false,
|
"Private": false,
|
||||||
"ListenAddr":"127.0.0.1:8001",
|
"ListenAddr":"127.0.0.1:8001",
|
||||||
"NodeName": "Node_Test1",
|
|
||||||
"remark":"//以_打头的,表示只在本机进程,不对整个子网开发",
|
"remark":"//以_打头的,表示只在本机进程,不对整个子网开发",
|
||||||
"ServiceList": ["TestService1","TestService2"]
|
"ServiceList": ["TestService1","TestService2"]
|
||||||
}
|
}
|
||||||
@@ -305,7 +444,7 @@ func main(){
|
|||||||
编译后运行结果如下:
|
编译后运行结果如下:
|
||||||
|
|
||||||
```
|
```
|
||||||
#originserver -start nodeid=1
|
#originserver -start nodeid="nodeid_1"
|
||||||
TestService1 OnInit.
|
TestService1 OnInit.
|
||||||
TestService2 OnInit.
|
TestService2 OnInit.
|
||||||
```
|
```
|
||||||
@@ -720,7 +859,7 @@ func (slf *TestService7) CallTest(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//自定义超时,默认rpc超时时间为15s
|
//自定义超时,默认rpc超时时间为15s,以下设置1秒钟超过
|
||||||
err = slf.CallWithTimeout(time.Second*1, "TestService6.RPC_Sum", &input, &output)
|
err = slf.CallWithTimeout(time.Second*1, "TestService6.RPC_Sum", &input, &output)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Call error :%+v\n", err)
|
fmt.Printf("Call error :%+v\n", err)
|
||||||
@@ -848,45 +987,35 @@ func (slf *TestService13) testAsyncDo() {
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
第七章:配置服务发现
|
第七章:服务发现
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
origin引擎默认使用读取所有结点配置的进行确认结点有哪些Service。引擎也支持动态服务发现的方式,使用了内置的DiscoveryMaster服务用于中心Service,DiscoveryClient用于向DiscoveryMaster获取整个origin网络中所有的结点以及服务信息。具体实现细节请查看这两部分的服务实现。具体使用方式,在以下cluster配置中加入以下内容:
|
origin引擎默认使用读取所有结点配置的进行确认结点有哪些Service。引擎也支持动态服务发现的方式,支持etcd与origin类型,具体请参照【配置说明】部分,Node结点可以配置只发现某些服务,如下示例:
|
||||||
|
|
||||||
```
|
```
|
||||||
{
|
{
|
||||||
"MasterDiscoveryNode": [{
|
|
||||||
"NodeId": 2,
|
|
||||||
"ListenAddr": "127.0.0.1:10001",
|
|
||||||
"MaxRpcParamLen": 409600
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"NodeId": 1,
|
|
||||||
"ListenAddr": "127.0.0.1:8801",
|
|
||||||
"MaxRpcParamLen": 409600
|
|
||||||
}],
|
|
||||||
|
|
||||||
|
|
||||||
"NodeList": [{
|
"NodeList": [{
|
||||||
"NodeId": 1,
|
"NodeId": "nodeid_test",
|
||||||
"ListenAddr": "127.0.0.1:8801",
|
"ListenAddr": "127.0.0.1:8801",
|
||||||
"MaxRpcParamLen": 409600,
|
"MaxRpcParamLen": 409600,
|
||||||
"NodeName": "Node_Test1",
|
|
||||||
"Private": false,
|
"Private": false,
|
||||||
"remark": "//以_打头的,表示只在本机进程,不对整个子网开发",
|
"remark": "//以_打头的,表示只在本机进程,不对整个子网开发",
|
||||||
"ServiceList": ["_TestService1", "TestService9", "TestService10"],
|
"ServiceList": ["_TestService1", "TestService9", "TestService10"],
|
||||||
"MasterDiscoveryService": [
|
"DiscoveryService": [
|
||||||
{
|
{
|
||||||
"MasterNodeId": 2,
|
"MasterNodeId": "nodeid_1",
|
||||||
|
"NetworkName":"networkname1"
|
||||||
"DiscoveryService": ["TestService8"]
|
"DiscoveryService": ["TestService8"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
MasterDiscoveryNode: 配置了结点Id为1的服务发现Master,他的监听地址ListenAddr为127.0.0.1:8801,结点为2的也是一个服务发现Master。NodeId为1的结点会从结点为1和2的网络中发现服务。
|
DiscoveryService:在当前nodeid为nodeid_test的结点中,只发现 MasterNodeId为nodeid_1或NetworkName为networkname1网络中的TestService8服务。
|
||||||
|
|
||||||
|
**注意**:MasterNodeId与NetworkName只配置一个,分别在模式为origin或者etcd服务发现类型时。
|
||||||
|
|
||||||
|
|
||||||
MasterDiscoveryService: 表示将筛选origin网络中MasterNodeId为2中的TestService8服务,注意如果MasterDiscoveryService不配置,则筛选功能不生效。MasterNodeId也可以填为0,表示NodeId为1的结点,在所有网络中只发现TestService8的服务。
|
|
||||||
|
|
||||||
第八章:HttpService使用
|
第八章:HttpService使用
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -1019,16 +1148,16 @@ func (slf *TestTcpService) OnInit() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (slf *TestTcpService) OnConnected(clientid uint64){
|
func (slf *TestTcpService) OnConnected(clientid string){
|
||||||
fmt.Printf("client id %d connected\n",clientid)
|
fmt.Printf("client id %s connected\n",clientid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (slf *TestTcpService) OnDisconnected(clientid uint64){
|
func (slf *TestTcpService) OnDisconnected(clientid string){
|
||||||
fmt.Printf("client id %d disconnected\n",clientid)
|
fmt.Printf("client id %s disconnected\n",clientid)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *TestTcpService) OnRequest (clientid uint64,msg proto.Message){
|
func (slf *TestTcpService) OnRequest (clientid string,msg proto.Message){
|
||||||
//解析客户端发过来的数据
|
//解析客户端发过来的数据
|
||||||
pReq := msg.(*msgpb.Req)
|
pReq := msg.(*msgpb.Req)
|
||||||
//发送数据给客户端
|
//发送数据给客户端
|
||||||
@@ -1072,4 +1201,5 @@ _
|
|||||||
bp-li
|
bp-li
|
||||||
阿正
|
阿正
|
||||||
大头
|
大头
|
||||||
|
Now'C
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user