一 服务架构发展历史
单体式架构–>垂直架构–>分布式架构–>智能架构
单体式架构:应用程序、静态文件、数据库等全部在一台机器上
垂直架构:基于业务对应用程序、静态文件、数据库等进行垂直拆分,业务之间相互独立
分布式架构:在垂直架构基础上抽象出公共服务层
智能架构:在分布式架构基础上自动自动对服务进行编排与权重调整
二 RPC远程调用
分布式架构系统的核心是RPC远程调用技术
常见的RPC远程调用技术有RMI、Web Service、Http
协议 | 描述 | 优点 | 缺点 |
---|---|---|---|
RMI | JAVA 远程方法调用、使用原生二进制方式进行序列化 | 简单易用、SDK支持,提高开发效率 | 不支持跨语言 |
Web Service | 比较早系统调用解决方案 ,跨语言, 其基于WSDL 生成 SOAP 进行消息的传递 | SDK支持、跨语言 | 实现较重,发布繁琐 |
Http | 采用htpp +json 实现 | 简单、轻量、跨语言 | 不支持SDK |
其实比较快速简单的轻量级架构就是Http+Nginx,事实上一些中小公司的一般项目是这么做的。它可以实现:
- 负载均衡:这么多个机器调用哪一台?
- 容错:如果调用其中一台调用出错了怎么办?
- 服务配置:服务端地址配置在哪里?
- 健康检测:服务关宕机或恢复后怎么办?
但是这种方式是有瓶颈的:Nginx中心负载、Http传输、JSON序列化、开发效率、运维效率。
基于瓶颈考虑大型系统需要一个更加专业的方案,该方案必须做到以下几点:
1.去中心化,客户端直连服务端
2.动态注册和发现服务
3.软负载均衡实现
4.高效稳定的网络传输
5.高效可容错的序列化
其对应的功能组件如下:
1.注册中心逻辑:
- 服务端动态注册服务提供者信息
- 客户端从注册中心接收服务提供者信息,并存储至本地缓存
- 注册中心实时监听提供者状态,如果变更将即时通知客户端
2.调用逻辑:
- 负载均衡
- 容错
- 对服务调用者透明
3.传输模块:
- minal,servlet 容器、netty
4.序列化模块:
- kryo、hessian、java、protobuf、JSON、XML
三 主流的分布式框架
Spring Cloud Zuul
Dubbo
四 分布式架构的成本与风险
分布式的强大是用成本和风险换来的
分布式事物:
分布式事物是指一个操作,分成几个小操作在多个服务器上执行,要么多成功,要么多失败这些分布事物要做的
不允许服务有状态(stateless service)
无状态服务是指对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息。
服务依懒关系复杂
服务 A --> B–> C 那和服务C 的修改 就可能会影响 B 和C,事实上当服务越来 越多的时候,C的变动将会越来越困难。
部署运维成本增加
相比之前几个节点,运维成本的增加必须的。
源码管理成本增加:
原本一套或几套源码现在拆分成几十个源码库,其中分支、tag都要进行相应管理。
保证系统的伸缩性:
伸缩性是指,当前服务器硬件升级后或新增服务器处理能力就能相对应的提升。
分布式会话:
此仅针对应用层服务,不能将Session 存储在一个服务器上。
分布式JOB
通常定时任务只需要在一台机器上触发执行,分布式的情况下在哪台执行呢?