单体架构的优势:
便于开发:只需要借助IDE的开,调试功能即可完成
易于测试:只需要通过单元测试或浏览器即完成测试
易于部署:打包成单一可执于jar/war包,执jar/war包即可部署
单体架构的不足:
复杂性高
代码难以理解,各个模块逻辑复杂。
难以理解导致代码质量低,复杂性进一步增加
代码难以被修改和重构
内存泄露可能导致整个应用的崩塌(微服务可避免)
交付效率低:
构建和部署耗时长,难以定位问题,开发效率低
代码复杂和变更影响难以理解,需要数天完成全量测试
全量部署耗时长,影响范围广,风险大,发布步频次低
不能独立布署,用户体验差
伸缩性(横向扩展)差:
单体只能按整体横向扩展,无法分模块垂直扩展
IO密集型模块和CPU密集模块无法独立升级和扩容
可靠性差:
一个bug有可能引整个应用的崩溃。
难以定位问题
阻碍技术创新:
受技术栈限制,团队成员使用同一框架和语言,很难扩展
升级和变更技术框架变得困难,牵一发动全身。
尝试新语言变得困难(太重),新需求,重构导致开发成本高。
微服务架构
将单体应用拆分为多个高内聚低耦合的小型服务
每个小服务运动在独立进程,由不同的团队开发和维护,
服务间采用轻量级通信机制,独立自动部署,可以采不同的语言及存储。(不影响进度,各司其职)
优势:
易于开发和维护,
微服务相对单体应用体量更小,易于理解。
启动调试时间短,开发周期短。交付时间短。
独立部署:
不同的服务,并行迭代。(同时进行)不同于单体应用。从上至下,从1到2.
一个微服务的修改不需要协调其它服务。相对于单体应用往往存在,改一处多处报错(整个系统故障)。互不影响
单体应用往往会有改一处BUG引发多处BUG,高耦合,依赖性强。
相比微服务单体调试周期长,部署时间长,连锁反应大。
伸缩性强:
每个服务都可以在横向和纵向上扩展(单体受垂直(纵向)影响)
每个服务都可以按硬件资源的需求进行独立扩容或升级。延伸
与组织结构相匹配:
微服务架构可以更好将架构和组织相匹配(根椐不同的模块化分给不同的团队);
每个团队独立负责哪些服务(模块),获得更高的效率(生产力)
技术异构性:
使用最适合该服务的技术(跨语言实现),提供接口即可(服务者,消费者)
降低尝试新技术的成本(尝试新语言更容易)不受架构的影响
根椐不同的服务实现方式采用不同的技术栈
容错性高
微服务之间通信技术:
1.rcp
2.restful
3.异步
服务拆分:
微服务拆分原则:领域模型,组织架构,康威定律,单一职责
微服务拥有独立的数据库,技术栈。
微服务之间确定服务边界, 高内聚,低耦合。
微服务面临的问题
数据一致性(多服务,多事务)
可靠性事件模式
补偿模式-sagas模式
服务通信
通信方案:
同步机制(http协议):RPC vs REST
跨语言,学习成本低,易上手
异步机制(通常基于TCP):AMQP(异步消息)
不方便测试 ,调试。
服务注册和发现:
注册中心:
Eureka,ZK.Consul 等等三方框架
负载均衡
nginx ,ribbon
服务网关(服务通信)
API Gateway(聚合作用,应避免业务代码)
身份认证,路由服务,安全过滤,流量控制,日志统计
高可观察
健康检测,集中监控,聚合输出
日志聚合及检索(脚手架)
分布式追踪(定位问题,优化),服务故障
可靠性
流量控制,超时控制。保证下游服务正常
舱避隔离,熔断机制(服务出错,调用次数过多)关闭服务调用功能
请求转移,
服务降级,幂等重试
服务降级策略,(网络问题),服务重试。
接口幂等性。