Total Pageviews

Tuesday 31 March 2020

Golang 微服务框架系列 - 1, Micro 框架使用方式以及架构

Micro 介绍

Micro 是一个工具集合,通过将微服务架构抽象成一组工具。隐藏了分布式系统的复杂性,为开发人员提供了更简洁的概念。

组成

Micro 主要有三部分组成:
go-micro - 开发 sdk, 包含了 RPC 框架,服务发现,消息订阅 / 发布 等功能.
go-plugins - micro 插件
micro - Micro 提供的管理工具,包含了 API 网关,仪表盘,RPC 代理等功能.

go-micro

Micro 的主要开发 SDK, 里面包含了开发所用到的常用功能模块,主要模块之间关系如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (img-aMoGDYQl-1585099608719)(https://micro.mu/docs/images/go-micro.png)]
模块说明
services微服务,提供了对微服务功能开发的封装,通过它可以快速创建一个微服务.
clientRPC 客户端,提供了诸如 服务发现 / 负载均衡 / RPC 代理和调用。以及失败时的重试 / 超时 / 上下文等功能。
serverRPC 服务端,提供了如何实现 RPC 请求的方法,功能逻辑主要使用这个实现.
codec数据编码 模块,提供将程序调用数据转换成 RPC 调用数据的功能。目前支持: json /protobuf
brokerpub/sub 模块,提供事件 发布 / 订阅 功能,目前支持: nats /rabbitmq/http (开发)
transport数据传输 模块,通过抽象实现对传输协议的无缝替换。目前支持: http /rabbitmq/nats
regediry服务发现 模块,提供 集群的服务发现功能,目前支持: consul /etcd/memory /kubernetes
selector负载均衡 模块,当 client 发出请求时,它负责在多个满足条件的服务器列表中决定使用哪个服务器,目前支持:循环 / 哈希 / 黑名单

go-plugins

没研究…

micro 工具

micro 工具 是 Micro 提供的一个管理工具,主要分为以下几个功能:
命令说明
apiAPI 网关,将 HTTP 请求转换为 RPC 并转发给相应的服务。
webmicro 提供了一个默认管理界面,并且已 HTTP 方式提供了 对 srv 服务的代理。
new生成模板代码,帮助你快速创建项目.
cli可以通过命令行来和 micro 交互.
bot机器人?具体的还没有接触
proxy代理?还没研究清楚

micro-api

API 网关或代理,将 HTTP 请求转换为 RPC 并转发给相应的服务。以便使用一个入口点来访问微服务.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (img-WUJkzbR1-1585099608728)(https://micro.mu/docs/images/api.png)]
使用入门:
  • 安装

1
go get -u github.com/micro/micro

  • 运行
    1
    micro api
使用 ACME
需要设置环境变量: MICRO_ENABLE_ACME=true

1
2
3
4
5
6
7
8
9
10
linux:
 MICRO_ENABLE_ACME=true micro api
windows:
 set MICRO_ENABLE_ACME=true && micro api
 
也可以指定主机白名单:
linux:
 MICRO_ENABLE_ACME=true \
 MICRO_ACME_HOSTS=example.com,api.example.com \
 micro api

开启 HTTPS
需要设置环境变量: MICRO_ENABLE_TLS=true

1
2
3
4
5
linux:
 MICRO_ENABLE_TLS=true \
 MICRO_TLS_CERT_FILE=/path/to/cert \
 MICRO_TLS_KEY_FILE=/path/to/key \
 micro api

设置命名空间
默认名称空间为 go.micro.api, 名称空间和路径用于解析服务名称 / 方法

1
2
linux:
 MICRO_NAMESPACE=com.example.api micro api

micro-web

提供了一个仪表盘以及对服务的查看和查询功能。并且提供了一个对 rpc 的反向代理.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (img-vQfc6Q2z-1585099608729)(https://micro.mu/docs/images/web.png)]
API:

1
2
3
4
- / (UI)      - 仪表盘
- / rpc       - RPC 代理
- / stats     - 相关统计信息
- / [service] - 查看和查询服务

使用入门:
  • 安装

1
go get github.com/micro/micro

  • 运行
通常

1
micro web

使用 ACME 加密

1
2
3
micro --enable_acme web
也可以指定主机白名单:
micro --enable_acme --acme_hosts=example.com,web.example.com web

开启 HTTPS

1
micro --enable_tls --tls_cert_file=/path/to/cert --tls_key_file=/path/to/key web

修改默认命名空间
默认名称空间为 go.micro.web , 名称空间和路径用于确定反向代理代理的目标

1
micro web --namespace=com.example.web

开启统计功能
可以通过 –enable_stats 标志启用统计信息,通过 /stats 访问

1
micro --enable_stats web

在 Micro 架构中,一个完整的请求流程是这样的:
api-gateway => [customer-api | customer-web ] => customer-srv
其中 api-gateway 是 有 micro 工具直接提供的,customer-(api | web | srv) 则是 micro 中的开发概念.
在 micro 中,服务分为三种类型.
名称说明
srvsrv 是标准的 RPC 服务,也可以叫做后端服务,开发人员通常写的就是这种类型。在 Micro 的设想中,这一服务永远不会面向用户,属于内部服务.
api提供 HTTP 到 RPC 的转换服务,API 网关默认情况下会将请求转发给它来处理.
webMicro 认为 web 也可以当做微服务来创建

请求处理流程


Golang 微服务框架系列 - 2, Micro 框架的安装以及运行示例

Micro 介绍

Micro 是一个工具集合,通过将微服务架构抽象成一组工具。隐藏了分布式系统的复杂性,为开发人员提供了更简洁的概念。

依赖关系

通常 micro 会依赖两个项目
  1. consul - 服务发现
  2. protoc-gen-micro - 代码生成
consul 安装运行:

1
2
3
4
source:
 go get -u -v github.com/hashicorp/consul && consul agent -dev
docker:
 docker run consul

protoc-gen-micro 安装:

1
go get -u -v github.com/micro/protoc-gen-micro

开发环境

  • 开发微服务的框架:
    1
    go get -u -v github.com/micro/go-micro
  • 管理工具:
    1
    2
    3
    4
    source:
     go get -u -v github.com/micro/micro
    docker:
     docker pull microhq/micro

运行示例

  • 获取示例源码:

1
go get -u -v github.com/micro/examples

  • 运行 greeter 示例服务:
    –registry_address=127.0.0.1:8500 用来指定服务发现的地址,就是上面的 consul 的地址,consul 默认端口是 8500
    1
    go get github.com/micro/examples/greeter/srv && srv --registry_address=127.0.0.1:8500
  • 通过命令行验证:
获取服务列表
–registry_address=127.0.0.1:8500 用来指定服务发现的地址,就是上面的 consul 的地址,consul 默认端口是 8500

1
2
3
$ micro --registry_address=127.0.0.1:8500 list services
consul
go.micro.srv.greeter

获取服务详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ micro get service go.micro.srv.greeter
service  go.micro.srv.greeter

version 1.0.0

Id Address Port Metadata
go.micro.srv.greeter-34c55534-368b-11e6-b732-68a86d0d36b6 192.168.1.66 62525 server=rpc,registry=consul,transport=http,broker=http

Endpoint: Say.Hello
Metadata: stream=false

Request: {
 name string
}

Response: {
 msg string
}

尝试调用服务

1
2
3
4
$ micro query go.micro.srv.greeter Say.Hello '{"name": "John"}'
{
 "msg": "Hello John"
}


Golang 微服务框架系列 - 3, 使用 Micro 框架生成并编译运行第一个 srv服务


Micro 介绍

Micro 是一个工具集合,通过将微服务架构抽象成一组工具。隐藏了分布式系统的复杂性,为开发人员提供了更简洁的概念。

通过 micro 创建项目:

1
2
3
4
micro new --type "srv" \
          --namespace "com.test" \
          --alias "first_srv" \
          github.com/micro/examples/first_srv
命令会生成一个 工程目录,包含了一些通用代码,目录结构:
1
2
3
4
5
6
7
8
9
10
11
├── main.go
├── plugin.go
├── handler
│   └── example.go
├── subscriber
│   └── example.go
├── proto\example
│   └── example.proto
├── Dockerfile
├── Makefile
└── README.md

安装 protobuf:

  1. 去 https://github.com/google/protobuf/releases 下载对应平台的 protobuf 包
  2. 把 bin 目录添加到 PATH 环境变量中.
  3. 在命令行中运行 protoc , 如果提示命令未找到检查 protobuf 是否安装成功.

安装 protobuf 代码生成相关库:

1
2
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro

通过 proto 文件生成 go 代码:

1
2
cd $GOPATH\src\github.com\micro\examples\first_srv
protoc --go_out=. --micro_out=. proto/example/example.proto

运行:

1
2
3
4
$ go build github.com/micro/examples/first_srv && first_srv
2018/06/17 13:26:13 Listening on [::]:9040
2018/06/17 13:26:13 Broker Listening on [::]:9041
2018/06/17 13:26:13 Registering node: com.test.srv.first_srv-f325ad49-71ee-11e8-a4a2-7054d2dea53d
由于使用的是服务发现,所以上面打印的端口在你机器上可能不一样,因为端口是随机的,但不影响正常运行.