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

      

  • 相关阅读:
    kubernetes 之配置问题
    awk 输入文件包含某个关键字的整行记录或者某个字段
    Kubernetes资源在线生成工具
    使用print计算一串字符串各字符出现的个数
    Kubernetes 部署可视化dashboard管理面板
    nexus 3.37.302安装
    阿里云免费证书验证,nginx返回403,/.wellknown/pkivalidation/
    通过docker安装openldap并通过ldapadmin配置用户与第三方软件集成ldap配置
    kubernetes创建storageclass
    k8s快速生成一个deploymenet的yaml文件
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14359694.html
Copyright © 2020-2023  润新知