什么是分布式
在了解什么是dubbo和zookeeper之前,我们需要先了解什么是分布式,因为dubbo和zookeeper就是为了解决分布式所带来的问题才顺势而生的。以下是百度百科对分布式的介绍:
分布式服务顾名思义服务是分散部署在不同的机器上的,一个服务可能负责几个功能,是一种面向SOA架构的,服务之间也是通过rpc来交互或者是webservice来交互的。逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。
以往的项目都基本是单体应用,所有的功能都在一个项目模块里,这样的部署方式对于用户访问量少的小型应用来说是可以这么做的,但对于访问量大的应用来说,由于某一功能的经常访问,可能会导致服务器的奔溃,这时候就有两个分布式的解决方案可供选择:
- 第一是多部署几台服务器,每台服务器都能处理相同的请求任务,然后利用负载均衡实现各服务器之间的利用率平衡,这就是集群。
- 第二是将项目分成几个模块,分别部署在不同的服务器上,对于访问请求次数多的模块可以多分配服务器。
分布式的出现我认为就是为了减轻服务器的压力,防止项目奔溃停止,也为了解耦合。分布式的出现也面临着一些问题,比如部署在不同服务器中的模块如何进行通信,怎么管理这些分散的服务,服务崩了怎么办等等一些列问题,所以就顺势而出了很多解决问题的框架,dubbo就是其中之一。
什么是dubbo
以下是百度给的解释:
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
看介绍发现了个新的知识点—RPC,什么是RPC呢?不慌,再问下百度
RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。
我的理解是以前我们的调用都是本地调用,在类里面写方法然后在别的类或者自己类调用,这些都是在本地进行的,而远程调用就是部署在不同服务器上的两个模块,其中一个模块要调用另一个模块中某个接口中的方法。拿生活中的事情举个例子,你在网上购物,平常快递到了你都是自己去快递站拿快递,可是某一天你有事出差了,快递又刚好到了,你就打电话叫你的好朋友帮你去拿下快递,这就是远程调用。
以下是官网给Dubbo的原理图:
这张图的执行流程就是首先你需要一个Provider来提供服务并且注册到Registry(注册中心),对于要使用的服务的Consumer需要向Registry订阅你所需要的服务,然后注册中心会返回给你提供者的地址,然后你选择其中一个来执行服务,Moniter就是个监控中心,隔断时间就监控Consumer和Provider的状态。Dubbo只是个框架,其中Registry需要外界提供,而这就是zookeeper,对于zookeeper,就是文件系统+监听机制。
Springboot 整合dubbo和zookeeper
1、下载zookeeper
百度网盘下载链接–>下载链接 提取码:1314
下载后解压如下:
点开conf,复制一份下面的文件在当前位置并改名为: zoo.cfg
如果要开启服务就点开bin,看自己是什么系统就点哪个
2、springboot的配置
1、创建两个modul,分别是provider和consumer,如下(可以先创建Empty项目,再创建两个modul,因为只是简单测试,只需勾选web模块就行)
3、provider的配置
1、导入相关的依赖
<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>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.12</version>
</dependency>
<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>
<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>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2、创建需要提供服务的包
TickServiceImpl类如下:
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;
@DubboService//向注册中心暴露该服务
@Component
public class TickServiceImpl implements TickService {
@Override
public String printInfo() {
return "hello world";
}
}
还得在启动类加上个注解@EnableDubbo
3、配置文件
#服务的名称
dubbo.application.name=provider-server
#服务注册地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#提供的服务
dubbo.scan.base-packages=com.example.service
#项目启动端口
server.port=8081
这里的2181你自己也可以改成别的,点开刚改名的zoo.cfg文件
到这provider就配置完了。
4、consumer配置
1、导入依赖(与provider导入的依赖一样)
2、创建相应的包
3、配置文件
#服务的名称
dubbo.application.name=consume-server
#服务注册地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
server.port=8082
4、创建个测试类来引用
@Component
public class UserService {
@DubboReference//引用provider提供的服务
TickService tickService;
public void info(){
System.out.println(tickService.printInfo());
}
}
到这consumer就写好了,接下来就是测试了。
测试
1、首先要打开zookeeper服务
2、先打开provider项目,再打开consumer项目
3、在consumer中写个测试
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.info();
}
}
测试结果如下: