SpringBoot-04-初识分布式微服务架构
分布式微服务基础
8.1 分布式理论
1)是什么
- 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。
- 分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
- 说人话,团结就是力量
2)为什么会出现
- 首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。
- 因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题
3)技术难点
-
这么多的服务,我的用户该怎么来访问
-
这么多的服务,我的服务和服务之间该怎么进行通讯
-
这么多服务我该怎么管理
-
有服务挂掉了,怎么处理
8.2 RPC
-
什么是RPC
- RPC(Remote Procedure Call)是指远程过程调用,是一种进程间通信方式,他是一种技术的思想
- 说人话,遥控器
-
RPC过程
-
技术难点
- 网络通信(目前技术水平下,网络传输仍然不那么可靠)
- 序列化
8.3 Dubbo
-
什么是Dubbo
- Apache Dubbo is a high-performance, java based open source RPC framework.
- 说人话,Dubbo是基于Java的RPC框架。提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
-
工作流程
8.4 Zookeeper
- 什么是Zookeeper
- 从上面Dubbo的工作流程中可以看到,Registry这个东西那是相当重要啊,而Zookeeper就是Dubbo官方推荐我们使用的注册中心
- 说人话,就是一个用来注册和分发服务的中间件
8.5 分布式初体验
1)准备工作
-
安装Zookeeper
- 到Zookeeper官网上下载下来解压就好了
- 运行bin目录下的zkServer即可开启Zookeeper
- 如果闪退,则在文件最后一行加上pause就能看到错误信息
-
安装Dubbo-admin,这个是Dubbo的监控程序,通过他,我们可以直观的看到我们部署了那些服务
-
注意要下载master分支下的,默认使develop分支。同时下载下来的Maven项目需要打包
-
启动界面,默认端口在7001,默认账号密码root-root
2)搭建服务提供商
-
导入依赖
<!-- Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <!-- zookeeper --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
-
编写服务类
-
接口
public interface SellService { String sell(); }
-
实现类
@DubboService @Service public class SellServiceImpl implements SellService { @Override public String sell() { return "我买了Lamborghini"; } }
- 最新版本的Dubbo中,@Service注解已经过时,官方要我们用@DubboService来暴露服务
-
-
配置文件
dubbo: application: name: 出售服务 registry: address: zookeeper://127.0.0.1:2181 scan: base-packages: com.pbx.service server: port: 9000
3)服务调用者
-
导入依赖
<!-- Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <!-- zookeeper --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
-
Service实现类
@Service public class BuyServiceImpl implements BuyService { @Override public void buy() { } }
- 通常情况下,这里调用远程服务的方式是通过pom导入,这里简化步骤,直接建立一个完全一样的服务接口
-
配置Dubbo
dubbo: application: name: 购买服务 registry: address: zookeeper://127.0.0.1:2181 server: port: 9001
-
测试,进行测试的时候要同时开启两个SpringBoot项目和Zookeeper
@Autowired BuyService buyService; @Test void contextLoads() throws InterruptedException { while (true) { buyService.buy(); Thread.sleep(3000); } }
-
同时在Dubbo-admin中也可以看见