这里抛几个问题:
- RPC服务目录结构怎么设计?
- 代码仓库如何处理?
- 协议仓库如何处理?
- 对外如何提供接口服务?
3.1、gRPC
gRPC是一个现代的开源高性能RPC框架,可以在任何环境下运行。它可以有效地连接数据中心内和数据中心之间的服务,并支持可插拔的负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算、移动应用程序和浏览器连接到后端服务。
并且gRPC的资料很多,实践的文章也很多,后面统一使用gRPC作为我们了解RPC框架的实践。
3.2、stub生成
协议我们使用Protobuf,pb的demo.proto协议如下:
1 | syntax = "proto3"; |
生成命令
1 | protoc --go_out=plugins=grpc:. demo.proto |
生成工具protoc的安装可以google,很多资料。
3.3、工程目录
工程目录是一个团队或者工程最应该统一的,有效的提升代码的可读性。这里我们统一定义一个目录
1 | ├── cmd cmd目录仅存放main函数,不要放入业务逻辑 |
我们的cmd中存放main函数,internal是我们服务内部逻辑,也就是接口的具体实现,pkg中存放供外部调用的clien,为什么要有这个?使用go mod的开发模式,只需要把你client的仓库地址告诉对方,就可以将所有依赖的代码加载进来,很方便。
3.4、工程实现
根据上面的目录结构,我们来具体实现以下server
3.4.1、接口实现
imp.go文件中,定义了greeter结构体,以及NewGreeter()用来创建greeter结构。
1 | package logic |
helloworld.go实现了SayHello方法。
1 | func (g *greeter) SayHello(ctx context.Context, req *helloworld.HelloRequest) (*helloworld.HelloReply, error) { |
3.4.2、启动服务
main.go
1 | package main |
3.4.3、client api
/pkg/api/client.go实现如下:外部可以直接调用NewGreeterClient生成对应的client
1 | var address = "localhost:50052" |
3.4.5、test
启动服务
1 | go run main.go |
客户端实现:
1 | package main |
执行结果:
1 | rsp.message = hello:ldaysjun |
3.5、总结
本篇主要是构建一个服务,约定一些规则,其中也涉及到gRPC的安装,protoc工具的生成,这些随便一搜有很多的资料可供参考。下一篇分析gRPC的详细调用过程。