接口网关

前言: micro api 是一种接口网关

使用 API 网关 模式 为服务提供单个公共入口点. micro api 使用服务发现提供 HTTP 和动态路由.

概述

micro api 是一个 HTTP api. 对 API 的请求通过 HTTP 提供, 并通过服务发现进行路由. 它建立在 go-micro 的基础上, 利用它进行服务发现, 负载平衡, 编解码以及基于 RPC 的通信.

由于 micro api 在内部使用 go-micro, 这也使得它具备可插拔特性. 可参阅 go-plugins 了解 gRPC, kubernetes, etcd, nats, rabbitmq 以及更多支持. 此外它使用了允许配置处理程序的 go-api.

安装

go get -u github.com/micro/micro/v2

运行

# Default port 8080
micro api

使用 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

设置 TLS 证书

API 支持使用 TLS 证书安全地提供服务

MICRO_ENABLE_TLS=true
MICRO_TLS_CERT_FILE=/path/to/cert
MICRO_TLS_KEY_FILE=/path/to/key
micro api

设置命名空间

API 使用命名空间在逻辑上分隔后端和面向公共的服务. 命名空间和 http 路径用于解析服务名称/方法, 例如 GET /foo HTTP/1.1 路由到服务名称 go.micro.api.foo.

默认命名空间是 go.micro.api 也可以像下面这样调整

MICRO_NAMESPACE=com.example.api micro api

要禁用命名空间, 请将其设置为空格. 这是一个特殊手段, 后续我们将会修复.

MICRO_NAMESPACE=' '

示例

里我们有一个 3 层体系结构的示例

  • micro api:(本地主机:8080) - 作为 http 入口点
  • api service:(go.micro.api.greeter) - 作为一个公开的接口
  • backend service:(go.micro.srv.greeter) - 内部后端服务

完整的示例是 示例/问候器

运行示例

# 下载示例
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

查询

通过 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

接口

micro api 提供以下 HTTP api

- /[service]/[method]    # HTTP paths are dynamically mapped to services
- /rpc            # Explicitly call a backend service by name and method

有关示例, 见下文

处理器

处理程序是管理请求路由的 HTTP 处理程序.

默认处理程序使用注册表中的终结点元数据来确定服务路由. 如果未找到路由匹配项, 它将回退到 “rpc” 处理程序. 您可以使用 go-api 在注册时配置路由.

API 具有以下可配置的请求处理程序.

  • api - 处理任何 HTTP 请求. 通过 RPC 完全控制 http 请求/响应.
  • rpc - 处理 json 和协议缓冲的 POST 请求. 转发为 RPC.
  • proxy - 作为反向代理处理 HTTP 并转发.
  • event - 处理任何 HTTP 请求并发布到消息总线.
  • web - HTTP 反向代理, 包括 web sockets.

可使用 /rpc 终结点选项绕过处理程序

API 处理程序

API 处理程序提供任何 HTTP 请求, 并将转发为具有特定格式的 RPC 请求.

  • Content-Type:任何
  • Body: 任何
  • Forward Format: api.Request/api.Response
  • Path: /[service]/[method]
  • Resolver: 路径用于解析服务和方法
  • Configure:标记 --handler=api 或环境变量 MICRO_API_HANDLER=api

RPC 处理程序

RPC 处理程序为 json 或 protobuf HTTP POST 请求提供服务, 并作为 RPC 请求转发.

  • Content-Type: application/jsonapplication/protobuf
  • Body: JSON 或 Protobuf
  • Forward Format: 基于内容的 json-rpc 或 proto-rpc
  • Path: /[service]/[method]
  • Resolver: 路径用于解析服务和方法
  • Configure:标记 --handler=rpc 或环境变量 MICRO_API_HANDLER=rpc
  • 未指定处理程序时的默认处理程序

代理处理程序

代理处理程序是具有内置服务发现的 http 反向代理.

  • Content-Type: 任何
  • Body: 任何
  • Forward Format: HTTP 反向代理
  • Path: /[service]
  • Resolver: 路径用于解析服务名称
  • Configure: 标记 --handler=proxy 或环境变量 MICRO_API_HANDLER=proxy
  • REST 可作为微服务在 API 的后端实现

事件处理程序

事件处理程序使用 go-micro 代理在消息总线上提供 HTTP 并将请求作为消息转发.

  • Content-Type: 任何
  • Body: 任何
  • Forward Format: 格式为 go-api/proto.Event 的请求
  • Path: /[topic]/[event]
  • Resolver: 路径用于解决主题和事件名称
  • Configure:标记 --handler=event 或环境变量 MICRO_API_HANDLER=event

Web 处理程序

Web 处理程序是一个 http 保留代理, 具有内置服务发现和 web 套接字支持.

  • Content-Type: 任何
  • Body: 任何
  • Forward Format: HTTP 反向代理, 包括 web 套接字
  • Path: /[service]
  • Resolver: 路径用于解析服务名称
  • Configure: 标记 --handler=web 或环境变量 MICRO_API_HANDLER=web

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 中查找工作示例

解析器

使用命名空间值和 HTTP 路径的微动态路由到服务.

默认命名空间为 go.micro.api. 通过 --namespaceMICRO_NAMESPACE= 设置命名空间.

下面将介绍所使用的解析器.

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

代理解析器

使用代理处理程序, 我们只需要处理解析服务名称. 因此 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
文档更新时间: 2020-06-02 15:57   作者:kuteng