一、理解分布式架构:

分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

二、架构的发展历史:

分布式架构部署 分布式的架构_分布式架构部署


单体式架构:

分布式架构部署 分布式的架构_分布式架构_02


垂直架构:

分布式架构部署 分布式的架构_分布式架构部署_03


分布示架构:

分布式架构部署 分布式的架构_分布式架构_04


分布式架构所带来的成本:

分布式事物:
分布式事物是指一个操作,分成几个小操作在多个服务器上执行,要么多成功,要么多失败这些分布事物要做的

不允许服务有状态(stateless service)
无状态服务是指对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息。

服务依懒关系复杂
服务 A --> B–> C 那和服务C 的修改 就可能会影响 B 和C,事实上当服务越来 越多的时候,C的变动将会越来越困难。

如何保证系统的伸缩性:
伸缩性是指,当前服务器硬件升级后或新增服务器处理能力就能相对应的提升。

分布式会话:
此仅针对应用层服务,不能将Session 存储在一个服务器上。

分布式JOB
通常定时任务只需要在一台机器上触发执行,分布式的情况下在哪台执行呢?

三、如何选型分布式架构

RPC远程调用技术:

分布式架构部署 分布式的架构_java_05


拿几个大家比较熟悉的来举例:RMI 、Web Service、Http、

分布式架构部署 分布式的架构_java_06


RMI 远程调用架构:

Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。

分布式架构部署 分布式的架构_java_07

演示RMI远程服务调用:

1. 注册中心:
LocateRegistry.createRegistry(8080);
2.注册远程服务
UserService hello = new UserServiceImpl();
Naming.bind("rmi://localhost:8080/UserService3", hello);
3.引用远程服务,并发起调用
UserService userService = (UserService) Naming.lookup("rmi://localhost:8080/UserService");
userService.getName(11);

分布式架构部署 分布式的架构_分布式_08


1.负载均衡:这么多个机器调用哪一台?

2.服务发现:样发现新的服务地址呢?

3.健康检测:服务关宕机或恢复后怎么办?

4.容错:如果调用其中一台调用出错了怎么办?

分布式架构的三种解决方案:
1.基于反向代理的中心化架构
2.嵌入应用内部的去中心化架构
3.基于独立代理进程的Service Mesh架构

基于反向代理的集中式分布式架构

这是最简单和传统做法,在服务消费者和生产者之间,代理作为独立一层集中部署,由独立团队(一般是运维或框架)负责治理和运维。常用的集中式代理有硬件负载均衡器(如F5),或者软件负载均衡器(如Nginx),这种软硬结合两层代理也是业内常见做法,兼顾配置的灵活性(Nginx比F5易于配置)。

分布式架构部署 分布式的架构_分布式架构部署_09


嵌入应用内部的去中心化架构这是很多互联网公司比较流行的一种做法,代理(包括服务发现和负载均衡逻辑)以客户库的形式嵌入在应用程序中。这种模式一般需要独立的服务注册中心组件配合,服务启动时自动注册到注册中心并定期报心跳,客户端代理则发现服务并做负载均衡。我们所熟悉的 duboo 和spring cloud Eureka +Ribbon/'rɪbən/ 都是这种方式实现。

分布式架构部署 分布式的架构_java_10


基于独立代理进程的架构(Service Mesh)这种做法是上面两种模式的一个折中,代理既不是独立集中部署,也不嵌入在客户应用程序中,而是作为独立进程部署在每一个主机上,一个主机上的多个消费者应用可以共用这个代理,实现服务发现和负载均衡,如下图所示。这个模式一般也需要独立的服务注册中心组件配合,

分布式架构部署 分布式的架构_分布式架构_11

三种架构的比较

分布式架构部署 分布式的架构_分布式_12