《大型网站系统与Java中间件实践》

时间:2022-07-01 20:45:20

读了一下,个人认为最好的部分,就是第四章了。

CH04 服务框架

4.2 服务设计与实现

// 获取可用服务地址列表

// 确定调用服务目标机器

// 建立连接(Socket)

// 请求序列化

// 发送请求

// 接收结果

// 解析结果

调用接口声明(ConsumerBean)

  1. 接口名称
  2. 版本

运行时服务框架与应用和容器的关系

  1. 服务框架自身的部署问题

  2. 实现自己的服务框架所依赖的一些外部jar与应用自身依赖的jar包之间的冲突。

  3. 服务框架依赖到应用本身

  4. 服务框架作为容器的一部分。(或者服务框架自身变为一个容器)

    ==> ClassLoader隔离。

将服务框架自身用的类与应用用到的类都控制在User-Defined Class Loader级别,实现隔离。(web容器之间隔离,以及OSGI对不同Bundle的隔离。)

有时候,遇到需要运行时统一版本的情况,需要服务框架比应用优先启动

服务注册中心(随机、轮询、权重)

实际过程中,计算需要的线程总数是很困难的。(控制慢方法)

  1. 增加资源保证系统的能力超出需求
  2. 隔离这些资源,快慢分离、重要级别分离。

需要把路由的规则做的更细致一些,基于具体方法来进行路由。

通过接口定位到服务地址列表,根据接口加方法名从规则中得到一个服务地址列表,再和刚才的地址列表取交集。

机房问题:

服务注册中心与机房甄别。机房是否对等呢?

调用端的流控处理:

  1. 根据服务端自身的接口、方法做控制,也就是针对不同的接口、方法设置不同的阈值,这是为了使服务端的不同接口、方法之间的负载不相互影响。
  2. 根据来源做控制,也就是对于同样的接口、方法,根据不同来源设置不同的限制,这一般用在比较基础的服务上,也就是多个集群使用同样的服务时,根据请求来源的不同级别等进行不同的流控处理。

==> 服务调用的协议扩展性、向后兼容性是需要重点考虑的。

NIO:

  1. Oneway,只管发送不关心结果。
  2. Callback (建议处理,新线程调用)
  3. Futrue (方便的并行处理)
  4. 可靠消息

异步

graph TB
数据入队-->生成通信对象;
生成通信对象-->等待;
等待-->处理结果;
数据入队-->数据队列;
数据队列-->IO线程;
SOCKET连接-->IO线程;
IO线程-->SOCKET连接;
通信对象队列-->等待;
通信对象队列-->定时任务;
生成通信对象-->通信对象队列;
通信对象队列-->IO线程;
graph TB
数据入队-->继续处理;
数据入队-->数据队列;
数据队列-->IO线程;
IO线程-->SOCKET连接;

服务暴露:(ProviderBean)

  1. 服务接口
  2. 实现
  3. 版本
  4. 分组

服务端的通信部分,也要采用NIO。

执行不同服务的线程隔离,不会出现争抢线程资源。

graph TB;
  网络通信层-->协议解析/反序列化;
  协议解析/反序列化--> 定位服务;
  定位服务--> 线程池1;
  定位服务--> 线程池2;
  定位服务--> 线程池3;

4.2.5 服务升级

  1. 增加方法
  2. 修改调用参数列表(直接修改难,版本号解决,设计考虑参数的扩展性)

4.3 实战中的优化

  1. 服务拆分
  2. 服务粒度
  3. 优雅和实用的平衡
  4. 分布式中的请求合并

    ==> 问题,怎么确定只有一个服务在做这个事情。

4.4 服务治理

服务信息:

  • 服务编码
  • 支持编码注册
  • 根据编码定位服务信息

服务质量:

  • 最好、最差的服务排名
  • 各个服务的质量
  • 各种查询条件的支持

服务容量:

  • 服务容量和当前水位
  • 根据水位高低排序
  • 各种查询条件的支持

服务依赖:

  • 依赖服务展示
  • 被依赖展示
  • 依赖变化

服务分布:

  • 服务在不同机房分布
  • 服务在不同机柜分布
  • 分布不均衡的服务列表

服务统计:

  • 被调用次数统计和排名
  • 出错次数统计和排名
  • 出错率统计和排名
  • 响应时间统计和排名
  • 出错率趋势

服务元数据:

  • 服务的方法和参数

服务查询:

  • 服务的应用负责人、测试负责人
  • 服务所属的应用名称
  • 服务发布时间
  • 服务提供者的地址列表
  • 服务容量
  • 服务质量
  • 服务调用次数
  • 服务依赖
  • 服务版本以及归组信息

服务报表:非实时统计,不同时段的对比。

服务监控:提供对于服务运行时关键数据的采集、规则处理和警告。(提供决策的数据基础)

4.2 服务管理

服务上下线:

  • 针对一个服所有机器的上线和下线操作。
  • 针对指定机器的上线和下线操作。
  • DoubleCheck控制

服务路由:

  • 路由管理界面支持
  • 路由信息更改前后对比和校验
  • 路由配置多版本管理和回滚
  • DoubleCheck控制

服务限流降级:

  • 根据调用来源限流
  • 根据具体服务限流
  • 针对服务开关降级
  • 流控、降级配置多版本管理和回滚
  • DoubleCheck控制

服务归组:

  • 归组归组的多版本管理和回滚
  • 归组规则预览
  • 归组规则的影响范围评估
  • DoubleCheck 控制

服务线程池管理:

  • 调用方服务线程管理,主要是最大并发的管理
  • 服务端线程工作状态查询
  • 服务端针对不同服务的多个业务的管理
  • DoubleCheck 控制

机房规则:

  • 规则查询和发布校验
  • 规则多版本管理和回滚
  • DoubleCheck 控制

服务授权:

  • 授权息查询
  • 授权规则多版本支持和回滚
  • DoubleCheck 控制