gomicro是golang的一个微服务框架。 gomicro各个版本之间的兼容性问题一直被诟病,前几年gomicro更是分化出了两个分支: 一个延续了gomicro,只不过转到了其公司CEO的个人Github仓库中,访问地址: asimgomicro:AGomicroservicesframework(github。com) 一个转向了云原生方向,名字叫Micro,访问地址: micromicro:APIfirstcloudplatform(github。com) 不过都还是开源的,当前的许可证都是Apache2。0,不是某些人说的不能商用了,当然无法保证以后不会改许可证。 回到正文,这篇文章将介绍使用gomicro最新版本v4开发gRPC服务的方式。1、安装protoc 这个工具也称为proto编译器,可以用来生成各种开发语言使用proto协议的代码。 下载地址:https:github。comprotocolbuffersprotobufreleases 一般下载最新版本就行,注意要符合自己当前的操作系统。 解压后里边有个protoc。exe,拷贝到GOPATH的bin目录下,我这里就是C:UsersPC001gobin,PC001是登录当前操作系统的用户名,需要换成你自己的。GOPATH可以通过执行goenv查看到。 一般都是把GOPATH的bin目录添加到环境变量的PATH变量中,如果没有,请自行添加上。2、安装protoc的gomicro插件 需要安装两个插件,它们用来生成Golang版本的proto协议代码和gomicro的gRPC代理代码。 执行如下命令,会在GOPATH的bin目录下生成两个可执行文件:protocgengo。exe和protocgenmicro。exe。goinstallgoogle。golang。orgprotobufcmdprotocgengogoinstallgomicro。devv4cmdprotocgenmicrov43、编写proto文件 proto文件是符合ProtocolBuffers语言规范的数据交换协议文件,就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了,这里创建一个名为hello。proto的文件,放到项目的proto目录下:syntaxproto3;optiongopackageproto;packageBusiness;serviceHello{rpcSay(SayRequest)returns(SayResponse);}messageSayResponse{stringMessage1;}messageSayRequest{stringName1;} 这个协议很简单,有个名字为Hello的服务,提供一个名字为Say的rpc方法,这个方法有输入输出,输入信息中有一个名为Name的参数,输出信息中有一个名为Message的返回值。4、生成gRPC代理代码 在项目根目录中执行如下命令,会在proto目录下生成两个文件:hello。pb。go和hello。pb。micro。go。protocgoout。gooptpathssourcerelativemicroout。microoptpathssourcerelativeprotohello。proto hello。pb。go中是输入输出数据类型的Golang定义,hello。pb。micro。go中是gomicro客户端和服务端的gRPC代理程序。 也可以将文件生成到别的目录中,比如修改proto文件中gopackage的配置为:optiongopackagebusiness; 然后执行下面的命令,会生成到项目下的business目录中:protocgoout。microout。protohello。proto 具体这个命令还有哪些参数,可以执行protochelp去探索下,这里就不罗嗦了。5、编写gRPC服务端程序 这里先上代码:packagemainimport(contextfmtgrpchelloprotologtimegithub。comasimgomicropluginsservergrpcv4gomicro。devv4gomicro。devv4server)typeHellostruct{}func(sHello)Say(ctxcontext。Context,reqproto。SayRequest,rspproto。SayResponse)error{fmt。Println(request:,req。Name)rsp。MessageHelloreq。Namereturnnil}funcmain(){grpcServer:grpc。NewServer()service:micro。NewService(micro。Server(grpcServer),micro。Name(grpchello。service),micro。Address(0。0。0。0:8001),micro。RegisterTTL(time。Second30),micro。RegisterInterval(time。Second10),)optionallysetupcommandlineusageservice。Init()RegisterHandlersproto。RegisterHelloHandler(service。Server(),Hello{})Runserveriferr:service。Run();err!nil{log。Fatal(err)}} 整个过程如下: 先定义一个名为Hello的类型,它去实现hello。pb。micro。go中生成的HelloHandler接口,也就是编写具体的业务实现。 然后通过grpc。NewServer创建一个gRPC服务器,这里决定gomicro底层通信使用gPRC; 然后通过micro。NewService创建一个micro服务,这里需要传入上面创建的grpcserver,还要设置服务的名称、监听端口,以及保持服务健康用的TTL和上报周期。gomico当前默认的服务发现机制是mdns,不用额外部署服务发现工具,不过一般只建议在开发环境使用,生产环境建议使用etcd; 通过上面的步骤对服务进行一些初始化之后,再将Hello类型的实例注册到grpcserver; 最后启动服务,就可以开始接客了。 如果直接粘贴这段代码的话,会有很多包没有引用进来,可以通过goget获取这些包,也可以执行命令:gomodtidy来引入需要的包。 这里边还import了一个grpchelloproto,这个是我这边项目的mod是grpchello,gRPC代理程序的package是proto,如果你的不一样,需要修改下。6、编写gRPC客户端程序 访问gRPC服务也是通过hello。pb。micro。go中生成的方法,直接上代码:packagemainimport(bufiocontextfmtgrpchelloprotoosgithub。comasimgomicropluginsclientgrpcv4gomicro。devv4)funcmain(){service:micro。NewService(micro。Client(grpc。NewClient()),)service。Init()client:proto。NewHelloService(grpchello。service,service。Client())rsp,err:client。Say(context。TODO(),proto。SayRequest{Name:BOSSMA})iferr!nil{fmt。Println(err)}fmt。Println(rsp)fmt。Println(按回车键退出程序。。。)in:bufio。NewReader(os。Stdin),,in。ReadLine()} 上面的程序使用了grpc。NewClient,这决定了底层通信采用gRPC;然后再使用生成的代码proto。NewHelloService创建客户端代理,这里指定的服务名字必须是服务端注册的名字;最后使用这个客户端代理调用相应的方法。7、运行程序 可以使用gorunxxx。go来编译并运行程序。这里为了方便测试,先使用gobuild将它们编译为exe,然后再双击运行。实际运行效果如下: 以上就是本文的主要内容了,完整代码示例已经上传到Github:https:github。combosimagodemotreemaingomicrogrpchello