微服务架构
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
https://www.elastic.co/downloads/past-releases
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 |
K8S 核心组件
- 集群管理入口:kube-apiserver
- 管理控制中心:kube-controller-manager
- 副本控制器:Replication Controller
- 节点控制器:Node Controller
- 资源控制器:ResourceQuota Controller
- 命名空间控制器:Namespace Controller
- Endpoints 控制器:Endpoints Controller
- 服务控制器:Service Controller
- 调度器:kube-scheduler
- 配置中心:etcd
- 集群管理工具:kubectl
- 节点 POD 管家:kubelet
- 服务外部代理:kube-proxy
Kompose 转化 docker-compose文件为 Kubernetes 可部署文件
1 2 |
kompose -f xxx.yml covert kubectl apply -f *.yml # 从转化的文件部署资源文件 |
kubectl 常用命令
- 命令式资源管理
- create 创建资源
- expose 暴露资源
- scale 扩展资源
- annotate 添加备注
- label 标签
- delete 删除资源
- 资源查看
- get 显示一个或多个资源的详细信息
- describe 聚合相关资源信息进行显示,较get 丰富
- 容器管理
- log 查看容器日志
- exec 执行命令
- cp 从容器与物理机进行文件拷贝
k8s 常用资源类型简写
- ing:ingress
- no: 集群nodes节点
- ns:namespace 命名空间
- rs:replicasets
- svc:services 服务
- ep:endpoints
常见问题
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 |
3、Registry consul not found
或micro api malformed HTTP response “\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00@\x00″
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import ( _ "github.com/micro/go-plugins/registry/consul/v2" "github.com/micro/micro/v2/cmd" ) /* micro v2 不再支持 --registry consul 执行:go build -o micro 再使用 micro --registry=consul --registry_address=127.0.0.1:8500 --api_handler=api api...执行命令 */ func main() { cmd.Init() } |
4、undefined: balancer.PickOptions
1 2 |
# go.mod replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 |
5、”detail”: “service not found”, “status”: “Internal Server Error”
将注册的微服务namespace修改为go.micro.api
1 2 |
micro.NewService( micro.Name("go.micro.api.xxx")) |