1. 接口网关
前言: micro api 是一种接口网关
使用 API 网关 模式 为服务提供单个公共入口点. micro api 使用服务发现提供 HTTP 和动态路由.
1.1. 概述
micro api 是一个 HTTP api. 对 API 的请求通过 HTTP 提供, 并通过服务发现进行路由. 它建立在 go-micro 的基础上, 利用它进行服务发现, 负载平衡, 编解码以及基于 RPC 的通信.
由于 micro api 在内部使用 go-micro, 这也使得它具备可插拔特性. 可参阅 go-plugins 了解 gRPC, kubernetes, etcd, nats, rabbitmq 以及更多支持. 此外它使用了允许配置处理程序的 go-api.
1.2. 安装
go get -u github.com/micro/micro/v2
1.3. 运行
# Default port 8080
micro api
1.4. 使用 ACME
默认情况下, 通过 "Let's Encrypt" 使用 ACME 提供的安全服务
MICRO_ENABLE_ACME=true micro api
可指定主机白名单选项
MICRO_ENABLE_ACME=true
MICRO_ACME_HOSTS=example.com,api.example.com
micro api
1.5. 设置 TLS 证书
API 支持使用 TLS 证书安全地提供服务
MICRO_ENABLE_TLS=true
MICRO_TLS_CERT_FILE=/path/to/cert
MICRO_TLS_KEY_FILE=/path/to/key
micro api
1.6. 设置命名空间
API 使用命名空间在逻辑上分隔后端和面向公共的服务. 命名空间和 http 路径用于解析服务名称/方法, 例如 GET /foo HTTP/1.1
路由到服务名称 go.micro.api.foo
.
默认命名空间是 go.micro.api
也可以像下面这样调整
MICRO_NAMESPACE=com.example.api micro api
要禁用命名空间, 请将其设置为空格. 这是一个特殊手段, 后续我们将会修复.
MICRO_NAMESPACE=' '
1.7. 示例
里我们有一个 3 层体系结构的示例
micro api
:(本地主机:8080) - 作为 http 入口点api service
:(go.micro.api.greeter) - 作为一个公开的接口backend service
:(go.micro.srv.greeter) - 内部后端服务
完整的示例是 示例/问候器
1.7.1. 运行示例
# 下载示例
git clone https://github.com/micro/examples
# 启动服务
go run examples/greeter/srv/main.go
# 启动接口
go run examples/greeter/api/api.go
# 启动 micro api 接口网关
micro api
1.7.2. 查询
通过 micro api 进行 HTTP 调用
curl "http://localhost:8080/greeter/say/hello?name=John"
HTTP 路径 /greet/say/hello 映射到服务 go.micro.api.greeter 的 Say.Hello 方法
绕过 api 服务直接通过 /rpc 调用后端接口服务
curl -d 'service=go.micro.srv.greeter'
-d 'method=Say.Hello'
-d 'request={"name": "John"}'
http://localhost:8080/rpc
完全与 JSON 相同的调用
curl -H 'Content-Type: application/json'
-d '{"service": "go.micro.srv.greeter", "method": "Say.Hello", "request": {"name": "John"}}'
http://localhost:8080/rpc
1.8. 接口
micro api 提供以下 HTTP api
- /[service]/[method] # HTTP paths are dynamically mapped to services
- /rpc # Explicitly call a backend service by name and method
有关示例, 见下文
1.9. 处理器
处理程序是管理请求路由的 HTTP 处理程序.
默认处理程序使用注册表中的终结点元数据来确定服务路由. 如果未找到路由匹配项, 它将回退到 "rpc" 处理程序. 您可以使用 go-api 在注册时配置路由.
API 具有以下可配置的请求处理程序.
api
- 处理任何 HTTP 请求. 通过 RPC 完全控制 http 请求/响应.rpc
- 处理 json 和协议缓冲的 POST 请求. 转发为 RPC.proxy
- 作为反向代理处理 HTTP 并转发.event
- 处理任何 HTTP 请求并发布到消息总线.web
- HTTP 反向代理, 包括 web sockets.
可使用 /rpc
终结点选项绕过处理程序
1.9.1. API 处理程序
API 处理程序提供任何 HTTP 请求, 并将转发为具有特定格式的 RPC 请求.
- Content-Type:任何
- Body: 任何
- Forward Format: api.Request/api.Response
- Path:
/[service]/[method]
- Resolver: 路径用于解析服务和方法
- Configure:标记
--handler=api
或环境变量MICRO_API_HANDLER=api
1.9.2. RPC 处理程序
RPC 处理程序为 json 或 protobuf HTTP POST 请求提供服务, 并作为 RPC 请求转发.
- Content-Type:
application/json
或application/protobuf
- Body: JSON 或 Protobuf
- Forward Format: 基于内容的 json-rpc 或 proto-rpc
- Path:
/[service]/[method]
- Resolver: 路径用于解析服务和方法
- Configure:标记
--handler=rpc
或环境变量MICRO_API_HANDLER=rpc
- 未指定处理程序时的默认处理程序
1.9.3. 代理处理程序
代理处理程序是具有内置服务发现的 http 反向代理.
- Content-Type: 任何
- Body: 任何
- Forward Format: HTTP 反向代理
- Path:
/[service]
- Resolver: 路径用于解析服务名称
- Configure: 标记
--handler=proxy
或环境变量MICRO_API_HANDLER=proxy
- REST 可作为微服务在 API 的后端实现
1.9.4. 事件处理程序
事件处理程序使用 go-micro 代理在消息总线上提供 HTTP 并将请求作为消息转发.
- Content-Type: 任何
- Body: 任何
- Forward Format: 格式为 go-api/proto.Event 的请求
- Path:
/[topic]/[event]
- Resolver: 路径用于解决主题和事件名称
- Configure:标记
--handler=event
或环境变量MICRO_API_HANDLER=event
1.9.5. Web 处理程序
Web 处理程序是一个 http 保留代理, 具有内置服务发现和 web 套接字支持.
- Content-Type: 任何
- Body: 任何
- Forward Format: HTTP 反向代理, 包括 web 套接字
- Path:
/[service]
- Resolver: 路径用于解析服务名称
- Configure: 标记
--handler=web
或环境变量MICRO_API_HANDLER=web
1.9.6. RPC 终结点
/rpc 终结点允许您绕过主处理程序直接与任何服务通信
- 请求参数
service
- 设置服务名称method
- 设置服务方法request
- 请求正文address
- 可选地将主机地址指定为目标
调用示例:
curl -d 'service=go.micro.srv.greeter'
-d 'method=Say.Hello'
-d 'request={"name": "Bob"}'
http://localhost:8080/rpc
可在 github.com/micro/examples/api 中查找工作示例
1.10. 解析器
使用命名空间值和 HTTP 路径的微动态路由到服务.
默认命名空间为 go.micro.api
. 通过 --namespace
或 MICRO_NAMESPACE=
设置命名空间.
下面将介绍所使用的解析器.
1.10.1. RPC 解析器
RPC 服务具有名称 (go.micro.api.greet) 和方法 (Greeter.Hello).
网址解析如下:
路径 | 服务 | 方法 |
---|---|---|
/foo/bar | go.micro.api.foo | Foo.Bar |
/foo/bar/baz | go.micro.api.foo | Bar.Baz |
/foo/bar/baz/cat | go.micro.api.foo.bar | Baz.Cat |
可版本化 API URL 可轻松映射到服务名称:
路径 | 服务 | 方法 |
---|---|---|
/foo/bar | go.micro.api.foo | Foo.Bar |
/v1/foo/bar | go.micro.api.v1.foo | Foo.Bar |
/v1/foo/bar/baz | go.micro.api.v1.foo | Bar.Baz |
/v2/foo/bar | go.micro.api.v2.foo | Foo.Bar |
/v2/foo/bar/baz | go.micro.api.v2.foo | Bar.Baz |
1.10.2. 代理解析器
使用代理处理程序, 我们只需要处理解析服务名称. 因此 RPC 解析器略有不同.
URLS 解析如下:
路径 | 服务 | 服务路径 |
---|---|---|
/foo | go.micro.api.foo | /foo |
/foo/bar | go.micro.api.foo | /foo/bar |
/greeter | go.micro.api.greeter | /greeter |
/greeter/:name | go.micro.api.greeter | /greeter/:name |