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 MicroMUCP 协议之上的透明代理. 将服务发现, 负载平衡, 消息编码, 中间件, 传输和代理插件放置到一起. 可独立或与服务一起运行.
  • 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]

results matching ""

    No results matching ""