分布式原理
分布式原理是指将一个大型系统分割成多个子系统,每个子系统都运行在不同的计算机上,这些计算机通过网络互相连接,协同完成系统的任务。分布式系统的设计目标是提高系统的可靠性、可扩展性和性能
- 分布式计算:将大型问题分解成多个小问题,每个小问题由不同的计算机处理,最终将结果合并得到整个问题的解决方案
- 分布式存储:将数据分散存储在不同的计算机上,通过网络协议进行访问,提高数据存储的可靠性和可扩展性
- 分布式通信:通过网络协议实现不同计算机之间的通信,包括点对点通信和广播通信等方式,保证分布式系统的协同工作
- 分布式算法:设计适合分布式系统的算法,包括分布式锁、分布式事务、分布式一致性等,保证分布式系统的正确性和可靠性
- 分布式安全:保证分布式系统的安全性,包括身份认证、数据加密、访问控制
分布式系统的应用范围非常广泛,例如云计算、大数据处理、分布式数据库、分布式文件系统等
Dubbo
Dubbo是一款基于Java的高性能、轻量级的开源RPC框架,由阿里巴巴公司开发和维护。Dubbo提供了完整的RPC框架和服务治理方案,使得开发者可以轻松地实现远程服务调用和管理。
Dubbo的主要特点包括:
- 高性能:Dubbo采用了NIO异步非阻塞IO和线程池机制,可以支持高并发和低延迟的RPC调用
- 轻量级:Dubbo的核心只有几百KB,非常轻量级,可以快速部署和集成到应用中
- 易扩展:Dubbo提供了完整的服务治理方案,包括服务注册、发现、负载均衡、容错、路由等,可以轻松地实现服务的扩展和管理
- 多协议支持:Dubbo支持多种协议,包括Dubbo协议、HTTP协议、RESTful协议等,可以满足不同的应用场景
- 多语言支持:Dubbo提供了多种语言的实现,包括Java、Python、Node.js等,可以满足不同语言的开发需求
Zookeeper
Zookeeper是一个开源的分布式协调服务,可以用于维护和管理分布式系统中的配置信息、命名服务、分布式锁和分布式队列等。它由Apache基金会开发和维护,是一个高性能、可靠、可扩展的分布式协调服务
- 高可用性:Zookeeper采用了主从架构,可以实现自动故障转移,提高了系统的可用性
- 高性能:Zookeeper采用了内存数据库和NIO技术,可以支持高并发和低延迟的操作
- 可扩展性:Zookeeper可以通过集群方式进行横向扩展,可以支持大规模的分布式系统
- 严格顺序性:Zookeeper提供了严格的顺序性保证,可以保证所有客户端看到的数据是一致的
- 简单易用:Zookeeper提供了简单易用的API,可以方便地实现分布式系统中的协调和管理
RPC
RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。它允许程序调用远程计算机上的服务,就像调用本地服务一样;在RPC中,客户端应用程序通过发送一个称为“请求”的消息来调用远程服务器上的过程。服务器应用程序在接收到该请求后执行相应的过程,并将结果作为"响应"消息返回给客户端;RPC协议通常使用HTTP、TCP/IP等协议进行通信。常见的RPC框架有gRPC、Thrift、Dubbo
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,选另一台调用
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
Zookeeper安装使用
配置
Dubbo-admin安装使用
Dubbo-admin:监控平台,查看被注册的服务
- 项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
- 执行打包出来的jar包
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
- 浏览器访问:localhost:7001
Dubbo-Zookeeper集成SpringBoot
创建spring框架:provider-service
依赖导入
<dependencies> <!--Dubbo--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!--Zookeeper--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 引入zookeeper --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!--新版的坑:zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- application.properties
server.port=8001 # 服务应用名字 dubbo.application.name=provider-service # 注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 # 注册服务 dubbo.scan.base-packages=com.wei.service
- service/TicketService
package com.wei.service; /** * @ClassName TicketService * @Description TODO * @Author wei_shuo * @Date 2023/6/2 14:45 * @Version 1.0 */ public interface TicketService { public String getTicket(); }
- service/TicketServiceImpl
package com.wei.service; import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; /** * @ClassName TicketServiceImpl * @Description TODO * @Author wei_shuo * @Date 2023/6/2 14:45 * @Version 1.0 */ @Component @Service public class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "wei"; } }
创建spring框架:consumer-service
依赖导入
<dependencies> <!--Dubbo--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!--Zookeeper--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 引入zookeeper --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!--新版的坑:zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- application.properties
server.port=8002 # 消费者暴露自己的名字 dubbo.application.name=consumer-service # 注册中心的地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
- service/TicketService
package com.wei.service; /** * @ClassName TicketService * @Description TODO * @Author wei_shuo * @Date 2023/6/2 14:45 * @Version 1.0 */ public interface TicketService { public String getTicket(); }
- service/UserService
package com.wei.service; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service; /** * @ClassName UserService * @Description TODO * @Author wei_shuo * @Date 2023/6/2 14:46 * @Version 1.0 */ @Service public class UserService { //注册中心获取服务 @Reference TicketService ticketService; public void buyTicket() { String ticket = ticketService.getTicket(); System.out.println("注册中心获取一张票" + ticket); //注册中心获取一张票wei } }
启动
启动zkServer:Zookeeper
启动Dubbo-admin
运行provider-service
浏览器访问:localhost:7001
- 启动consumer-service
控制台输出:注册中心获取一张票wei