在Micro (2)中讲到定义服务以及服务端和客户端的实现,并没有提到如何提供API接口,Micro框架通过micro api来提供API服务,micro api是micro微服务的API网关。
默认监听8080端口,动态独有请求到相应的后端service。内部使用了go-micro框架,我们也可以很方便把服务发现从consul切换到其他的服务发现,比如 kubernetes API 或者RPC for gRPC。
micro api有两种形式来访问服务中的http api:
/[service]/[method] # 通过http path来指定调用的service
/rpc # 在http body中提供service和method来指定调用的service
Http Handler
micro api提供下面4种方式来定义http api:
Endpoint Metadata
- 默认的Handler,如果找不到匹配的路由,将使用API Handler。
- Request/Response: 在proto中自行定义Request/Response类型
- 注册Handler方法调用需要提供Endpoint,如下:
RegisterExampleHandler(service.Server(), new(Example), api.WithEndpoint(&api.Endpoint{
// The RPC method
Name: "Example.Call",
// The HTTP paths. This can be a POSIX regex
Path: []string{"/example"},
// The HTTP Methods for this endpoint
Method: []string{"POST"},
// The API handler to use
Handler: api.Rpc,
}))
- 启动API Gateway命令, `micro api`
API Handler
- Request/Response: Service方法定义参数类型为api.Request/api.Response, 定义proto消息时使用,需在proto文件中导入定义,`import "github.com/micro/go-api/proto/api.proto";`
- http path用来解析service和method
- 请求处理的API Service参数使用的类型是api.Request和api.Response
- 请求和相应的content-type可以是任何类型
- 如果找不到匹配的service将返回404
- 启动API Gateway命令, `micro api --handler=api`
RPC Handler
- Request/Response: 在proto中自行定义Request/Response类型,
- 对默认的Handler的可选处理是使用go-micro Client转发请求体作为RPC请求
- 允许API Handler定义混用Golang的类型
- 除了提供API Service还可以提供Backend Service
- 支持的content-type: application/json和application/protobuf
- 启动API Gateway命令, `micro api --handler=rpc`
Reverse Proxy
- Request/Response: http, 即使用Golang方式定义Handler方法,参数类型http.Request/http.ResponseWriter。
- 根据http path中第一个来反向代理请求
- 允许API以REST风格来实现
- 启动API Gateway命令, `micro api --handler=proxy`
参考官方example/api
参考文章:
[1] https://micro.mu/blog/2016/03/20/micro.html
[2] https://micro.mu/blog/