Skip to content

zh_quickstart

周晶 edited this page May 21, 2019 · 4 revisions

使用Motan-go

安装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使用示例

  1. 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端口,前提条件为协议与序列化等配置必须相同。
  1. 实现一个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调用示例

Client端配置

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作为注册中心

使用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优先级高。

使用Consul作为注册中心

暂未提供,后续版本将会支持。

Agent调用示例

agent 提供双向的代理,即可以为php等其他语言提供与java、golangserver的交互能力,也可以支持将php导出为motan服务。

Agent配置

由于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。不同语言的客户端通过agent代理端口调用服务,而不需要关注服务节点订阅、ha与lb策略等细节,通过在agent部署统一的服务治理扩展,可以为不同语言提供相同的服务治理能力。

不同语言的client只需要提供基本的motan2协议解析能力,即可以通过agent完成服务调用。由于标准agent功能不对请求参数本身做解析与修改,因此不同语言通信时需要支持对应的序列化编码与解码能力。

目前支持的不同语言client包括motan-phpmotan-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提供服务

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配置说明

motan-agent, motan-client, motan-server配置说明

  • port: agent提供服务的端口号
  • mport: 接收管理命令的端口
  • log_dir: 日志文件保存目录
  • registry: 注册agent自身信息时使用的注册中心。需要与motan-registry部分配置的某个registry的id一致
  • application: agent业务方标识。一般以业务线为维度命名,agent指令会按application维度下发。

motan-registry配置说明

  • protocol: 注册中心协议类型,如zookeeper、consul等
  • host: 注册中心ip。此项仅支持设置单ip
  • port: 与host参数一同使用,用来指定单ip注册中心的ip与端口
  • address: 注册中心ip地址组,支持多个ip与端口配置,各ip之间用,(逗号)分隔。格式为:ip1:port1,ip2:port2 此参数与host参数为二选一模式,如果配置了host,则address参数不会生效。
  • registrySessionTimeout: 与注册中心的会话超时时间。具体作用方式与注册中心类型有关。

motan-basicRefer、motan-refer配置说明

参数定义与含义与java版本完全一致,请参考client配置列表

motan-basicService、motan-service配置说明

相比java版本,由于增加对不同后端服务的代理能力,因此新增加了部分参数配置,如下:

  • provider: 不同server的具体实现方式。例如通过cgi、http方式代理后端服务。不同代理方式可能会引入额外的配置项,例如cgi方式需要配置CGI_PORT等参数。如果是直接提供server服务则不需配置此项。

其他参数含义与java版server配置列表一致