1. 概述
前言: Micro 是微服务开发的运行时
2. 概述
Micro 解决了构建可扩展系统的关键要求. 它采用微服务体系结构模式并将其转换为一组工具, 作为平台的构建基块. Micro 处理分布式系统的复杂性, 并提供开发人员已经理解的简单抽象.
技术在不断发展. 基础结构堆栈总是在变化. Micro 是一个可插拔的工具包, 可以解决这些问题. 插入任何堆栈或底层技术. 使用 micro 构建面向未来的系统.
2.1. 特性
运行时由以下功能组成:
- API Gateway: 使用具有服务发现的动态请求路由的单个 http 入口点. API 网关允许您在后端构建可扩展的微服务体系结构, 并在前端合并公共接口. micro api 通过发现和可插拔处理程序提供强大的路由为 http, grpc, websocket, publish events 等提供服务.
- Interactive CLI: 一个用于描述, 查询和直接从终端与您的平台和服务进行交互的命令行接口. CLI 为您提供了所有预期的命令, 以了解您的微服务发生了什么. 它还包括一个交互式模式.
- Service Proxy: 建立在 Go Micro 和 MUCP 协议之上的透明代理. 将服务发现, 负载平衡, 消息编码, 中间件, 传输和代理插件放置到一起. 可独立或与服务一起运行.
- Service Templates: 生成新的服务模板以快速入门. Micro 提供用于编写微服务的预定义模板. 始终以相同的方式启动, 构建相同的服务以提高工作效率.
- SlackOps Bot: 在您的平台上运行的机器人, 允许您从 Slack 本身管理应用程序. micro bot 支持 ChatOps 使您能够通过消息传送与您的团队一起完成所有事情. 它还包括创建可动态发现的 slack 命令服务力.
- Web Dashboard: Web 仪表板允许您浏览服务, 描述其终结点, 请求和响应格式, 甚至直接查询它们. 仪表板还包括内置命令行接口的体验, 适用于希望动态进入终端的开发人员.
2.2. 安装 Micro
go get github.com/micro/micro/v2
或通过 Docker
docker pull micro/micro
最新版本二进制文件
# MacOS
curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash
# Linux
wget -q https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
# Windows
powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"
2.3. 依赖
Micro 运行时有两个依赖项:
2.4. 服务发现
服务发现用于名称解析, 路由和集中元数据. 所有服务都在发现中注册, 以便其他服务都可以找到它们.
Micro 使用 go-micro 注册表接口进行服务发现. 多播 DNS 是默认实现. 启用了零配置, 因此您不必为本地开发调整任何内容. 如果您使用的是 docker, kubernetes 或需要更有弹性的东西, 我们的建议是 etcd.
2.4.1. Etcd
Etcd 是一种高可用的服务发现机制
# install
brew install etcd
# run
etcd
通过任意命令输入 --registry=etcd
或设置环境变量 MICRO_REGISTRY=consul
# Use flag
micro --registry=etcd list services
# Use env var
MICRO_REGISTRY=etcd micro list services`
当不在同一主机上时可以通过以下命令指定 etcd 服务的地址
MICRO_REGISTRY_ADDRESS=10.0.0.1:2379
有关更多服务发现插件, 可参阅 go-plugins.
2.5. Protobuf
Protobuf 用于代码生成. 它减少了需要编写的样板代码量.
# 安装 protobuf
brew install protobuf
# 安装 protoc-gen-go
go get github.com/golang/protobuf/{proto,protoc-gen-go}
# 安装 protoc-gen-micro
go get github.com/micro/micro/v2/cmd/protoc-gen-micro@master
可参阅 protoc-gen-micro 查看更多信息
2.6. 编写服务
Micro 包括新的模板生成, 以加快编写应用程序
可参阅 go-micro 获取更多的编写服务的内容
2.6.1. 生成模板
这里我们将使用 micro new
指定 $GOPATH 的相对路径
micro new github.com/micro/example
该命令将输出
example/
Dockerfile # A template docker file
README.md # A readme with command used
handler/ # Example rpc handler
main.go # The main Go program
proto/ # Protobuf directory
subscriber/ # Example pubsub Subscriber
使用 protoc 编译 protobuf 代码
protoc --proto_path=. --micro_out=. --go_out=. proto/example/example.proto
现在可以像其他任何应用程序一样运行
# 运行 micro service
micro server
# 进入到你的服务目录
cd github.com/micro/example
# 运行服务器
micro run --server .
2.7. 示例
现在我们有一个使用 micro new
模板生成的应用程序, 让我们测试一下.
2.7.1. 列出服务
每个服务都注册了服务发现, 因此我们可以找到它.
micro list services
输出
etcd
go.micro.srv.example
topic:topic.go.micro.srv.example
示例应用注册的完全限定名为 go.micro.srv.example
2.7.2. 获取服务
每个服务都使用唯一编号, 地址和元数据进行注册.
micro get service go.micro.srv.example
输出
service go.micro.srv.example
version latest
ID Address Port Metadata
go.micro.srv.example-437d1277-303b-11e8-9be9-f40f242f6897 192.168.1.65 53545 transport=http,broker=http,server=rpc,registry=etcd
Endpoint: Example.Call
Metadata: stream=false
Request: {
name string
}
Response: {
msg string
}
Endpoint: Example.PingPong
Metadata: stream=true
Request: {}
Response: {}
Endpoint: Example.Stream
Metadata: stream=true
Request: {}
Response: {}
Endpoint: Func
Metadata: subscriber=true,topic=topic.go.micro.srv.example
Request: {
say string
}
Response: {}
Endpoint: Example.Handle
Metadata: subscriber=true,topic=topic.go.micro.srv.example
Request: {
say string
}
Response: {}
2.7.3. 调用服务
通过 CLI 进行 RPC 调用. 查询作为 json 发送.
micro call go.micro.srv.example Example.Call '{"name": "John"}'
输出
{
"msg": "Hello John"
}
可参阅 cli 文档 查看更多详细信息.
现在让我们测试一下通过 HTTP 调用服务.
2.7.4. 运行 API
micro api 是一个 http 网关, 可动态路由到后端服务
让我们运行它, 以便我们可以查询示例服务.
MICRO_API_HANDLER=rpc
MICRO_API_NAMESPACE=go.micro.srv
micro api
一些信息:
MICRO_API_HANDLER
设置 http 处理程序MICRO_API_NAMESPACE
设置服务命名空间
2.7.5. 调用 API
使用 json 向 api 发出 POST 请求
curl -XPOST -H 'Content-Type: application/json' -d '{"name": "John"}' http://localhost:8080/example/call
输出
{"msg":"Hello John"}
可参阅 api 文档 查看更多详细信息.
2.8. 插件
Micro 建立在 go-micro 之上, 使其成为可插拔的工具包.
Go-micro 为分布式系统基础结构提供抽象, 可以置换这些基础结构.
2.8.1. 可插拔功能
可插拔的 micro 功能有:
- broker - 发布订阅消息经纪人
- registry - 服务发现
- selector - 客户端负载均衡
- transport - 请求-响应或双向流
- client - 管理上述功能的客户端
- server - 管理上述功能的服务器
可在 go-plugins 找到更多插件
2.8.2. 使用插件
只需将它们链接到单独的文件中, 即可集成 go-micro 插件
首先创建 plugins.go 文件
import (
// etcd v3 registry
_ "github.com/micro/go-plugins/registry/etcdv3"
// nats transport
_ "github.com/micro/go-plugins/transport/nats"
// kafka broker
_ "github.com/micro/go-plugins/broker/kafka"
)
2.8.3. 构建二进制
使用 Go 工具链重建 micro 的二进制可执行文件
# 本地使用
go build -i -o micro ./main.go ./plugins.go
# 用于 docker 镜像
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro ./main.go ./plugins.go
2.8.4. 启用插件
使用命令行标志或环境变量启用插件
# 变量标志
micro --registry=etcdv3 --transport=nats --broker=kafka [command]
# 环境变量
MICRO_REGISTRY=etcdv3 MICRO_TRANSPORT=nats MICRO_BROKER=kafka micro [command]