本文相关代码:gitee
前言
在之前的部分,我们分别用gRpc和消息实现了微服务间的相互调用。
http
具体步骤
一、启动服务
task-srv
二、micro api 网关
micro
2.1 启动网关
micro
go.micro.api-227b83a3-686c-4766-a44f-b15544cda1b6micro apinamespace=go.microtype=api
需要注意的是,一个正常的三层服务架构是这样的:
- micro api localhost:8080 作为http入口点
- api服务 go.micro.api.XXX 为面向公众提供服务
- 后端服务 go.micro.srv.XXX 内部范围服务
--type=service
2.2 service not found 异常处理
micro newmicro api --namespace=go.micro.service
实际上翻阅官方早期文档会发现,这种写法早就已经被namespace + type替代了。
2.3 接口调用
服务名/api名/方法名

至此,一个可用的http服务就完成了。但从后端来看他很简陋,同时也并不是标准的restful接口,下面我们自己实现一个restful标准的API服务。
三、编写api服务
正如前面所说,一个正常的三层服务架构是这样的:
- micro api localhost:8080 作为http入口点
- api服务 go.micro.api.XXX 为面向公众提供服务
- 后端服务 go.micro.srv.XXX 内部范围服务
3.1 安装gin
go-restful
3.2 修改task.proto
gin框架支持自动绑定请求参数到struct,并可以根据用户配置对参数进行校验,主要要在struct的tag增加form参数。
原则上,我们应该为api接口参数设置专用的struct,不过这只是个演示项目,业务也很简单,我们就直接复用task.ptoto文件里的消息结构,仍然使用之前的protoc-go-inject-tag工具为生成文件增加form tag:
3.3 创建新项目
task-api
此时整个项目目录如下:
task-api/main.go
3.4 REST 映射
go-todolist/task-api/main.go
main.go

四、micro api反向代理
--header=http
现在我们访问micro网关的8080端口,不需要任何额外配置,http接口被自动发现并代理了:

五、grpc-gateway(选读)
grpc-gateway是一个protoc的插件,能够从proto文件读取gRPC服务定义,并生成将RESTful JSON API转换为gRPC的反向代理服务器。
这是我在网上看到转发最多的一个go-micro集成grpc-gateway的例子,推荐大家可以跟着教程试一试,感受一下他的用法:
不论你是否跟着上面链接的教程尝试过grpc-gateway,这里说结论:
- 优点:实现接口代理非常方便,只需要在proto文件定义路径和请求方式,main.go文件虽然有一点点代码,但几乎可以完全复用不需要大的修改。
- 缺点:不支持像micro api一样的服务发现能力,需要用户手动指定被代理方的地址,同时多个服务的负载均衡也需要在代码中自己实现。
最后,我选择了功能更加强大的且与整个系统集成度更高的micro api方案
总结
这一章是本系列文章第一部分的最后一章。
从零开始
下一阶段,我们将围绕go-micro的插件设计,学习如何快速且灵活的为项目集成服务治理(etcd)消息队列(nats)熔断器(hystrix)鉴权(JWT)以及链路追踪(jaeger)