Dubbo01

发布时间 2023-06-20 21:32:13作者: 加包辣条多放辣椒

1.分布式基础理论

1.1. 什么是分布式系统

  • 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统

  • 分布式系统(distributed system)是建立在网络之上的软件系统

  • 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

2.RPC

2.1. 什么是RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技
术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器
上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地
的还是远程的函数,本质上编写的调用代码基本相同。

2.2. RPC的基本原理

image

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

image

  • 服务提供者(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在启动的时候会报如下错误,这个错误只是个警告,并不是异常,所以不用关心。

image
浏览器输入地址: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仓库中

image

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的子项目,是一个树形目录服务

image

  • JAVA语言编写的分布式协调服务
  • 提供多种主流编程语言客户端:JAVA/C等

5.2. Zookeeper有什么作用

  • 配置管理
  • 名字服务
  • 分布式锁
  • 集群管理

5.3. Linux安装Zookeeper

zookeeper官网:https://zookeeper.apache.org/

  1. 将资料中的apache-zookeeper-3.7.1-bin.tar.gz压缩包上传linux中。
  2. tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
  3. 进入 zookeeper安装目录的conf目录,将zoo_sample.cfg改名为zoo.cfg,具体指令 cp zoo_sample.cfg zoo.cfg(改一下配置文件的名称)
  4. 进入zookeeper安装目录的bin目录

​ 启动zk: ./zkServer.sh start

​ 停止:./zkServer.sh stop

​ 重启:./zkServer.sh restart

​ 5.启动客户端 ./zkCli.sh 发现zookeeper默认的端口号 2181

image

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退出客户端操作