micro api是api网关
使用API网关模式为您的服务提供单个公共入口点。micro api服务于HTTP并使用服务发现动态路由。
image概观
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
跑
# Default port 8080
micro api
使用ACME
默认使用ACME通过Let's Encrypt进行安全服务
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
例子
这里我们有一个3层架构的例子
-
micro api
:(localhost:8080) - 作为http入口点 -
api service
:(go.micro.api.greeter) - 为面向公众的api服务 -
backend service
:(go.micro.srv.greeter) - 内部范围的服务
完整的例子是examples / greeter
运行示例
先决条件:我们默认使用consul进行服务发现,以确保其安装和运行,例如consul agent -dev
# Download example
git clone https://github.com/micro/examples
# Start the service
go run examples/greeter/srv/main.go
# Start the API
go run examples/greeter/api/api.go
# Start the micro api
micro api
询问
通过micro api进行HTTP调用
curl "http://localhost:8080/greeter/say/hello?name=John"
HTTP路径/ greeter / 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
API
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和protobuf POST请求。转发为RPC。 -
proxy
- 将HTTP和转发作为反向代理处理。 -
event
- 处理任何HTTP请求并发布到消息总线。 -
web
- HTTP反向代理,包括Web套接字。
(可选)绕过/rpc
端点处理程序
API处理程序
API处理程序为任何HTTP请求提供服务,并作为具有特定格式的RPC请求转发。
- 内容类型:任何
- 身体:任何
- 转发格式:api.Request / api.Response
- 路径:
/[service]/[method]
- 解析器:路径用于解析服务和方法
- 配置:Flag
--handler=api
或env varMICRO_API_HANDLER=api
RPC处理程序
RPC处理程序提供json或protobuf HTTP POST请求并作为RPC请求转发。
- 内容类型:
application/json
或application/protobuf
- 正文:JSON或Protobuf
- 转发格式:基于内容的json-rpc或proto-rpc
- 路径:
/[service]/[method]
- 解析器:路径用于解析服务和方法
- 配置:Flag
--handler=rpc
或env varMICRO_API_HANDLER=rpc
- 未指定处理程序时的默认处理程序
代理处理程序
代理处理程序是具有内置服务发现的http保留代理。
- 内容类型:任何
- 身体:任何
- 转发格式:HTTP反向代理
- 路径:
/[service]
- 解析器:路径用于解析服务名称
- 配置:Flag
--handler=proxy
或env varMICRO_API_HANDLER=proxy
- REST可以作为微服务在API后面实现
事件处理程序
事件处理程序为HTTP提供服务,并使用go-micro代理通过消息总线将请求作为消息转发。
- 内容类型:任何
- 身体:任何
- 转发格式:请求格式为go-api / proto.Event
- 路径:
/[topic]/[event]
- 解析器:路径用于解析主题和事件名称
- 配置:Flag
--handler=event
或env varMICRO_API_HANDLER=event
Web处理程序
Web处理程序是一个http保留代理,具有内置服务发现和Web套接字支持。
- 内容类型:任何
- 身体:任何
- 转发格式:HTTP反向代理,包括Web套接字
- 路径:
/[service]
- 解析器:路径用于解析服务名称
- 配置:Flag
--handler=web
或env varMICRO_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中查找工作示例
分解器
Micro使用命名空间值和HTTP路径动态路由到服务。
默认命名空间是go.micro.api
。通过--namespace
或设置名称空间MICRO_NAMESPACE=
。
使用的旋转变压器如下所述。
RPC解析器
RPC服务有一个名称(go.micro.api.greeter)和一个方法(Greeter.Hello)。
URL解析如下:
Path | Service | Method |
---|---|---|
/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可以轻松映射到服务名称:
Path | Service | Method |
---|---|---|
/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解析如下:
Path | Service | Service Path |
---|---|---|
/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 |
网友评论