微服务架构
Martin Fowler
- 一组小的服务
- 独立的进程
- 轻量级通信
- 基于业务能力
- 独立部署
- 无集中式管理
Loosely coupled service oriented architecture(SOA) with bounded context
DDD – Domain Driven Design
– 决定软件复杂性的是设计方法
- 有助于指导我们确定系统边界
- 能够聚焦在系统核心元素上
- 帮助我们拆分系统
DDD 域微服务四层架构
微服务架构
微服务设计原则
- 领域驱动设计,不是数据驱动设计,也不是界面驱动设计
- 要边界清晰的微服务,而不是泥球小单体
- 要职能清晰的分层,而不是什么都放的大箩筐
- 要做自己能hold住的微服务,而不是过度拆分的微服务
康威定律(Conway’s Law)
Docker 应用场景
- 构建运行环境
- 微服务
- CI/CD
Docker常用命令
- 仓库操作:pull, push
- 镜像管理:images, rmi, build
- 生命周期管理:run, start. stop, rm
go-micro:gRPC和 ProtoBuf
RPC
简单、通用、高效
- RPC代指远程过程调用(Remote Procedure Call)
- 包含了传输协议和编码(对象序列号)协议
- 允许运行于一台计算机的程序调用另一台计算机的子程序
gRPC
- gRPC是一个高性能、开源、通用的 RPC 框架
- 基于 HTTP2.0协议标准设计开发
- 支持多语言,默认采用 Protocol Buffers 数据序列化协议
Protocol Buffers
- 是一种轻便高效的序列化结构化数据的协议
- 通常用在存储数据和需要远程数据通信的程序上
- 跨语言,更小、更快、更简单
- 加速站点之间数据传输速度
- 解决数据传输不规范问题
常用概念
- Message定义:描述了一个请求或响应的消息格式
- 字段标识:消息的定义中,每个字段都有一个唯一的数值标签
- 常用数据类型:double, float, int32/64, bool, string, bytes
- Service服务定义:在 Service 中可以定义一个 RPC服务接口
Protocol Buffers Message 中字段修饰符
- singular;表示成员有0个或者一个,一般省略不写
- repeated:表示该字段可以包含0~N个元素
.proto类型 | Java类型 | C++类型 | Go语言类型 | 备注 |
---|---|---|---|---|
double | double | double | float64 | |
float | float | float | float32 | |
int32 | int | int | int32 | 可变长编码方式。编码负数时不够高效,如果字段可能包含负数,可以使用sint32 |
int64 | long | int64 | int64 | 可变长编码方式。编码负数时不够高效,如果字段可能包含负数,使用sint64。 |
uint32 | int[1] | uint32 | uint32 | |
uint64 | uint64 | uint64 | ||
sint32 | int | int32 | int32 | 可变长编码方式,有符号的整形值。编码时比int32效率高。 |
sint64 | long | int64 | int64 | 可变长编码方式,有符号的整形值,编码时比int64效率高。 |
fixed32 | int[1] | uint32 | uint32 | 总是4个字节。如果所有数值均比(2^28)大,该种编码方式比uint32高效。 |
fixed64 | long[1] | uint64 | uint64 | 总是8个字节。如果所有数值均比(2^56)大,此种编码方式比uint64高效。 |
sfixed32 | int | uint32 | int32 | 总是4个字节。 |
sfixed64 | long | uint64 | int64 | 总是8个字节。 |
bool | boolean | bool | bool | |
string | String | String | string |
服务注册:consul, etcd
配置中心:consul, nacos
链路追踪:jaeger (http://localhost:16686)
熔断:hystrix-go CLOSED OPEN HALF_OPEN
- Timeout
- MaxConcurrentRequests
- SleepWindow
- RequestVolumeThreshold
- ErrorPercentThreshold
限流:漏桶算法 ratelimit
负载均衡 roundrobin
微服务网关
监控:Prometheus Grafana
日志:Elasticsearch Logstash Kibana Filebeat
Logstash-Filter 数据中间件处理插件 grok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
docker run --rm -v $(PWD):$(PWD) -w $(PWD) micro/micro new xxx micro new --type=api xxx export GOPROXY="https://goproxy.io" # 自动生成代码文件 protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. xxx.proto # Docker启动单节点 consul docker run -d --name=cs -p 8500:8500 consul agent -server -bootstrap -ui -client 0.0.0.0 # consul 注册和反注册 curl --request PUT --data @p.json localhost:8500/v1/agent/service/register curl --request PUT localhost:8500/v1/agent/service/deregister/userservice # hystrix-dashboard(http://127.0.0.1:9002/hystrix) docker run --name hystrix-dashboard -d -p 9002:9002 mlabouardy/hystrix-dashboard:latest # go 项目打包 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o xxx *.go |
micro new
1 2 |
micro new --type "web" --namespace="alan.web" alan_web micro new --type "service" --namespace="alan.srv" alan_srv # type 默认为 service |
常见问题
1、undefined: resolver.BuildOption…undefined: resolver.ResolveNowOption
1 2 |
go mod edit -require=google.golang.org/grpc@v1.26.0 go get -u -x google.golang.org/grpc@v1.26.0 |
2、panic: qtls.ConnectionState not compatible with tls.ConnectionState
将 go 降级至1.12或1.13,重装安装 go-micro(删除 bin 目录下的 micro 可执行文件)
1 2 |
go get github.com/micro/go-micro/v2 go get github.com/micro/micro/v2 |
1.13设置代理
1 2 |
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct |