分布式服务框架原理与实践_李林锋著_笔记

原文章:

分布式服务框架原理与实践_李林锋著_笔记

https://www.cnblogs.com/xiaoliangyuu/p/13234039.html

第20章 微服务架构 264

1、微服务架构产生的历史背景:
    1、代码重复率高。进而导致需求变更困难、代码维护困难
    2、部署效率低。2.1一个小功能的变更导致打整个war包  2.2编译时间长 2.3测试工作量大
    3、由于以上原因,导致新需求上线周期长
    
2、微服务架构带来的改变:
    1、应用解耦
    2、分而治之:水平拆分、垂直拆分
    3、敏捷交付。敏捷性的产生,是将运行中的系统解耦为一系列功能单一服务的结果
 
3、微服务划分原则:单一职责原则,简单的、原子的微型服务,专注于做一件事
4、开发微服务:
5、基于docker容器部署微服务:
    1、docker优势:快速(性能)和可移植性
    2、docker的4个优点:
        1、线上和线下环境等同性(容易排查线上bug;相对于虚拟机占用资源少,可在开发环境模拟)
        2、与特定的云提供商解耦
        3、提升运维效率。docker是标砖化容器,在任意环境实现统一的部署体验
        4、敏捷性。秒级扩容
        
6、治理和运维微服务
    微服务导致运维成本大幅提高,服务拆分粒度越细,运维和治理成本就越高。
    主要方案为 分布式和自动化。
        1、分布式如:分布式性能数据采集、分布式日志检索、分布式报表展示。
        2、自动化就是将以前人工操作的运维工作逐步标准化、流程化和规范化。如自动扩容
        
7、微服务优点总结:
    1、开发、测试和运维简单
    2、局部修改很容易部署,有利于持续集成和持续交付
    3、技术选择更灵活,不与特定语言和工具绑定
    4、有利于小团队作战,敏捷交付

第21章 服务化最佳实践 280

1、远程服务调用相对于本地调用会有性能和时延问题:
    1、客户端对消息序列化,服务端反序列化,会占用cpu资源
    2、序列化时需要创建二进制数组,占用jvm堆内存或堆外内存
    3、客户端发送请求消息和接受反馈消息,占用网络带宽
2、远程服务调用性能影响因素有3个:
    1、I/O调度模型:同步阻塞I/O(BIO)还是非阻塞IO(NIO)
    2、序列化框架的选择:文本协议、二进制协议或压缩二进制协议
    3、线程调度模型:串行调度还是并行调度,锁竞争还是无锁化算法(高性能的Reactor线程模型)
    
3、netty优势总结(详见书):零拷贝、内存池、无锁化的串行设计、高效的并发编程
 
4、序列化框架的影响因素:
    1、序列化后的码流大小(网络带宽的占用)
    2、序列化&反序列化的性能(CPU资源占用)
    3、是否支持跨语言(异构系统的对接和开发语言切换)
    4、并发调用的性能表现:稳定性、线性增长、偶现的时延毛刺等
    
5、服务化高性能实践总结:
    1、合理设置线程池线程个数。因为JDK的线程池默认采用N个线程争用一个同步阻塞队列方式,过多的线程数会导致激烈的锁竞争,导致性能下降
    2、尽量减小传输码流的大小,无用的字段尽量不要传输
    3、设置合适的客户端超时时间,防止业务高峰期多个线程排队,占用服务器资源
    4、核心服务与非核心服务做隔离
    5、尽量使用Docker,而不是虚拟机。避免虚拟化导致的超过20%的性能损耗
    6、设置合理的服务调度优先级,并根据线上性能监控数据做实时调整
    
6、分布式事务:
    本地服务时,多个sql可以放在一个事务块中,如果有异常,则全部进行回滚。而服务化之后,多个sql分散在了多个服务中,事务性无法保证。
    服务化之后事务不一致主要是由服务分布式部署导致的,因此也被称为分布式事务问题
    设计方案:两阶段提交
    
    其他:在大多数的业务场景中,我们可以使用最终一致性替代传统的强一致性,尽量避免使用分布式事务
    
7、研发团队协作问题:
    1、共用服务注册中心。正在开发的服务不可以发布到注册中心
    2、2.1 前向兼容性规范指定。 2.2 支持新增、删除、修改字段  2.3 字段定义位置无关性  2.4 码流支持乱序
原文地址:https://www.cnblogs.com/xiaoliangyuu/p/13234039.html