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


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

    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 控制
  • 相关阅读:
    Python requests“Max retries exceeded with url” error
    命令行链接mongo、redis、mysql
    python 删除字典某个key(键)及对应值
    python标准模块(二)
    python标准模块(一)
    格式化输出
    LeetCode----1. Two Sum
    文件操作(初阶)
    python函数基础
    python3内置函数
  • 原文地址:https://www.cnblogs.com/carvendy/p/7782261.html
Copyright © 2020-2023  润新知