概念
什么是微服务
把一个巨大的整块功能切分为更小的可管理的独立的服务,这些服务之间通过 language agnostic protocols交流,每个服务专精一件事。
一些定义:
1.解耦
2.一种 将开发一个程序当做一系列小型服务,每个独立运行,互相之间以轻量机制联系的方法。
微服务概念并不新,这个是重新面向服务重新构想的构架,但更全方位地与unix process和pipes校准
微服务构架哲学:
1. Do one thing and do it well
2. 拥抱自动化部署、测试。
3. 拥抱失败和错误
微服务的优点
- 更改规模更容易
- 易于理解
- 频繁部署新版本更容易
- 加强容错率和故障隔离
- 加快执行时间
- 服务重用及快速制作模型
架构
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 服务跑起来
- consul
consul agent -dev
服务发现, go-micro依赖于它。 - srv
go run srv/main.go
go.micro.srv.greeter rpc服务 - client
- cli
go run cli/main.go
- web
./micro web
go run web/web.go
- http://localhost:8082/greeter
- api
./micro api
go run api/api.go
curl http://localhost:8080/greeter/say/hello?name=John
- sidecar
./micro sidecar
curl -H 'Content-Type: application/json' -d '{"name": "john"}' http://localhost:8081/greeter/say/hello
- cli
How to write a service
模仿Greeter,以City为例
ref:https://studygolang.com/articles/11520
创建 city.proto文件
参考proto3,
生成 .pub.go文件 和 .micro.go文件
- 安装
protocol
的compilerprotoc
, 在这里下载 - 安装
protoc-gen-go
,运行go get -u github.com/golang/protobuf/protoc-gen-go
,protoc-gen-go
会默认存在$GOPATH/bin
下,这样protoc就可以找得到了 - 安装
protoc-gen-micro
,运行go get -u github.com/micro/protoc-gen-micro
. - 生成。在写好的 .proto 文件夹下运行
protoc --micro_out=. --go_out=. greeter.proto
,即可。