* 基于zk做地址发现
* 基于redis的get、ping、info协议构建协议通讯
* 使用json序列化协议满足良好跨语言兼容性
* 使用当前众多语言的redisclient即可以完成客户端开发。
可以使用redis-cli -h -p get/ping/info 命令访问服务或发起服务调用
Get
exp:
get {"action":"/service/bibi/go-moa","params":{"m":"setName","args":["a"]}}
action:理解为服务名称(service-uri)
m:需要调用该服务的方法名称(已经做了go和java关于方法名首字母大写兼容)
args:m方法的调用参数序列。
PING
同 Redis的PING返回PONG
INFO
同 Redis的INFO,返回MOA和网络状态(json数据moa与network节点)。
exp:
{"moa":{"recv":0,"proc":0,"error":0},"network":{"read_count":1,"read_bytes":9,"write_count":0,"write_bytes":0,"dispatcher_go":1,"connections":1}}
安装ZooKeeper $Zookeeper/bin/zkServer.sh start
```
go get github.com/blackbeans/go-moa/core
go get github.com/blackbeans/go-moa/proxy
```
例如接口为:
//接口
type DemoResult struct {
Hosts []string `json:"hosts"`
Uri string `json:"uri"`
}
type IGoMoaDemo interface {
GetDemoName(serviceUri, proto string) (DemoResult, error)
}
//服务实现
type GoMoaDemo struct {
}
func (self GoMoaDemo) GetDemoName(serviceUri, proto string) ( DemoResult, error) {
return DemoResult{[]string{"fuck gfw"}, serviceUri}, nil
}
```
约定: 为了给客户端友好的返回错误信息,go-moa的服务接口最后一个返回必须为error类型。并且为了满足Java单一返回结果所以返回参数最多2个。
服务端启动启动:
```goalng
func main(){
app := core.NewApplcation("./conf/cluster_test.toml",
func() []proxy.Service {
return []proxy.Service{
proxy.Service{
ServiceUri: "/service/bibi/go-moa",
Instance: GoMoaDemo{},
Interface: (*IGoMoaDemo)(nil)}}
})
//设置启动项
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Kill)
//kill掉的server
<-ch
app.DestoryApplication()
}
说明
Service为一个服务单元,对应了本服务对外的服务名称、以及对应的接口
Applcation需要对应的Moa的配置文件,toml类型,具体配置参见./conf/cluster_test. toml
发布服务成功可以使用客户端进行测试,具体[客户端的使用请参考](http://github. com/blackbeans/go-moa-client/blob/master/README.md)
env:Macbook Pro 2.2 GHz Intel Core i7
redis-benchmark result : 53527.46 requests per second
go test --bench=".*" github.com/blackbeans/go-moa/core -run=BenchmarkApplication
BenchmarkApplication-8 20000 64517 ns/op
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型