Dubbo01
1.分布式基础理论
1.1. 什么是分布式系统
-
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统
-
分布式系统(distributed system)是建立在网络之上的软件系统
-
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
2.RPC
2.1. 什么是RPC
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技
术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器
上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地
的还是远程的函数,本质上编写的调用代码基本相同。
2.2. RPC的基本原理
3.Dubbo
3.1. 什么是Dubbo
Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,其可以使用netty、
zookeeper来保证高性能和高可用性(netty是一种NIO框架),它提供了三大核心能力:面向
接口(Interface)的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集
成。
2011/10/27:阿里巴巴巴宣布 Dubbo 开源。
2012/10/23:发布最后一个版本 2.5.3 并停止维护更新。当当网捡起来继续维护
Dubbox
2017/07/31:起死回生,官方宣布开启重新更新,并会得到重点维护。
2017/09/07:发布起死回生的第一个版本:dubbo-2.5.4。
2018/01/22:Dubbo Spring Boot 版正式发布:dubbo-spring-bootstarterv1.0.0 公测版。
2018/02/09:Dubbo 通过投票正式进入 Apache 基金会孵化器,更新了 Apache 官方
域名,也不再仅限于 Java 语言。
3.2. Dubbo相关基本概念
Dubbo官网:https://dubbo.incubator.apache.org/zh/index.html
-
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册 自己提供的服务。
-
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心 订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提 供者进行调用,如果调用失败,再选另一台调用。
-
注册中心(Registry):用于服务的注册和发现,注册中心返回服务提供者地址列表给消费 者,如果有变更,注册中心将基于长连接推送变更数据给消费者
-
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每 分钟发送一次统计数据到监控中心
4. Dubbo的无注册中心的应用
4.1. 创建provider服务提供方模块
1.创建springboot项目
2.引入dubbo的起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
3.application.yml中配置
server:
port: 8081
dubbo:
registry:
address: N/A #无注册中心配置
application:
name: provide #服务提供者的在RPC中的名称
scan:
base-packages: com.test.service #设置哪些service接口及方法可以被远程过程调用到
protocol: #设置服务提供方被调用时使用的协议和端口
name: dubbo
port: 20882
4.service接口和接口实现类编写
IUserService.java
public interface IUserService {
public String getAll();
}
UserServiceImpl.java
@DubboService(version = "1.0.0") //表明此service接口实现类可以被dubbo扫描到,能够对外提供远程过程访问服务
public class UserServiceImpl implements IUserService{
@Override
public String getAll() {
return "Hello Dubbo";
}
}
5.引导类添加dubbo开启的注解
@SpringBootApplication
@EnableDubbo //开启dubbo功能
public class DubboDay01ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboDay01ProviderApplication.class, args);
}
}
4.2. 创建consumer服务消费方模块
1.创建springboot项目
2.引入dubbo的起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
3.application.yml中配置
server:
port: 8082
dubbo:
application:
name: consumer
registry:
address: N/A
scan:
base-packages: com.test.dubboproviderday01.service # 注意此包名需要和provider的保持一致,以此证明使用了同一个service接口,以此让consumer知道调用的service服务的类型。
4.service接口和controller的编写
IUserService.java 注意:此接口和provider中的接口必须是一个(包名、类名、方法名等均要 保持一致)
public interface IUserService {
public String getAll();
}
UserController.java
@RestController
public class UserController {
//通过访问地址和版本查找provider提供的service服务
@DubboReference(version = "1.0.0",url = "dubbo://127.0.0.1:20882")
private IUserService userService;
@RequestMapping("/getAll")
public String getAll(){
return userService.getAll();
}
}
5.引导类添加dubbo开启的注解
@SpringBootApplication
@EnableDubbo
public class DubboConsumerDay01Application {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerDay01Application.class, args);
}
}
4.3. 启动测试
启动provider项目,再启动consumer项目
注意,provider在启动的时候会报如下错误,这个错误只是个警告,并不是异常,所以不用关心。
浏览器输入地址:http://localhost:8082/getAll
4.4. provider和consumer优化
在构建provider和consumer的时候,我们都要编写IUserService接口,并且在构建的时候我们 说provider和consumer的IUserService就是一个(包名、类名、方法名等均要保持一致),那 既然是一个,在provider和consumer中各写一个,就出现的代码冗余,我们可以将 IUserService抽取到其他项目操作。
1.创建普通Maven工程service-api
2.将IUserService接口抽取到Maven工程中,并且install到maven仓库中
3.在provider和consumer项目中删除原来的IUserService接口,install一下service-api项目
4.在provider和consumer项目的pom.xml文件中引入service-api项目
<dependency>
<groupId>com.lanou</groupId>
<artifactId>service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
代码中使用到IUserService接口的地方,都进行重新导包,改成使用service-api中的 IUserService接口。
5.在consumer项目的application.yml文件中都修改service接口包扫描操作
scan:
base-packages: com.test.service
6.重新启动测试
5.Zookeeper
5.1. 什么是Zookeeper
- Zookeeper是Apacahe Hadoop的子项目,是一个树形目录服务
- JAVA语言编写的分布式协调服务
- 提供多种主流编程语言客户端:JAVA/C等
5.2. Zookeeper有什么作用
- 配置管理
- 名字服务
- 分布式锁
- 集群管理
5.3. Linux安装Zookeeper
zookeeper官网:https://zookeeper.apache.org/
- 将资料中的apache-zookeeper-3.7.1-bin.tar.gz压缩包上传linux中。
- tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
- 进入 zookeeper安装目录的conf目录,将zoo_sample.cfg改名为zoo.cfg,具体指令 cp zoo_sample.cfg zoo.cfg(改一下配置文件的名称)
- 进入zookeeper安装目录的bin目录
启动zk: ./zkServer.sh start
停止:./zkServer.sh stop
重启:./zkServer.sh restart
5.启动客户端 ./zkCli.sh 发现zookeeper默认的端口号 2181
5.4. Zookeeper的简单操作
ls 目录 查看对应目录的节点
- create /node1 192.678.109.289:7777 创建node1节点 可以绑定节点对应的信息
- get /node1 获取节点相关的信息
- set /节点path value设置节点数据
- delete /节点path 删除节点
- create /node1/subnode com.service.IUserService.getAll 挂载子节点 子节点也要绑定信息
- get /node1/subnode 获取子节点的相关信息 ctrl+c或者quit退出客户端操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律