微服务架构
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
micro new
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 可部署文件
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
2、panic: qtls.ConnectionState not compatible with tls.ConnectionState
将 go 降级至1.12或1.13,重装安装 go-micro(删除 bin 目录下的 micro 可执行文件)
1.13设置代理
3、Registry consul not found
或micro api malformed HTTP response “\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00@\x00″
4、undefined: balancer.PickOptions
5、”detail”: “service not found”, “status”: “Internal Server Error”
将注册的微服务namespace修改为go.micro.api