前言
先啰嗦几句,首先,此文章不介绍如何利用Golang实现一个GRPC的相关细节,本文为大家介绍一个框架,直接快速生成一个 GRPC 服务,你可以不用了解 GRPC 的实现细节,和 HTTP 服务一样直接请求即可。
该方法可以满足大部分的 GRPC 调用需求,但无法满足所有的需求,如你需要实现个性化的调用方式还是得慢慢研究熟悉 GRPC 的使用方法。
通过此框架可以让你快速实现 GRPC 服务,尽快提供一个可用的产品交付,然后慢慢熟悉了解GRPC,拒绝 996.。。
为什么会来分享这个方法?这源于最近对工作中使用GRPC的一些思考。
问题的产生:
GRPC的优势不用多说,大家也能从网络上找到各种解释,开始使用 GRPC 需要编写 proto 文件,通过 protoc 工具生成 pb文件并开始编写代码... 整套流程下来对刚入手的同学非常不友好,刚开始大家都会有几个疑问,啥是 proto 文件,啥是 pb 文件等等,等到研究完一圈,终于弄出一个 Hello World,领导就开始催这么简单的功能怎么开没提测,于是 996 就这样开始了...
当前的问题:
等大家都开始用GRPC来作为服务间相互调用的常用方式后,新的问题随之而来,大量的 proto文件散落各地,通过强有力的行政手段,让大家规范 proto 文件存放位置也难免会出现纰漏,另外一个大问题就是其他团队对接GRPC也经常会非常头疼,标准流程 同步proto文件--本地实现接口--实现调用联调,和 HTTP 接口相比,确实要繁琐很多。
方案介绍:
参考 HTTP 服务,在实际使用中 HTTP 服务通常 GET,POST,PUT 等方法使用的频率会比多,并且大家的服务都会按照这些方法去开发接口因此相互调用就没有太多差异,GRPC 如果类似实现几个请求方法,这样大家都是用这个方法就能解决复杂 proto 的问题了,接口调用通常都是 输入与输出,将输入与输出都变成 json 结构,这样就能用一个通用的 GRPC 方法实现类似HTTP服务的调用方式了。
开始操作:
框架介绍:目前使用的是 Orange框架,此框架目前master版本支持了 GRPC 服务,通过此框架生成的应用,既有 HTTP 服务,也有 GRPC 服务。
创建一个服务端非常简单,按照文档,在自己的 $GOPATH/src 目录下创建一个应用目录,然后编写 main.go,几行代码即可:
package main import "gitee.com/zhucheer/orange/app" func main(){ router := &Route{} app.AppStart(router) } type Route struct { } func (s *Route) ServeMux() { // 路由注册,注册一个GET请求,返回 Hello world! app.NewRouter("").GET("/", func(ctx *app.Context) error { return ctx.ToString("Hello world!") }) // 路由注册,注册一个GRPC请求,返回一串信息 app.NewRouter("").GRPC("/grpc", func(ctx *app.Context) error { return ctx.ToString("Hello world, this is grpc response") }) } func (s *Route) Register() { }
目前只master版本支持GRPC, 按如下代码启动项目
## 开启go mod $ go mod init ## 先更新框架到master $ go get gitee.com/zhucheer/orange@master ## 启动服务配置 GRPC 端口 go run main.go --grpc=8989
走到这一步,不出意外就能启动服务,服务包含一个 HTTP 服务端口8088 ,和一个 GRPC 服务端口 8989
客户端请求:
服务端启动后就可以进行测试了,先验证HTTP服务,打开浏览器,直接输入 http://127.0.0.1:8088 就能看到浏览器输入了一个我们代码中编写的 Hello World!
GRPC调用通用也非常简单,随便找个目录创建一个main.go 输入几行代码:
package main import ( "fmt" "gitee.com/zhucheer/orange/grpc" ) func main(){ // 填上 GRPC 服务地址端口,RunGRPC 参数添加服务端路由绑定的地址 resp, err := grpc.NewClient().SetSrvAddr("127.0.0.1:8989").RunGRPC("/grpc") fmt.Println("grpc response:",resp.String(), err) }
go run main.go 运行起来就能成功调用刚才的 GRPC 服务端方法了,是不是非常简单,快来试试吧。