读-李林峰-分布式服务框架和原理8-13
服务调用
几个误区
- NIO就是异步服务:
- 需要区分通信框架的NIO,不等于上层应用调用的异步,2个完全是不同角度,不是一个层面的事情,即使是底层通信的NIO也可以实现上层同步调用服务的功能;
- NIO的好处:
关于这个看之前那章里面推荐文章。 - 服务调用和通信框架的关系
这里是通过中间的消息队列来实现隔离上层同步异步跟底层通信框架的IO解耦的,现实中会去掉消息队列,使用future模式来实现。
- 服务调用天生就是同步的:
- 现在rpc这么普及,应该不会有人还存在这种观点了吧;
- OneWay模式,只有请求没有应答:
- 请求-应答模式:
- 异步调用性能更高:个人觉得首先要想清楚为什么需要异步,需要分布式,而不是单纯考虑那个性能更好。
调用方式
- 同步:
- 异步
- 并行
- 泛化,框架提供通用接口方法,应用实现具体服务,然后发布和引用
- 回调,单列出来,在异步的基础上执行回调方法。
服务注册中心
统一管理服务注册发布和订阅。
概念
- 服务提供者
- 服务消费者
- 服务注册中心,有几个特点:
- 高HA:支持数据持久化,支持集群;
- 数据一致性问题;
- 数据变更主动推送。
关键功能特性设计
- 服务提供者在启动时,根据配置,向注册中心发布服务相关信息;
- 服务消费者启动时,根据配置,向注册中心订阅所需服务,本地缓存;
- 注册中心返回服务提供者信息给消费者,如有变更,主动推送消费者,消费者刷新本地缓存;
服务消费者根据本地缓存的服务提供者地址列表,选择相应提供者进行调用;
- 支持对等集群
- 注册中心提供CRUD接口
- 安全加固
- 支持对等集群
- 链路的安全性:指的是注册中心与客户端连接的安全认证,基于IP的黑白名单或基于用户名+密码或基于秘钥+数字证书的认证;
- 数据安全性:指的是数据的权限控制:
- 发布订阅机制:除了启动时的发布订阅,最关键的是动态发布订阅的支持;
- 可靠性:注册中心集群部署,任意一台宕机,不影响注册中心的使用,集群不可用,只会影响新服务的发布订阅,不影响已缓存服务的使用。
基于zk的服务注册中心设计
服务发布和引用
服务提供者需要支持通过配置、注解、api接口调用等方式发布服务,同理,服务消费者也可以通过这些方式引用服务。
服务发布
- 服务发布的几种方式:
- xml配置,注解,api接口调用
- xml配置,注解,api接口调用
- 本地实现类封装成代理,其好处:
- 发布流程享受,通过抽象代理层,可对服务发布行为本身进行封装和抽象;
- 通过动态代理,可对服务发布进行动态拦截,方便对服务发布定制;
- 扩展和替换;
- 服务发布成指定协议
- 服务提供者信息注册,目的:
- 供消费者订阅服务地址信息;
- 基于注册中心的统一服务治理;
- 服务注册的目录结构可以按照主机、服务名、url来,按实际需求判断,例如按主机来:
感觉少了一步,在完成服务注册后,服务提供者需要启动监听,等待服务调用。
服务引用
- 本地接口调用转换成远程服务调用,主要是根据配置或注解的远程服务信息,生成服务的动态代理;
- 服务地址本地缓存,在生成动态代理之前,就会根据引用的服务信息,连接注册中心,获取服务相关配置信息和服务提供者列表,缓存到本地,后期就可以直接在本地查询。
- 远程服务调用,从本地缓存列表获取服务提供者地址信息,根据路由策略,选择链路,然后就是一系列的服务治理,最后远程调用。
最佳实践
- 对等设计:服务的发布或引用,配置支持的,必须也能够通过注解或api接口实现支持;
- 启动顺序,主要是服务提供者、注册中心、服务消费者3者的系统启动顺序无法控制,其实最主要的是要支持注册中心的断连重连机制,客户端(提供者和消费者)和注册中心定时通信,发布或获取服务信息,这样就无所谓启动顺序;
- 同步还是异步发布服务,这个主要是服务太多了,如果系统启动时,就发布服务,会影响启动时间,看需求吧;
- 警惕网络风暴,对于注册中心,可能需要注册的服务太多或者服务变更频繁,挤占注册中心网络带宽,需要考虑的是那些信息需要向注册中心同步;
- 配置扩展,主要是发布或引用需要支持扩展。
服务灰度发布
作用参考AB测试,保证系统的稳定性前提下,灰度发布解决升级后的兼容性问题。
流程设计
- 环境准备
- 灰度规则设置,这个更多的是灰度路由规则,将流量引入灰度环境;
- 灰度规则下发;
- 灰度路由;
- 失败回滚
- 灰度发布总结,为下一轮灰度打基础
没搞过这些流程,而且,服务发布可以只发布部分集群,然后为集群配置路由规则引入流量,所以对这一块没想太深入。
参数传递
服务消费者和提供者之间的交互通信,除了正常的业务参数,可能需要携带额外的信息,如消费者的ip地址,调用链的ID等,要保证这些额外信息不影响正常业务参数,即使有线程切换的场景发生。
作者说这些额外参数不能通过业务接口来进行传递,需要框架支持这种参数传递,不太同意,正确的说应该不要影响正常业务接口参数即可。
内部传参
- 业务内部参数传递
- 硬编码,api接口传参,也可以通过ThreadLocal传递(无线程切换场景);
- 业务编排引擎对业务进行编排,参数通过编排上下文进行;
- 专业的BPM流程引擎进行编排,流程上下文传递参数;
- 服务框架内部参数传递,内部模块可能发生线程切换,可以直接把所有参数带上,也可以通过将一次调用的参数放入框架的context中,后续参数从其中取值;
外部传参
- 通信协议支持,参考之前的协议设计,在自定义协议中,支持参数的扩展;
- 传参接口定义,框架提供接口,用于跨进程的参数传递,通过context线程变量供传参使用。
最佳实践
- 防止参数互相覆盖,框架的参数不能覆盖业务参数;
- 参数的生命周期管理,主要是放入context的变量,要记得在调用完成或异常等场景下清理。
服务多版本
服务上线后的功能变更,bug修复,需要多版本管理。
服务多版本管理设计
- 服务提供者:发布时,支持指定服务的版本号;
服务消费者:消费服务的时候,支持指定引用的服务版本号或版本范围。
- 服务版本号管理,主版本+副版本+微版本
- 服务提供者,服务消费者:
- 服务提供者,发布服务的时候,指定版本号,对于经常变动的服务,单独部署发布;
- 服务提供者引用服务时指定版本号或版本范围;
- 基于版本号的服务路由
- 服务热升级
- 基于版本号的服务路由
与OSGI的对比
淘宝的HSF基于osgi,挺牛,能把osgi玩好的不容易。
osgi基于插件管理,支持热部署和热升级,参考eclipse的插件体系。
不使用osgi的原因很多,最主要的就是学习成本太高,不易理解,实现复杂,而他的有点又可以通过其他技术解决,所以除了淘宝的HSF实在没听说太多应用。
服务的多版本管理感觉就是发布服务和引用服务的时候需要指定版本,不能单靠服务的多版本解决问题兼容性问题,更多的关注点应该放在服务本身的兼容性设计上。
下节继续学习….
读-李林峰-分布式服务框架和原理8-13相关推荐
- 读-李林峰-分布式服务框架和原理1-7
这哥们还写过一本netty的书,说实话这本书感觉不好,来过公司介绍过netty,讲的比较入门,因为当时在看netty源码,所以就不太感冒.后来学习公司服务框架的源码,想找本书系统了解下,又搜到这哥们, ...
- 读-李林峰-分布式服务框架和原理14-17
流量控制 通过合理设置流控配置,避免消费方的并发请求数超出服务提供方的承受能力,导致服务不可用. 静态流控 静态流控主要是针对客户端的并发请求进行控制,根据SLA的约定的QPS做全局流量控制. 传统静 ...
- 读-李林峰-分布式服务框架和原理18-21
分布式消息追踪 先推荐个文章,云栖的https://yq.aliyun.com/articles/91435,介绍了分布式调用链的一些场景和阿里的分布式调用链组件eagle,记得原来云栖有个视频介绍这 ...
- 分布式服务框架dubbo原理解析 转
alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...
- 分布式服务框架:原理与实践
应用架构演进<一>: 垂直应用框架面临的挑战: 一.复杂应用的开发和维护成本变高,部署效率逐渐降低. 二.团队协作效率差,部分公共功能重复开发代码重复率居高不下. 三.系统可靠性变差.随着 ...
- java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(一)
评论 # re: 基于Spring-DM实现分布式服务框架(DSF)(一) 2008-04-14 17:03 赵斌 BlueDavy,你好: 最近正在研究关于"服务框架"的内容,看 ...
- 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)
2019独角兽企业重金招聘Python工程师标准>>> 上次学了灰度发布,这次我们学习流控. ============================================ ...
- RSF 分布式服务框架-服务端工作原理
为什么80%的码农都做不了架构师?>>> 这是接上一篇文章<RSF 分布式服务框架设计>之后的续作,主要是 Hasor-RSF 的请求响应工作原理以及设计思路. 非 ...
- 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单
前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...
最新文章
- 深度|从Go高性能日志库zap看如何实现高性能Go组件
- Gdiplus中实现双Buffer绘图
- Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
- 行业薪酬大跳水 区块链真的凉了?
- VTK:可视化之BillboardTextActor3D
- 基于sobel算法的边缘检测设计与实现
- php socket 实现ftp,用socket实现FTP教程
- python秒表代码_斌哥教你自制千分秒表(键盘控制)
- 全球高校CS实力最新排行:清华AI界第二,中科院视觉领域最强
- 如何让Toast响应点击事件等基础Android基础文章N篇
- vb还是python强大-vb和python哪个速度快
- Ubuntu18 yolov5使用ncnn部署
- Flutter-防京东商城项目-修改收货地址 删除收货地址-43
- Flash 加密和破解
- 8类网线利弊_八类网线用过吗?与超五类、六类等网线有啥区别?
- 打造国云安全品牌,铸牢企业云上安全防线
- springboot+elasticsearch 中测试查询语句报错failed to map source
- 专题-参数方程与极坐标
- MySQL-Workbench数据库备份
- 【VOLTE】SPS 半持续调度