-
Notifications
You must be signed in to change notification settings - Fork 112
zh_quickstart
-
快速入门
- 使用Motan-go
- Server使用示例
- Client调用示例
-
集群调用示例
- 使用ZooKeeper作为注册中心
- 使用直连注册中心
- 使用Consul作为注册中心(待开发)
- Agent调用示例
- 主要配置项说明
安装motan-go
go get -u -v github.com/weibocom/motan-go
motan-go依赖了一些开源项目,需要通过glide进行安装,或者直接使用go get进行安装。
*如因特殊原因部分项目无法直接安装,可以从github下载对应源码并修改为依赖的目录即可,如下:
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net/ \
&& git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc/ \
&& git clone https://github.com/google/go-genproto $GOPATH/src/google.golang.org/genproto/ \
&& git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text/
- server通过yaml文件配置需要导出的服务,下面的例子创建一个serverdemo.yaml文件 来指定导出服务的配置。
#config of registries
motan-registry: #motan-registry 区用来配置不同的注册中心,多个注册中心以id进行区分
direct-registry: # 注册中心id,service引用时需与此id相同
protocol: direct # 注册中心协议,也即注册中心类型。此处为便于测试使用直连注册中心,实际注册时不发生注册行为。
#conf of services
motan-service:
mytest-motan2:
path: com.weibo.motan.demo.service.MotanDemoService # 服务名称
group: motan-demo-rpc #服务所属group
protocol: motan2
registry: direct-registry
serialization: simple #目前golang版本仅支持simple序列化方式,其他序列化方式会逐步提供
ref : "main.MotanDemoService" #golang中对service的具体实现类引用。此处为`包名.类名`方式引用,也可以使用自定义的id,需要与注册服务实现类时的id参数一致
export: "motan2:8100" #对外提供服务的端口。不同service可以使用相同export端口,前提条件为协议与序列化等配置必须相同。
- 实现一个service并对外导出服务.
package main
import (
"fmt"
"time"
motan "github.com/weibocom/motan-go"
)
func main() {
runServerDemo()
}
func runServerDemo() {
mscontext := motan.GetMotanServerContext("serverdemo.yaml") //通过配置文件获取配置信息。所有的导出服务推荐只使用一个配置文件进行配置。
mscontext.RegisterService(&MotanDemoService{}, "") // 注册具体service实现类,可以在注册时指定别名,配置中可以通过别名进行引用。如果不使用别名,则通过`包名.类名`进行引用。
mscontext.Start(nil) // 注册完所有服务实现类后,通过start启动所有服务,完成服务注册
time.Sleep(time.Second * 50000000)
}
// service 具体实现类
type MotanDemoService struct{}
func (m *MotanDemoService) Hello(name string) string {
fmt.Printf("MotanDemoService hello:%s\n", name)
return "hello " + name
}
server端的配置名称与java版本motan基本一致,参数的含义也相同。
一般server端的配置可以包括motan-server、motan-registry、motan-basicService、motan-service几个部分,其中motan-server用来配置一些全局属性,例如log目录等;motan-registry用来配置不同注册中心;motan-basicservice用来配置一组服务的公共配置项;motan-service用来配置某一个具体service的配置
以上的示例为可以运行的最简单示例,完整配置示例请参见main/serverdemo.yaml文件。
client也同样通过yaml文件配置需要订阅的服务。下面创建一个clientdemo.yaml文件来配置需要调用的服务
#config of registries
motan-registry:
direct-registry: # registry id
protocol: direct # registry type.
host: 127.0.0.1
port: 9981
#conf of refers
motan-refer:
mytest-motan2:
path: com.weibo.motan.demo.service.MotanDemoService # e.g. service name for subscribe
group: motan-demo-rpc # group name
protocol: motan2 # rpc protocol
registry: direct-registry
requestTimeout: 1000
serialization: simple
haStrategy: failover
loadbalance: roundrobin
同server端配置相似,client端的配置文件也支持几个部分,分别是:motan-client、motan-registry、motan-basicRefer、motan-refer。其中motan-registry部分与server端一致;motan-client部分用来配置client的一些全局配置;motan-basicRefer用来配置一组refer的公共配置;motan-refer用来配置具体的一个需要订阅的服务。
client 支持同步调用与异步调用,同步调用方式如下:
package main
import (
"fmt"
motan "github.com/weibocom/motan-go"
motancore "github.com/weibocom/motan-go/core"
)
func main() {
runClientDemo()
}
func runClientDemo() {
mccontext := motan.GetClientContext("clientdemo.yaml")
mccontext.Start(nil)
mclient := mccontext.GetClient("mytest-motan2")
var reply string
err := mclient.Call("hello", "Ray", &reply) // sync call
if err != nil {
fmt.Printf("motan call fail! err:%v\n", err)
} else {
fmt.Printf("motan call success! reply:%s\n", reply)
}
}
client异步调用的方式如下:
func runClientDemo() {
mccontext := motan.GetClientContext("clientdemo.yaml")
mccontext.Start(nil)
mclient := mccontext.GetClient("mytest-motan2")
var reply string
// async call
result := mclient.Go("hello", "Ray", &reply, make(chan *motancore.AsyncResult, 1))
res := <-result.Done
if res.Error != nil {
fmt.Printf("motan async call fail! err:%v\n", res.Error)
} else {
fmt.Printf("motan async call success! reply:%+v\n", reply)
}
}
client端的完整调用示例参见main/clientdemo.go以及clientdemo.yaml
motan-go可以支持注册中心扩展,目前支持zookeeper以及direct直连注册中心两种,后续会提供consul等其他注册中心的支持。
使用zookeeper作为注册中心的配置样例如下:
motan-registry:
zk-registry: # 注册中心id,供service或refer引用
protocol: zookeeper # 使用zk作为注册中心时必须指定为`zookeeper`
host: 10.210.235.157 # zk的server ip。
port: 2181 # zk server的ip
# address: "10.210.235.157:2181,10.210.235.158:2181,10.210.235.159:2181" # 使用zk server集群方式。
registrySessionTimeout: 10000 # zk session超时时间
配置项中host、port参数与address参数为二选一方式,如果配置了host 则会忽略address参数。如果需要使用集群ip方式则只需配置address,不能配置host与port参数
直连注册中心用于client端直接访问指定的server ip。server端配置直连注册中心不会有注册行为,也不会产生其他副作用。
使用直连注册中心配置样例如下:
motan-registry:
zk-registry: # 注册中心id,供service或refer引用
protocol: direct # 使用直连注册中心时必须指定为`direct`
host: 10.210.235.157 # 直连的server ip。
port: 8003 # 直连的server端口
# address: "10.210.235.157:8003,10.210.235.158:8003,10.210.235.159:8004" # 直连一组server。
使用直连注册中心时,address参数与host、port参数含义一致,这两组参数只能二选一,同时配置时host优先级高。
暂未提供,后续版本将会支持。
agent 提供双向的代理,即可以为php等其他语言提供与java、golangserver的交互能力,也可以支持将php导出为motan服务。
由于agent支持双向代理,因此agent配置中即可以包括client端的配置也可以包括server端的配置,总的说来,agent的配置包括下面几个部分:motan-agent、motan-registry、motan-basicRefer、motan-refer、motan-basicService、motan-service,其中motan-agent部分主要用来配置agent的全局属性,包括提供正向代理的端口以及导出服务的端口、日志目录、业务方配置等信息。详细配置参见主要配置项说明部分。
使用agent调用服务时,一般agent在调用端本地部署,在agent配置文件中配置好需要使用的服务后启动agent。不同语言的客户端通过agent代理端口调用服务,而不需要关注服务节点订阅、ha与lb策略等细节,通过在agent部署统一的服务治理扩展,可以为不同语言提供相同的服务治理能力。
不同语言的client只需要提供基本的motan2协议解析能力,即可以通过agent完成服务调用。由于标准agent功能不对请求参数本身做解析与修改,因此不同语言通信时需要支持对应的序列化编码与解码能力。
目前支持的不同语言client包括motan-php、motan-openresty, 后续还将支持更多语言的client端以及 server端。
agent订阅服务配置样例如下:
#config fo agent
motan-agent:
port: 9981 # agent提供正向代理的端口.不同语言client通过此端口发出调用请求
mport: 8002 # agent 管理端口,用来查看agent自身运行状况以及通过此端口完成对agent的动态管理。
unixSock: /tmp/mesh.sock # agent 通过 Unix socket 提供正向代理的 socket 句柄配置,添加此配置将覆盖前面的 port 配置
managementUnixSock: /tmp/m-mesh.sock # agent 管理端口,同上,覆盖 mport 配置
httpProxyUnixSock: /tmp/h-mesh.sock # mesh 提供反向代理 HTTP 服务的socket 句柄配置,此配置将覆盖 hport 配置
log_dir: "./agentlogs" # agent日志保存目录
registry: "zk-registry" # agent注册 自身信息时使用的注册中心,需要与motan-registry部分配置的注册中心id一致
application: "ray-test" # agent业务方标识。一般以业务线为维度,motan的指令系统下发的流控与降级等指令会按application维度下发并执行。
#config of registries
motan-registry: # motan-registry部分与client、server端的含义一致
direct-registry: # registry id ,
protocol: direct
host: 127.0.0.1
port: 8100
#conf of basic refers
motan-basicRefer:
mybasicRefer: # basic refer id
group: motan-demo-rpc # group name
protocol: motan2 # rpc的调用协议
registry: "direct-registry" # registry id
requestTimeout: 1000
haStrategy: failover
loadbalance: roundrobin
serialization: simple
filter: "accessLog, myfilter" # 调用中的filter配置,多个filter以逗号分隔,对应的filter名必须已经在启动时注册到ext扩展工厂中。
retries: 0
#conf of refers
motan-refer:
mytest-motan2:
path: com.weibo.motan2.test.Motan2TestService # 订阅的service名
registry: direct-registry
serialization: simple #使用的序列化协议
basicRefer: mybasicRefer # basic refer id
2.启动agent服务。
agent的启动十分简单,如下:
package main
import (
"fmt"
motan "github.com/weibocom/motan-go"
motancore "github.com/weibocom/motan-go/core"
)
func main() {
runAgentDemo()
}
func runAgentDemo() {
agent := motan.NewAgent(nil) // agent 启动时可以指定自定义的扩展工厂,如果不指定则使用默认扩展工厂。默认扩展工厂包括了自带的不同类型的各种扩展实现。
agent.ConfigFile = "./agentdemo.yaml" // 指定agent配置文件不是必须操作,仅为方便demo运行。默认情况下agent支持启动参数 -c来指定配置文件。
agent.StartMotanAgent() // 启动agent
}
详细agent样例见main/agentdemo.go以及agentdemo.yaml.
agent 提供服务的使用场景是为解释型语言(例如php)提供常驻server服务。agent 可以支持不同类型的provide扩展,来与真正提供服务的后端server进行交互,目前支持php的cgi方式调用,下一版本将支持http 方式调用后端server。
agent导出服务的配置如下:
motan-basicService: # 同server端配置
mybasicService: # basic refer id
group: motan-demo-rpc # group name
protocol: motan2 # rpc protocol
filter: "accessLog" # 配置filter、
registry: direct-registry
serialization: simple
nodeType: server # 节点类型。
#conf of services
motan-service:
mytest-motan2:
path: com.weibo.motan2.test.Motan2TestService # e.g. service name for subscribe
basicRefer: mybasicService
provider: cgi # 后端代理的server的类型。 cgi方式适用于php后端server调用
CGI_HOST: 10.211.55.3
CGI_PORT: 9000
CGI_REQUEST_METHOD: GET
CGI_SCRIPT_FILENAME: /media/psf/g/idevz/code/www/motan-php-test/cgi.php # 对应php文件位置
CGI_DOCUMENT_ROOT: /media/psf/g/idevz/code/www/motan-php-test # 文档根目录
export: "motan2:8100"
下面按配置文件不同区块进行主要配置项说明,详细配置说明可以参考motan配置说明
- port: agent提供服务的端口号
- mport: 接收管理命令的端口
- log_dir: 日志文件保存目录
- registry: 注册agent自身信息时使用的注册中心。需要与motan-registry部分配置的某个registry的id一致
- application: agent业务方标识。一般以业务线为维度命名,agent指令会按application维度下发。
- protocol: 注册中心协议类型,如zookeeper、consul等
- host: 注册中心ip。此项仅支持设置单ip
- port: 与host参数一同使用,用来指定单ip注册中心的ip与端口
- address: 注册中心ip地址组,支持多个ip与端口配置,各ip之间用
,
(逗号)分隔。格式为:ip1:port1,ip2:port2
此参数与host参数为二选一模式,如果配置了host,则address参数不会生效。 - registrySessionTimeout: 与注册中心的会话超时时间。具体作用方式与注册中心类型有关。
参数定义与含义与java版本完全一致,请参考client配置列表
相比java版本,由于增加对不同后端服务的代理能力,因此新增加了部分参数配置,如下:
- provider: 不同server的具体实现方式。例如通过cgi、http方式代理后端服务。不同代理方式可能会引入额外的配置项,例如cgi方式需要配置CGI_PORT等参数。如果是直接提供server服务则不需配置此项。
其他参数含义与java版server配置列表一致