go-micro-micro工具包

工具包集合


前篇

micro 是 go-micro 的工具包


安装

  1. 安装 micro 工具包必须先启用 module
    • windows
      • 加入环境变量 GO111MODULE=on
      • 如果Go版本≥1.13,执行以下命令设置全局变量:go env -w GO111MODULE=on
    • Linux docker, goland:1.13.5 镜像已经默认开启.
  2. 下载并编译成可执行程序 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
2
3
4
5
6
F:\go\GoWinEnv_Test01 (master -> origin)
$ micro --enable_stats web // 指令
2019/09/28 15:23:02 HTTP API Listening on [::]:8082 // 默认端口
2019/09/28 15:23:02 Transport [http] Listening on [::]:60676
2019/09/28 15:23:02 Broker [http] Connected to [::]:60677
2019/09/28 15:23:02 Registry [mdns] Registering node: go.micro.web-4832fb75-d027-4b66-a420-09abae8e6ecb

然后打开 http://localhost:8082/registry 就能访问已有的服务

点击 user 查看服务的具体信息


集成 etcd

  1. cd 到 micro 根目录. github.com\micro\micro

  2. 增加一个插件编译文件 plugins.go, 内容如下

    1
    2
    3
    4
    5
    package main

    import (
    _ "github.com/micro/go-plugins/registry/etcdv3"
    )
  3. 编译出可执行程序 mainWithEtcdv3.exe

    1
    $ go build -o mainWithEtcdv3.exe main.go plugins.go

web 查看

  1. 必须得在 micro 中集成 etcd. 参考: [micro 工具包集成 etcd](#micro 工具包集成 etcd). 编译出可执行程序 mainWithEtcdv3.exe

  2. 启动 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
  3. 打开web: http://localhost:8082/registry

    可以看到运行的两个 节点


新建模板

Help

1
2
3
4
5
6
7
8
USAGE:
micro new [command options] [arguments...]

OPTIONS:
--namespace "go.micro" Namespace for the service e.g com.example
--type "srv" Type of service e.g api, srv, web
--fqdn FQDN of service e.g com.example.srv.service (defaults to namespace.type.alias)
--alias Alias is the short name used as part of combined name if specified

简单示例, 新建一个 new_service 微服务模板

1
micro new new_service

生成的服务会被放到 $GOPATH 的相对目录下:


api 网关

micro api提供下面类型的http api接口

1
2
- /[service]/[method]	# HTTP路径式的会被动态地定位到服务上
- /rpc # 显式使用后台服务与方法名直接调用

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 or application/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
2
3
4
curl -d 'service=go.micro.srv.greeter' \
-d 'method=Say.Hello' \
-d 'request={"name": "John"}' \
http://localhost:8080/rpc

使用JSON的方式执行同一请求:

1
2
3
curl -H 'Content-Type: application/json' \
-d '{"service": "go.micro.srv.greeter", "method": "Say.Hello", "request": {"name": "John"}}' \
http://localhost:8080/rpc

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
2
3
4
curl -d 'service=go.micro.srv.greeter' \
-d 'method=Say.Hello' \
-d 'request={"name": "Bob"}' \
http://localhost:8081/rpc

更多信息查看可运行的示例:github.com/micro/examples/api


Resolver

请求路径解析器

解析器,Micro使用命名空间与HTTP请求路径来动态路由到具体的服务。

API命名的空间是go.micro.api。可以通过指令--namespace或者环境变量MICRO_NAMESPACE=设置命名空间。

下面说一下解析器是如何使用的:


RPC Resolver

RPC解析器示例中的RPC服务有名称与方法,分别是go.micro.api.greeterGreeter.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