分布式Dubbo+Zokeeper+SpringBoot的简介以及安装
什么是分布式系统?
在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”;
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
分布式系统(distributed system)是建立在网络之上的软件系统。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。
什么是RPC:
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。
即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数;
Dobbo基本概念:
- 服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明:
服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Windows下安装zookeeper:
1、下载zookeeper:
http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.9/
注意:这里解压系统会提示是覆盖还是跳过,选择全部跳过即可
2、安装zookeeper
1、双击zkServer.cmd ,第一次使用可能遇到闪退问题
2、解决方案:编辑zkServer.cmd文件,在最后加上pause,查看错误信息
错误信息:
3、错误提示我们缺少zoo.cg文件,我们修改zoo.cfg配置文件:
3、开启服务
查看客户端节点:
安装Dubbo:
1、下载dubbo-admin
地址 :https://github.com/apache/dubbo-admin/tree/master
2、指定zookeeper地址
进入dubbo-adminsrcmain esourcesapplication.properties 指定zookeeper地址
server.port=7001 spring.velocity.cache=false spring.velocity.charset=UTF-8 spring.velocity.layout-url=/templates/default.vm spring.messages.fallback-to-system-locale=false spring.messages.basename=i18n/message spring.root.password=root spring.guest.password=guest dubbo.registry.address=zookeeper://127.0.0.1:2181
3、打包dubbo-admin
注:这里要配置maven的环境变量才可以使用mvn命令
进入到解压dubbo的根目录下,进入命令行模式使用命令: mvn clean package -Dmaven.test.skip=true
第一次打包的过程有点慢,耐心等待下,成功页面:
4、使用
打包完成后会在dubbo-admin下生成一个target,里面有一个jar包,运行它:
使用命令java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
【注意:zookeeper的服务一定要打开!就是那个zkServer.cmd
5、登录
访问localhost:7001即可访问Dubbo-admin页面
用户名:root
密码:root
zookeeper :注册中心 dubbo-admin!是-一个监控管理后台~查看我们注册了哪些服务,哪些服务被消费了~ Dubbo: jar包~
分布式Dubbo+Zokeeper+SpringBoot测试
一、框架搭建
1. 启动zookeeper注册中心 !
2、启动dubbo,localhost:7001进入监控页面
二、创建服务提供者:provider-server
1、 IDEA创建一个空的spring-web项目;
2、pom依赖
将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包
我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包
以及zookeeper的包
<!--dubbo依赖包--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!--zookeeper依赖包--> <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> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
3、项目创建完毕,我们写一个服务,比如取东西的服务
com.zhixi.service/TicketService
1 /** 2 * @author zhangzhixi 3 * 服务提供者 4 */ 5 public interface TicketService { 6 public String getTicket(); 7 }
com.zhixi.service/TicketServiceImpl
注意:@Service 注解不是spring包下的,而是dubbo包的
如果使用的版本是2.7.7在提供服务的类上使用的是 @DubboService 注解、
1 import org.apache.dubbo.config.annotation.Service; 2 import org.springframework.stereotype.Component; 3 4 /** 5 * @author zhangzhixi 6 */ 7 @Component //放在容器中 8 @Service//将服务发布出去 9 public class TicketServiceImpl implements TicketService { 10 @Override 11 public String getTicket() { 12 return "《Easy Code》"; 13 } 14 }
逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!
4、在spring中配置dubbo的相关属性
# 应用服务 WEB 访问端口 server.port=8001 #当前应用名字 dubbo.application.name=springboot-10-provider-server #注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #扫描指定包下服务 dubbo.scan.base-packages=com.zhixi.service
5、开启服务提供者
三、创建服务消费者:sonsumer-server
1、导入依赖,和之前的依赖一样
<!--dubbo依赖包--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!--zookeeper依赖包--> <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> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
2、spring配置dubbo参数
# 应用服务 WEB 访问端口 server.port=8002 #当前应用名字 dubbo.application.name=springboot-10-consumer-server #注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
3、编写消费者服务
本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同;
即:复制服务提供者TicketService,到消费的service目录下
com.zhixi.service/UserService
1 import org.apache.dubbo.config.annotation.Reference; 2 import org.springframework.stereotype.Service; 3 4 @Service //注入到容器中 5 public class UserService { 6 7 //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全类名 8 @Reference 9 TicketService ticketService; 10 11 public void bugTicket() { 12 String ticket = ticketService.getTicket(); 13 System.out.println("在注册中心拿到:" + ticket); 14 } 15 }
4、测试类编写
@SpringBootTest class Springboot10ConsumerServerApplicationTests { @Autowired UserService userService; @Test void contextLoads() { userService.bugTicket(); } }
四、测试
1. 开启zookeeper
2. 打开dubbo-admin实现监控:localhost:7001
3. 开启服务者服务
4. 消费者消费服务测试,结果: