微服务架构痛点
业务关注服务之间通信
会导致业务迭代速度变慢
微服务架构1.0
![](https://imgkr2.cn-bj.ufileos.com/876e640f-9d19-4306-a5a6-b268944310ee.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=K7VIXogWCM2bpEj58ednSQaPOvU%253D&Expires=1615256941)
网关层1个、业务逻辑层多个、数据访问层多个、DB/Cache多个,注册中心、配置中心
微服务2.0架构-服务网格
![](https://imgkr2.cn-bj.ufileos.com/0b901c9e-ac00-4545-995f-eeab02d84e78.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=n62BGo4CI8o1g%252Fanch2Nz%252FcDDGQ%253D&Expires=1615257035)
基础设施升级困难
影响基础设施团队的交付能力和交付速度
因为应用程序通过jar包方式引入通信组件
通信组件升级需要应用程序配合jar包版本升级
![](https://imgkr2.cn-bj.ufileos.com/2f435e60-6255-4576-bd11-4fe31b136dae.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gh0xNJBiKGRgki%252FvtjzVj2qPDyM%253D&Expires=1615257196)
多编程语言之间'通信'问题
业务每种语言一套基础设施 成本大
![](https://imgkr2.cn-bj.ufileos.com/c1421a87-424c-4865-861d-69aa6b67b3ad.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Qw6savi%252BoMKv8KUldvYEIHR0SXA%253D&Expires=1615257304)
微服务架构演进
![](https://imgkr2.cn-bj.ufileos.com/7760658d-d4eb-47a9-a0ad-ac2517a89a0a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=GvxxOdVbVwN%252F3PLinJYeII4DHpM%253D&Expires=1615257326)
服务网格定义
![](https://imgkr2.cn-bj.ufileos.com/a392c0dc-34cc-4a4d-9487-a52b8dc40fdd.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=zbhOTftBLMX01%252FpET2IE2sUcxPU%253D&Expires=1615257351)
服务网格架构
![](https://imgkr2.cn-bj.ufileos.com/b3f1ac88-72e7-49e7-b323-d7c0ab5e5485.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=G6skzr6z%252BIo2sLxPtG2%252ByCgh06E%253D&Expires=1615257456)
带来的问题-链路会变长
性能里面的RT 平均响应延迟会变高
但本机之间即应用程序放到本机的sidecar损耗不会超过1毫秒
开源框架
最早版本linkerd
![](https://imgkr2.cn-bj.ufileos.com/64433df4-ff2c-4b77-bb22-0a79f189f1a4.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=wP5ytA7f2cCT4ZQCP88FzDOu1f4%253D&Expires=1615257724)
应用程序和sidecar之间通讯用tcp或http1.1以上都可以;两者需要保持长连接
istio
![](https://imgkr2.cn-bj.ufileos.com/11dd4cec-dd6d-4dfa-b73e-ce14c7ffd988.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Q52hJ7GFzxR7ONdA3CVf8EttJBA%253D&Expires=1615257977)
-
Pilot
控制中心
1、控制proxy之间通讯
2、负载均衡
-
Mixer
数据收集服务:
proxy之间通讯完之后 要上报一些mertics信息 (耗时、请求次数)
全部同步上报
集中式 不靠谱
它的性能影响proxy本身的性能
-
Citadel
做鉴权安全相关的
proxy之间权限鉴权比如TLS、SSL
sofa mesh
蚂蚁金服开源
架构
![](https://imgkr2.cn-bj.ufileos.com/da7f7556-6cea-42bf-ae98-b6d3738c897c.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=0PVHbR1Wawy6%252FzbjZo%252FYE03Hipk%253D&Expires=1615258274)
1、将istio中的proxy重写
isotio proxy是用c++写的
sofa用go重写
2、istio数据收集节点是集中式的 sofa是分布式的即每个proxy中都有一个mixer
3、目前还没有公司大规模在用 社区不活跃 建议使用istio
新浪weibo mesh
![](https://imgkr2.cn-bj.ufileos.com/f92b480c-9edc-4da0-8880-296cb89b836f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=bjlvH3PSeaSM56V7ACBHfoZtHdY%253D&Expires=1615258601)
服务网格做什么
![](https://imgkr2.cn-bj.ufileos.com/13d120c8-2aa3-40ab-b79d-b201d4ed8ab9.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=0vr%252B4EjiJRsGFAI%252BoWSDtZzoEl8%253D&Expires=1615258624)
如何选型
![](https://imgkr2.cn-bj.ufileos.com/d36cc2a8-db65-4e05-9248-32eb6456682e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=G4farEC2p2vw1LdN8i88Jx7c92s%253D&Expires=1615258650)
1、业务升级代价太高 要让业务的升级成本降低到0 要兼容所有rpc用法 所以自研
2、期望的是业务方只需要将rpc jar包换成这个rpc mesh jar包就行了
自研思路
![](https://imgkr2.cn-bj.ufileos.com/d909c75b-19d5-43ec-bda2-bc8acf89f444.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Tt8j0VJ%252FrCGaXOPWlR9d09hvpR0%253D&Expires=1615258716)
1、要兼容传统(物理机、虚拟机)和云
2、控制中心包括服务管理平台和数据收集中心
架构设计
![](https://imgkr2.cn-bj.ufileos.com/5bf60fab-f46b-41de-a49f-864561cf0f8a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=%252FYpZGvehpdk1gC%252BNxBkJH49dLn0%253D&Expires=1615260346)
1、数据收集中心:
a、Metric:收集耗时、响应情况
b、Trace:分布式请求跟踪系统APM
c、Alarm:报警功能
2、Protocol
a、RPC:兼容老的RPC协议
b、mesh包括通讯协议(http1.1和2.0)和数据协议(protobuff)
(注:http1.0不支持 因为是短连接;http1.1和http2.0支持keep alive长连接;tpc是长连接;连接还在 server短可以直接推送消息给client)
2、sidecar之间的健康检查没有通过注册中心而是本身
总体流程
![](https://imgkr2.cn-bj.ufileos.com/29372554-09ba-4869-9db2-55147718b781.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=QslT3GF4bxYvuKtC5OjHm6Bo7O4%253D&Expires=1615261111)
用户发起一个熔断服务B的指令
![](https://imgkr2.cn-bj.ufileos.com/a424af9b-7c8f-4b04-92d5-a241c1751f1e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=3N%252F2soEIe7CvtpbWfm6GWHQsj0U%253D&Expires=1615261482)
1、服务管理平台、控制中心、数据收集中心都是现成的服务(之前文章介绍过)那么自研Service Mesh只需要实现proxy就可以了
2、之前Service和Proxy是一个进程
现在需要修改成2个独立的进程即可
3、将二者放到同一个pod中
如果sidecar挂了对整体是否有影响?
没有影响。
![](https://imgkr2.cn-bj.ufileos.com/39ef7fb6-9b42-41ff-9228-45871f8dab9a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=KWupMlXMvyxmrK50gKREePZ6n2A%253D&Expires=1615262193)
sidecar挂掉 pod如何处理?
如果sidecar挂掉了 就会被监控到 直接把当前pod杀死就行了 k8s会自动重启一个pod
2个应用程序放在同一个物理机上架构怎样?
![](https://imgkr2.cn-bj.ufileos.com/a67eae4c-d88f-41b5-bfa0-17b5644d599b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8SGeM54dvraaag94EI%252F41JmgRYc%253D&Expires=1615262949)
漂移
1、日志漂移
服务器1上有服务1生成日志1
如果服务器1上面的服务1挂了
在服务器2上启动服务2生成日志2
如果日志1和日志2有强依赖关系
那么必须得在服务器1上启动服务1继续在日志1的基础上生成日志
2、重试漂移
pod如果挂了 再次重启 那么ip就会改变
重试漂移到云上任何节点都没有关系
完整流程图
这个完整的流程图涵盖了
DNS、CDN、Nginx、FastDFS(或Ceph)、
LVS、ServiceMash、数据收集中心、
注册中心、控制中心、网关、业务逻辑层、
数据访问层、存储层等数据交互过程
价值不菲 想要的话
可以添加我微信15900411193
调用链路
![](https://imgkr2.cn-bj.ufileos.com/5c4fe1a2-1b75-493b-8599-043634b66aa9.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=BXJHWVZRJLYGbVXEKhBsPoq1ano%253D&Expires=1615263712)
1、做协议解析的目的是兼容老的协议
客户端发出请求后 在客户端service和服务方service要做协议解析
如果都是mesh协议 是不需要协议解析的、协议封装也不需要
2、客户端一定要做序列化、反序列化 这和通讯没啥关系 就是一个数据包
调用方时序图
![](https://imgkr2.cn-bj.ufileos.com/40eb4720-5483-4814-9e9a-d02f7d190097.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=o%252BxRRB7kYjbZIw%252F9govxVTfliuY%253D&Expires=1615264514)
服务方时序图
![](https://imgkr2.cn-bj.ufileos.com/9586cd5e-b394-44a5-90a1-6300ae37e6ad.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=0aKWtKYIkqstkOT9rSO%252F%252FrgEoyo%253D&Expires=1615273350)
缓存管理 多个Map:
服务方提供哪些函数调用 通过扫描jar包 反射机制 获取服务提供的类名和方法名
协议设计
数据协议
1、Protocol Buffer
2、分割符、版本号、Mesh消息构成
![](https://imgkr2.cn-bj.ufileos.com/5c68452e-ea3f-40eb-ab66-9adec82b8d04.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=FoRhiTN1C84r8UD282YBzZiqvCo%253D&Expires=1615273500)
1、一次传输协议中有版本号
比如 版本号1表示rpc协议
版本号2表示mesh协议
通过版本号可以区分兼容老协议还是新协议
2、多个数据包之间通过头和尾分割符分开
3、分割符占5个字节
Mesh通讯协议
1、TCP长连接
2、Http1.1或2.0
混合云部署
1、调用方
a、SideCar+Service(Mesh)
b、Service(RPC)
2、服务方
a、SideCar+Service(Mesh)
b、Service(RPC)
访问流程
![](https://imgkr2.cn-bj.ufileos.com/af2fd09b-f0c6-4154-aeaa-110a2ff5ca7e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=6V1UwBZBr9aDjhpYsIPliMiz7xE%253D&Expires=1615273681)
1、在服务启动的时候 mesh服务或普通的RPC服务都会去注册中心注册 此时就知道了该节点的服务类型
2、调用方下拉服务信息 也就知道了提供方服务类型 然后选择不同的协议去调用
小细节
1、熔断放在mesh里面做 不需要业务方参与
2、下游重试次数是一样的 是服务粒度 非接口粒度
3、proxy(mesh)之间做健康检测 是分布式的 一旦发现自己的上游或下游出现了问题 就更新本地的路由表
4、负载均衡算法:Random、RR、Hash(主要用一致性hash来做)
(RR:(循环负载)
第一次请求路由到第一个节点,
第二次请求路由到第二个节点,
第三次请求路由到第三个节点,
第四次请求路由到第一个节点
....)
架构未来
2平台1中心1趋势
service mesh平台与业务解耦
容器云弹性平台
服务治理平台(控制中心、注册中心、数据收集中心)
人工智能(AI)
![](https://imgkr2.cn-bj.ufileos.com/409404a0-3abe-49df-8a03-77d395c3730f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=g%252BZmu1Yngy0hcXcN1dcypNM2YKg%253D&Expires=1615278509)
服务管理平台的调用关系-数据收集存储方法
服务方-调用方角度
![](https://imgkr2.cn-bj.ufileos.com/81c862e3-c4e5-4155-855f-e2a223979279.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=RLncjZtWv07bqCw7%252FtJpbFH2s%252F4%253D&Expires=1615276163)
服务方:1分钟500万条记录
调用方:50万
共550万
存储方案
方案1
![](https://imgkr2.cn-bj.ufileos.com/62e45b46-757a-427d-a815-1b540b3abe08.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=UKdGGXCmuzab9DuVZA0orjj0a5g%253D&Expires=1615276328)
方案二
重复数据提取出来作为元数据
![](https://imgkr2.cn-bj.ufileos.com/2a816d38-217f-4e62-92f2-cb5a0c7df6fe.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=ViNVBr0qH9SpoXhhZWvaXBj%252FKmo%253D&Expires=1615276348)
方案三
实际调用流量仅为方案1的1/10
![](https://imgkr2.cn-bj.ufileos.com/cf3391d9-adb5-4334-94c3-a9f60402884e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gJ%252BAlgTDI9Su6POq5IN0grBW%252FzQ%253D&Expires=1615276392)
、