11、分布式Dubbo+Zokeeper+SpringBoot

分布式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. 消费者消费服务测试,结果:

  

原文地址:https://www.cnblogs.com/zhangzhixi/p/14359694.html