go-micro-micro工具包
工具包集合
前篇
micro 是 go-micro 的工具包
安装
- 安装 micro 工具包必须先启用 module
- windows
- 加入环境变量
GO111MODULE=on
- 如果Go版本≥1.13,执行以下命令设置全局变量:
go env -w GO111MODULE=on
- 加入环境变量
- Linux docker, goland:1.13.5 镜像已经默认开启.
- windows
- 下载并编译成可执行程序 micro.exe :
go get -v -u github.com/micro/micro
micro 指令
获取 xxx 服务信息
1
2$ micro get service xxx
service xxx列出所有服务
1
2$ micro list services
user
web 界面
显示 仪表盘需要加上 --enable_stats
参数
1 | F:\go\GoWinEnv_Test01 (master -> origin) |
然后打开 http://localhost:8082/registry 就能访问已有的服务
点击 user 查看服务的具体信息
集成 etcd
cd 到 micro 根目录.
github.com\micro\micro
增加一个插件编译文件 plugins.go, 内容如下
1
2
3
4
5package main
import (
_ "github.com/micro/go-plugins/registry/etcdv3"
)编译出可执行程序 mainWithEtcdv3.exe
1
$ go build -o mainWithEtcdv3.exe main.go plugins.go
web 查看
必须得在 micro 中集成 etcd. 参考: [micro 工具包集成 etcd](#micro 工具包集成 etcd). 编译出可执行程序 mainWithEtcdv3.exe
启动 mainWithEtcdv3.exe, 带上 registry 参数
mainWithEtcdv3.exe 就是集成了 etcd 编译出来的可执行程序
1
2
3
4
5$ mainWithEtcdv3.exe --registry=etcdv3 --registry_address=http://127.0.0.1:2379 web
2019-10-09 20:18:07.065747 I | HTTP API Listening on [::]:8082
2019-10-09 20:18:07.066745 I | Transport [http] Listening on [::]:60732
2019-10-09 20:18:07.066745 I | Broker [http] Connected to [::]:60733
2019-10-09 20:18:07.085695 I | Registry [etcdv3] Registering node: go.micro.web-f31d5552-052f-4996-ad40-0eb5e2b21064打开web: http://localhost:8082/registry
可以看到运行的两个 节点
新建模板
Help
1 | USAGE: |
简单示例, 新建一个 new_service 微服务模板
1 | micro new new_service |
生成的服务会被放到 $GOPATH
的相对目录下:
api 网关
micro api提供下面类型的http api接口
1 | - /[service]/[method] # HTTP路径式的会被动态地定位到服务上 |
Handlers
Handler负责持有并管理HTTP请求路由。
默认的handler使用从注册中心获取的端口元数据来决定指向服务的路由,如果路由不匹配,就会回退到使用”rpc” hander。在注册时,可以通过go-api来配置路由。
API有如下方法可以配置请求handler:
api
- 负责把内部的RPC服务对外暴露成http接口,它接收并处理http请求,根据URL转成内部RPC请求,并把RPC服务的响应结果返回客户端。rpc
- 处理json及protobuf格式的POST请求,并转向RPC。proxy
- 反向代理。event
- 处理任意的http请求并向消息总线分发消息。web
- http反向代理,支持websocket。
通过/rpc
入口可以绕开handler处理器。
目前版本(V1)无法支持多个handler并存运行,也即同时只能使用一个handler。
API Handler
API处理器接收任何的HTTP请求,并且向前转发指定格式的RPC请求。
- Content-Type: 支持任何类型
- Body: 支持任何格式
- Forward Format: 转发格式,api.Request/api.Response
- Path: 请求路径,
/[service]/[method]
- Resolver: 请求解析器,路径会被解析成服务与方法
- Configure: 配置,在启动时指定
--handler=api
或在启动命令前指定环境变量MICRO_API_HANDLER=api
请求示例:
1 | curl "http://localhost:8080/greeter/say/hello?name=John" |
HTTP请求的路径/greeter/say/hello
会被路由到服务go.micro.api.greeter
的方法Say.Hello
上。
RPC Handler
RPC处理器接收json或protobuf格式的HTTP POST请求,然后向前转成RPC请求。
- Content-Type:
application/json
orapplication/protobuf
- Body: JSON 或者 Protobuf
- Forward Format: json-rpc或者proto-rpc,与
Content-Type
有关 - Path:
/[service]/[method]
- Resolver: 请求解析器,路径会被解析成服务与方法
- Configure: 配置,在启动时指定
--handler=rpc
或在启动命令前指定环境变量MICRO_API_HANDLER=rpc
- 如果没有设置时,RPC Handler就是默认的handler,
请求示例:
绕开api服务并且直接通过rpc调用:
1 | curl -d 'service=go.micro.srv.greeter' \ |
使用JSON的方式执行同一请求:
1 | curl -H 'Content-Type: application/json' \ |
Proxy Handler
代理Handler其实是内置在服务发现中的反向代理服务。
- Content-Type: 支持任何类型
- Body: 支持任何格式
- Forward Format: HTTP反向代理
- Path:
/[service]
- Resolver: 请求解析器,路径会被解析成服务名
- Configure: 配置,在启动时指定
--handler=proxy
或在启动命令前指定环境变量MICRO_API_HANDLER=proxy
- REST风格的服务可以通过API代理,就像常见微服务一样对外提供相应的服务。
Event Handler
事件处理器使用go-micro的broker代理接收http请求并把请求作为消息传到消息总线上。
- Content-Type: 支持任何类型
- Body: 支持任何格式
- Forward Format: 请求格式得是 go-api/proto.Event
- Path: 请求路径,
/[topic]/[event]
- Resolver: 请求解析器,路径会被解析成topic(主题,相当于事件分类)与事件(event)名。
- Configure: 配置,在启动时指定
--handler=event
或在启动命令前指定环境变量MICRO_API_HANDLER=event
Web Handler
Web处理器,它是内置在服务发现中的HTTP反向代理服务,支持web socket。
- Content-Type: 支持任何类型
- Body: 支持任何格式
- Forward Format: HTTP反向代理,包括web socket
- Path:
/[service]
- Resolver: 请求解析器,路径会被解析成服务名
- Configure: 配置,在启动时指定
--handler=web
或在启动命令前指定环境变量MICRO_API_HANDLER=web
RPC endpoint
/rpc端点允许绕过主handler,然后与任何服务直接会话。
- 请求参数
service
- 指定服务名method
- 指定方法名request
- 请求body体address
- 可选,指定特定的目标主机地址
示例:
1 | curl -d 'service=go.micro.srv.greeter' \ |
更多信息查看可运行的示例:github.com/micro/examples/api
Resolver
请求路径解析器
解析器,Micro使用命名空间与HTTP请求路径来动态路由到具体的服务。
API命名的空间是go.micro.api
。可以通过指令--namespace
或者环境变量MICRO_NAMESPACE=
设置命名空间。
下面说一下解析器是如何使用的:
RPC Resolver
RPC解析器示例中的RPC服务有名称与方法,分别是go.micro.api.greeter
,Greeter.Hello
。
URL会被解析成以下几部分:
路径 | 服务 | 方法 |
---|---|---|
/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 |
Proxy Resolver
代理解析器只处理服务名,所以处理方案和RPC解析器有点不太一样。
URL会被解析成以下几部分:
路径 | 服务 | 方法 |
---|---|---|
/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 |