分布式系统理论
一、分布式系统
分布式系统是若干个独立计算机的集合,这些计算机对于用户来说就像单个相关系统。
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。 分布式系统的出现是为了用廉价的、普通的计算机完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升高昂到得不偿失的时候,应用程序也不能进一步的优化的时候,我们才需要考虑分布式系统。因为分布式系统和单一系统解决的问题本身和单机系统是一样的, 而由于分布式系统的多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入 更多的机制、协议,会带来更多问题
RPC
一、认识RPC
RPC是指远程过程调用,是一种进程间的通信方式,他是一种技术思想,而不是规范。他允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或者函数,而不用程序员显式编码这个远程调用的细节。RPC就是要实现像调用本地的函数一样去调用远程函数。
二、RPC的两大核心
1、通讯
2、序列化
数据传输需要转换
认识Dubbo
一、认识Dubbo
是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:
1、面向接口的远程方法调用
2、智能容错和负载均衡
3、服务自动注册和发现
二、实现原理
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,想注册中心注册自己提供的服务
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务。服务消费者从提供者地址列表中,基于软件负载均衡算法,选一台提供者进行调用,如果调用失败,再2选另一台调用
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更 数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
注册中心zookeeper安装和主要作用
一、去官网下载安装包
(1)
(2)
(3)
(4)
二、把下载好的压缩包放进我们的环境中
三、启动测试
1、先打开bin下的zkServer.cmd
2、上一个cmd不要关闭,再打开zkCli.cmd
3、简单的测试,输入 ls / 查询节点
4、创建节点,存值
5、取节点中的值
实现服务注册发现
一、新建一个空的项目,新建provider项目,作为服务提供者
里面新建一个关于取票的业务
1、接口
public interface TicketService {
public String getTicket();
}
2、实现类
public class ticketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "获取到的票数为n!!!!!!";
}
}
3、修改这个服务的默认端口号
server.port=8001
二、新建一个消费者,用来使用提供者提供的业务
1、接口(接口路径要和服务提供者路径一致,才能远程调用)
public interface TicketService {
public String getTicket();
}
2、服务类(用@DubboReference注解实现引用注册中心的服务)
@Component
public class UserService {
//想拿到provider-server中的票,要去注册中心拿服务
@DubboReference //引用方法,可以定义和提供方路径相同的接口名
TicketService ticketService;
public void byTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到提供方的取票方法" + ticket);
}
3、修改服务的端口
server.port=8002
三、导入Dubbo+zookeeper依赖
<!-- Dubbo和spring整合启动器 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!-- zookeeper需要导入zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 解决日志冲突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<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>
四、启动zkServer.cmd服务!!!启动provider-server模块
已经成功连接上注册中心
五、启动消费者consumer-server模块
1、导入Dubbo+zookeeper依赖
<!-- Dubbo和spring整合启动器 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!-- zookeeper需要导入zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 解决日志冲突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<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>
2、配置applocation.properties,暴露消费者名字
#消费者去注册中心拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#配置注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
六、测试
@SpringBootTest
class ConsumerServerApplicationTests {
//使用@Autowired注解将消费者的服务类引入
@Autowired
UserService userService;
@Test
void contextLoads() {
//调用服务类中的方法,理论上是可以成功打印提供方此 方法中的结果
userService.byTicket();
}
}
至此,关于分布式架构和Dubbo以及Zooleeper的认识已经结束,相信大家对于这个分布式架构有了初步的认识,后续还更新深入的技术点,希望大家可以持续关注!