Go – Micro

概念

什么是微服务

把一个巨大的整块功能切分为更小的可管理的独立的服务,这些服务之间通过 language agnostic protocols交流,每个服务专精一件事。

一些定义:
1.解耦
2.一种 将开发一个程序当做一系列小型服务,每个独立运行,互相之间以轻量机制联系的方法。

微服务概念并不新,这个是重新面向服务重新构想的构架,但更全方位地与unix process和pipes校准

微服务构架哲学:
1. Do one thing and do it well
2. 拥抱自动化部署、测试。
3. 拥抱失败和错误

微服务的优点

  1. 更改规模更容易
  2. 易于理解
  3. 频繁部署新版本更容易
  4. 加强容错率和故障隔离
  5. 加快执行时间
  6. 服务重用及快速制作模型

架构

Micro 为微服务提供基本的建筑结构。目标是简化分布式系统的开发。因为微服务是一种架构模式,Micro通过工具化 进行逻辑化分离责任。

Toolkit

API

API类似网关或代理,允许一个入口访问微服务。它应该允许在你的基础设施的边缘上,将HTTP请求转化为RPC,并转发到相应的服务去。

Web

网页版本的go-micro,允许视觉交互。
包括一种web app的代理。 /[name]/ 可以在registry里将其发送到某个服务。

Sidebar

Sidebar是HTTP接口版的go-micro,可以将其它语言的程序整合进micro环境。

Bot

用不到先不管它

CLI

命令行版的go-micro,提供一种方式可以观察、与运行中的环境互动。

Go Micro

go-micro是一个为微服务提供的独立的RPC框架。它在tookit的核心,被以上所有组件所依赖(使用),

Registry

注册表提供一个可插拔的服务发现库来寻找运行中的服务。目前实现的是 consul, etcd, memory和 kubernetes。如果你想要不同的,接口也很容易实现。

Selector

选择器提供一种通过选择来负载均衡的机制。当一个客户端给一个服务a发出请求,它会先query注册表这个服务a,注册表会返回代表该服务的有关运行中的结点的列表。选择器会选择其中一个结点用来处理请求(querying)。多个请求,选择器将使用负载算法。现在使用的方法有 round robin, random hashed and blacklist。

Broker

代理人 是为pub/sub提供的插件接口。微服务是事件驱动构架,事件的发布、订阅应该是一等公民。目前实现的包括nats, rabbitmq and http (for development).

Transport

传输层,是点对点传输消息的插件接口。目前实现的有http, rabbitmq and nats。这层抽象可使传输层无缝切换。

Client - cli

客户端,用来制作RPC查询,结合了 Registry, Selector, Broker 和 Transport。同时提供重试、时限、上下文使用等。

Server - srv

服务是用来 build一个微服务,为RPC请求提供服务。

FAQ

在哪儿运行micro

aws、google cloud、 mesos或k8t
micro on k8t demo: https://github.com/micro/kubernetes

API, WEB, SRV 服务的区别是什么?

API服务

由micro api提供服务,默认命名空间:go.micro.api

Web服务

由micro web提供服务,默认命名空间:go.micro.web
web apps在微服务世界里应该是一等公民,因此建造web控制面板作为微服务。 micro web是个反向代理,基于到服务的路径解析,将HTTP请求转发到相应的web app

SRV服务

SRV就是独立的RPC服务。一般称其为RPC服务、后端服务,是后端构架的一部分,永远不会对外。
默认命名空间:go.micro.srv
但你应该用你自己的域名 com.example.srv

例子

Greeter用例跑起来

安装consul,把consul跑起来

brew install consul
consul agent -dev

默认端口:8500
http://localhost:8500/

Micro服务跑起来

go.micro.srv.greeter

go run srv/main.go

可以通过客户端访问该服务

go run cli/main.go

结果

Hello John

API服务跑起来

go.micro.api.greeter

go run api/api.go

相当于起了一个新的 go.micro.srv.greeter服务,但是是基于 go.micro.srv.greeter 这个跑的。

micro/micro 要先build

./micro api

通过api请求 api的服务

curl http://localhost:8080/greeter/say/hello?name=John

Web

go run web/web.go
./micro web

请求网页 http://localhost:8082/greeter

Sidecar

micro sidecar

简单总结:

Greeter Example 服务跑起来

  1. consul consul agent -dev 服务发现, go-micro依赖于它。
  2. srv go run srv/main.go go.micro.srv.greeter rpc服务
  3. client
    1. cli go run cli/main.go
    2. web
      1. ./micro web
      2. go run web/web.go
      3. http://localhost:8082/greeter
    3. api
      1. ./micro api
      2. go run api/api.go
      3. curl http://localhost:8080/greeter/say/hello?name=John
    4. sidecar
      1. ./micro sidecar
      2. curl -H 'Content-Type: application/json' -d '{"name": "john"}' http://localhost:8081/greeter/say/hello

How to write a service

模仿Greeter,以City为例

ref:https://studygolang.com/articles/11520

创建 city.proto文件

参考proto3

生成 .pub.go文件 和 .micro.go文件

  1. 安装protocol的compiler protoc在这里下载
  2. 安装protoc-gen-go,运行 go get -u github.com/golang/protobuf/protoc-gen-goprotoc-gen-go会默认存在 $GOPATH/bin下,这样protoc就可以找得到了
  3. 安装protoc-gen-micro,运行 go get -u github.com/micro/protoc-gen-micro.
  4. 生成。在写好的 .proto 文件夹下运行 protoc --micro_out=. --go_out=. greeter.proto ,即可。

References