本文相关代码: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)