10秒钟,让你的方法变为RPC服务

鸟窝 2018-02-28 11:09

GitHub stars

rpcx一个服务治理的Go RPC框架, 拥有非常多的特性,支持跨语言的服务调用。 众多的特性可以参考doc.rpcx.site。它的服务治理的特性深受阿里巴巴的Dubbo框架的启发。

在实际的产品应用中,用户使用两台服务器+8台日志搜集服务(Client),轻松处理每天几十亿的服务调用, 除了中间一个路由器硬件闪断, 整个系统平稳运行多半年。 相比较之前Java的实现, 服务器节省了一半。 用户使用rpcx框架重构后的系统每月为公司节省了几十万元的成本。

rpcx框架的一个设计哲学就是简单 。不希望用户需要花费大量的时间在框架的学习上,并且不需要proto文件或者重复且冗余的服务配置。最少只需要10行代码就可以创建一个服务, 如果需要额外的配置,也只需要几十行的代码。

虽然rpcx开发简单,但是作为开发人员来说,如果可以更加的偷懒, 那更是极好的一件事情了,这就是xgen开发的目的。

这个工具可以搜寻指定的package下可以配置成rpcx服务的类型, 并且生成一个服务器程序,将这些服务注册到服务器程序中。你可以指定是否需要zookeeper、etcd、consul作为注册中心。

这个工具的开发参考了Go的tools的实现以及DigitalOcean公司的Fatih Arslan
开发的gomodifytags的实现。

首先看一下这个工具参数:

12345678910
$ xgen -hUsage of xgen:  -o string    	specify the filename of the output  -pkg    	process the whole package instead of just the given file  -r string    	registry type. support etcd, consul, zookeeper, mdns  -tags string    	build tags to add to generated file

你可以使用xgen file1.go file2.go file3.go搜寻指定的文件生成服务,也可以xgen -pkg github.com/rpcx-ecosystem/rpcx-examples3/xgen为GOPATH中指定的package生成服务。-pkg选项优先于程序参数。

-o选项指定生成的程序输出到哪个文件,如果不指定,则输出到控制台Stdout。

-r选项指定注册中心的类型,支持zookeeper、etcd、consul和mdns。如果不指定,则采用点对点的rpc调用方式。

-tags选项指定生成的文件是否要加上build conditions。

看一个例子,rpcx-examples3/xgen中有一个server.go文件,它定义几个类型和方法。

1234567891011121314151617181920212223242526272829303132333435
package xgenimport (	"context"	"fmt"	"time"	example "github.com/rpcx-ecosystem/rpcx-examples3")type Arith intfunc (t *Arith) Mul(ctx context.Context, args example.Args, reply *example.Reply) error {	reply.C = args.A * args.B	return nil}func (t *Arith) Add(ctx context.Context, args *example.Args, reply *example.Reply) error {	reply.C = args.A + args.B	return nil}type Echo stringfunc (s *Echo) Echo(ctx context.Context, args string, reply *string) error {	*reply = fmt.Sprintf("Hello %s from %s", args, *reply)	return nil}type TimeS struct{}func (s *TimeS) Time(ctx context.Context, args time.Time, reply *time.Time) error {	*reply = time.Now()	return nil}

这三个类型Arith、Echo、TimeS都有符合rpcx服务的方法。

rpcx的服务的方法需要满足下面的规则:

  • 类型和参数都是exported
  • 方法有三个参数,并且第一个参数是context.Context
  • 方法的第三个参数是指针类型
  • 方法类型为error

现在你就可以使用xgen生成服务端代码。

1
xgen -o cmd/main.go -r "etcd" -pkg github.com/rpcx-ecosystem/rpcx-examples3/xgen

或者

1
xgen -o cmd/main.go -r "etcd" ./server.go

这样就生成了一个服务器端的代码。

你可以运行你的服务器了:go run -tags "etcd" cmd/main.go,就这么简单。

[返回] [原文链接]