zoukankan      html  css  js  c++  java
  • 【java框架】SpringBoot(5)--SpringBoot整合分布式Dubbo+Zookeeper

    1.理论概述

    1.1.分布式

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

    由多个系统集成成一个整体,提供多个功能,组合成一个板块,用户在使用上看起来是一个服务。(比如淘宝网)。

    起源

    分布式系统出现的原因是:用多个廉价的、普通的机器完成单个计算机无法完成的计算、存储任务

    分布式使用

    只有单个节点处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(内存、磁盘、CPU)高昂得不偿失的时候,应用程序也不能进一步优化的时候,才考虑分布式。

    因为分布式系统是建立在网络之上的软件系统,网络是不安全不稳定的,所以会带来单系统没有的问题,为了解决这些问题,又引入更多的机制、协议,带来更多的问题。

    集群与分布式区别

    【集群】:多个相同的微服务,提供同一个功能

    【分布式】:多个不同功能的微服务,提供不同的功能

    1.2.RPC

    Remote Procedure Call 远程过程调用

    远程调用另外一台机器上的方法,RPC只是一种理论,不是协议。

    1.3.Dubbo

    概念

    Dubbo是一个高性能、轻量级、开源的Java RPC框架。

    提供三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册与发现。

    执行流程

    调用关系说明:

    1. 服务容器负责启动,加载,运行服务提供者。
    2. 服务提供者在启动时,向注册中心注册自己提供的服务。
    3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
    4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    2.Linux下安装zookeeper和dubbo-admin

    软件说明

    zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 (==类似于Eureka==)。

    dubbo-admin是管理控制台,可以实现服务监控 (即查看注册中心情况),不安装也是可以的。

    2.1.下载并安装zookeeper

    ①到zookeeper官网镜像:https://mirror.bit.edu.cn/apache/zookeeper/,下载zookeeper

    注意3.5.x版本以上需要下载:

    apache-zookeeper-3.5.9-bin.tar.gz 15-Jan-2021 03:46  9.2M  
    tar.gz是源码包,执行启动无法运行

    ②下载完毕后通过Xftp发送到Linux服务器上的home目录下(目录可根据个人喜好),解压并进入conf目录下复制配置文件;

    cp zoo.zoo_sample.cfg zoo.cfg

    ③需要同步修改zoo.cfg文件:

    ④返回上一层目录并进入bin子目录,执行命令:./zkServer.sh start启动zookeeper

     

    操作zookeeper其余命令:

    ./zkServer.sh stop   
    ./zkServer.sh restart
    ./zkServer.sh status

    启动zookeeper过程中可能由于远端Linux云服务器防火墙未关闭报:java.net.NoRouteToHostException: No route to host dubbo-admin,

    需要关闭防火墙:解决方法

    2.2.下载安装dubbo-admin

    ①下载dubbo-admin并修改配置:

    进入GitHub下载:https://github.com/apache/dubbo-admin/tree/master

    解压并修改application.properties文件,配置文件在dubbo-adminsrcmain esources目录下

    ②打包dubbo-admin项目,将dubbo-admin项目编译打成jar包:

    在项目目录下执行cmd命令:

     打包:

    输入命令:mvn clean package -Dmaven.test.skip=true

    将项目target目录下生成的jar上传到Linux系统并执行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar &命令,开放7001端口,在浏览器便可访问。

     

    初始登录账户和密码都是root

    3.SpringBoot整合Dubbo+Zookeeper

    3.1.创建服务提供者provider

    ①先创建一个空项目,在空项目下以SpringBoot为基础创建一个子模块。

     

    ②导入dubbo、zookeeper相关依赖包:

       <!-- 导入依赖 Dubbo + Zookeeper -->
       <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
       <dependency>
           <groupId>org.apache.dubbo</groupId>
           <artifactId>dubbo-spring-boot-starter</artifactId>
           <version>2.7.3</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
       <dependency>
           <groupId>com.github.sgroschupf</groupId>
           <artifactId>zkclient</artifactId>
           <version>0.1</version>
       </dependency>
       <!-- 日志冲突 -->
       <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
       <dependency>
           <groupId>org.apache.curator</groupId>
           <artifactId>curator-framework</artifactId>
           <version>2.12.0</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
       <dependency>
           <groupId>org.apache.curator</groupId>
           <artifactId>curator-recipes</artifactId>
           <version>2.12.0</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
       <!--zookeeper的版本与自己安装的保持一致-->
       <dependency>
           <groupId>org.apache.zookeeper</groupId>
           <artifactId>zookeeper</artifactId>
           <version>3.5.9</version>
           <exclusions>
               <exclusion>
                   <groupId>org.slf4j</groupId>
                   <artifactId>slf4j-log4j12</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

    application.properties配置:

    server.port=8001
    
    #服务应用名字
    dubbo.application.name=provider-server
    #注册中心地址
    dubbo.registry.address=zookeeper://139.155.203.191:2181
    #哪些包下面的服务需要被注册
    dubbo.scan.base-packages=com.fengye.service

    或yml格式:

    server:
      port: 8080
    dubbo:
      # 服务应用名字
      application:
        name: provider-server  
      # 注册中心地址(zookeeper地址)
      registry:
        address: zookeeper://ip:2181
      # 哪些服务要被注册
      scan:
        base-packages: com.fengye.service

    ③创建接口并实现接口提供服务(模拟售票):

    //接口
    public interface TicketService {
        public String buyTicket();
    }
    
    @Component  //使用dubbo后尽量不要使用Service注解
    @Service  //标识可以被dubbo扫描到,项目启动后就注册到注册中心
    public class TicketServiceImpl implements TicketService {
        @Override
        public String buyTicket() {
            return "成功购票一张";
        }
    }

    ④启动此服务,便可以在dubbo-admin中发现服务:

    3.2.创建服务消费者consumer

    ①第一步、第二步与provider模块创建、导入依赖坐标相同;

    配置application.properties:

    server.port=8002
    #消费者去哪里取服务需要暴露自己的名称
    dubbo.application.name=consumer-service
    #配置注册中心的地址
    dubbo.registry.address=zookeeper://139.155.203.191:2181

    ②创建消费者接口(必须和服务提供者接口方法名一样,表示引用远端、执行方法调用):

    public interface TicketService {
        //定义和远端服务提供者provider相同的接口名称
        public String buyTicket();
    }

    ③创建消费者UserServie:

    @Service
    public class UserService {
        //在消费者中使用dubbo订阅远程服务:使用dubbo提供的@Refence注解
        @Reference
        private TicketService ticketService;
    
        public void getTicket(){
            String ticket = ticketService.buyTicket();
            System.out.println("从注册中心拿到:" + ticket);
        }
    }

    ④启动消费者服务,可以看到服务在dubbo-admin中已经注册:

    3.3.测试消费者远程调用服务者拿数据

    ①在消费者方本地创建测试方法,执行方法:

    @SpringBootTest
    class ConsumerServerApplicationTests {
    
        @Autowired
        private UserService userService;
        @Test
        void contextLoads() {
            //获取售票数据
            userService.getTicket();
        }
    
    }

    成功调用可以看到远端服务提供者方法已被调用:

    本博客写作参考文档相关:

    https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/

    https://www.kuangstudy.com/bbs/1355164021359243266

    https://www.kuangstudy.com/bbs/1371400397700218882

    示例代码已上传至Github地址:

    https://github.com/devyf/SpringBoot_Study/springboot_dubbo_zk

  • 相关阅读:
    物理层的三种编码方式
    Mysql中eft join、right join、inner join的区别
    Linux常用命令
    Linux中文件颜色所代表的属性和颜色
    phpcms v9 中的数据库操作函数
    NetBeans无法使用编码GBK安全打开文件
    PHP中的一些常用正则表达式
    eureka强制下线上线
    perl(JSON) is needed by mysql-community-test-5.7.30-1.el7.x86_64
    利用TikZ 宏包在 LaTeX 中绘制流程图
  • 原文地址:https://www.cnblogs.com/yif0118/p/14577974.html
Copyright © 2011-2022 走看看