1、什么是微服务?
微服务架构则是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。可以实现分布式部署,方便开发团队分别对每个微服务进行快速开发和测试。
2、什么是分布式系统?
若干独立计算机通过网络组成的系统,这些计算机协同工作以共同完成某一项任务或者提供某种服务。
常见的分布式系统包括互联网、分布式数据库系统、分布式文件系统、分布式计算系统(如Hadoop、Spark)、分布式存储系统(如分布式文件系统、分布式键值存储系统)等。这些系统可以在不同的计算机上部署,分布式系统通过分布式算法和协议实现数据的复制、一致性、负载均衡等功能,从而提供高可用性和可伸缩性。
3、什么是RPC?
允许一个节点(称为客户端)远程调用另一个节点(称为服务器)上的服务或函数。
客户端和服务器通常使用代理和存根来隐藏网络通信细节。客户端的代理负责将函数调用转换为远程调用请求,并将结果返回给客户端。服务器的存根接收远程调用请求,执行相应的函数,并将结果返回给客户端。
网络中传输需要进行序列化成字节流,返回值需要反序列化成相应的数据类型。
Socket通信是一种用于实现网络通信的套接字。
Socket通信的基本工作原理如下:
-
服务器创建一个Socket并绑定到一个特定的IP地址和端口,监听客户端的连接请求。
-
客户端创建一个Socket并指定要连接的服务器的IP地址和端口。
-
客户端通过Socket连接到服务器。
-
一旦连接建立,客户端和服务器可以通过Socket进行数据传输。客户端可以通过Socket发送请求消息给服务器,服务器接收请求消息并根据请求进行处理,然后将响应消息发送回客户端。
-
客户端和服务器通过Socket进行双向的数据交换,直到通信结束或其中一方关闭连接。
4、什么是Dubbo?
一款微服务分布式架构,可实现面向接口代理的高性能RPC调用、负载均衡、服务的自动注册与发现、运行期的监控调度等功能。
框架图:
5、Dubbo运行的全过程
- 服务容器负责启动、加载、运行服务提供者。
- 服务提供者(生产者)在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 注册中心从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心.
6、注册中心zookeeper
zookeeper是一个树型目录服务
1、服务提供方启动
服务提供者在启动的时候,会在ZooKeeper上注册服务。所谓注册服务,其实就是在ZooKeeper的/dubbo/com.foo.BarService/providers节点下创建一个子节点,并写入自己的URL地址(包括ip地址和端口号),这就代表了com.foo.BarService这个服务的一个提供者。
2、服务消费者启动
服务消费者在启动的时候,会向ZooKeeper注册中心订阅自己的服务。其实,就是读取并订阅ZooKeeper上/dubbo/com.foo.BarService/providers节点下的所有子节点,并解析出所有提供者的URL地址来作为该服务地址列表。
同时,服务消费者还会在ZooKeeper的/dubbo/com.foo.BarService/consumers节点下创建一个临时节点,并写入自己的URL地址,这就代表了com.foo.BarService这个服务的一个消费者。
3、消费者远程调用提供者
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一个提供者进行调用,如果调用失败,再选另一个提供者调用。
4、增加服务提供者
增加提供者,也就是在providers下面新建子节点。一旦服务提供方有变动,zookeeper就会把最新的服务列表推送给消费者。
5、减少服务提供者
所有提供者在ZooKeeper上创建的节点都是临时节点,利用的是临时节点的生命周期和客户端会话相关的特性,因此一旦提供者所在的机器出现故障导致该提供者无法对外提供服务时,该临时节点就会自动从ZooKeeper上删除,同样,zookeeper会把最新的服务列表推送给消费者。
6、ZooKeeper宕机之后
消费者每次调用服务提供方是不经过ZooKeeper的,消费者只是从zookeeper那里获取服务提供方地址列表。所以当zookeeper宕机之后,不会影响消费者调用服务提供者,影响的是zookeeper宕机之后如果提供者有变动,增加或者减少,无法把最新的服务提供者地址列表推送给消费者,所以消费者感知不到。
7、dubbo实现负载均衡的方法:
随机算法、权重轮询算法、一致性Hash算法、最少活跃数算法
(1)随机算法:随机从可用的服务提供者中选择一个进行调用
(2)权重轮询算法:按照权重值进行轮询,权重高的服务提供者被调用的概率更高
(3)一致性hash算法:对服务提供者列表进行排序并分配虚拟节点,将请求散列到环上的某一个位置,之后查找距离这个位置最近的服务提供者进行调用。
(4)最少活跃数算法:根据当前服务提供者的活跃请求数来选取一个最空闲的服务提供者进行调用。
8、具体与springboot的整合:
1、将消费者需要远程调用的接口抽取出来,放在api工程里。
2、然后在provider和consumer的工程pom.xml文件里引入api依赖
3、暴露服务,在provider工程里导入dubbo-starter依赖,在applaction.properties里配置服务,然后在需要暴露的服务那儿加上@service注解
4、配置consumer端,导入dubbo-starter依赖,在applaction.properties里配置服务,然后在需要调用的服务那儿加上@reference注解,就OK了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!