zoukankan      html  css  js  c++  java
  • SpringBoot+Dubbo+zookeeper实战

    1.Dubbo的架构图

    首先介绍一下这五个节点的角色(五个圆角矩形框)

    • Provider:暴露服务的服务提供方
    • Consume:调用远程服务的服务消费方

    • Registry:服务注册与发现的注册中心

    • Monitor:统计服务的调用次数和调用时间的监控中心

    • Container:服务运行容器

    再来看一下调用的关系和流程:

    • ① 服务容器负责启动,加载,运行服务提供者

    • ② 服务提供者在启动时,向注册中心注册自己提供的服务

    • ③ 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

    • ④ 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用

    • ⑤ 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

    2.第一个Dubbo案例

    电影票订票

    为了在一台机器上演示,首先创建了一个Maven的空项目,然后分别创建两个子模块:用户服务(服务提供者)provider-server,订单服务(服务消费者)consumer-server

    2.1 创建用户服务(服务提供者)

    在空项目中创建第一个模块provider-server

    创建业务层接口及实现类

    业务层接口:TicketService

    package com.kuang.service;
    
    public interface TicketService {
        public String getTicket();
    }
    

    业务层实现类:TicketServiceImpl

    package com.kuang.service;
    
    import org.apache.dubbo.config.annotation.Service;
    import org.springframework.stereotype.Component;
    
    // zookeeper 服务注册与发现
    // 可以被扫描到,在项目一启动就能自动注册到注册中心
    @Service // 暴露服务
    // 使用了dubbo后尽量不要有service注解
    @Component
    public class TicketServiceImpl implements TicketService {
        @Override
        public String getTicket() {
            return "《大决战》";
        }
    }
    

    application.properties

    server.port=8001
    
    # 服务应用名字
    dubbo.application.name=provider-server
    # 注册中心
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    # 哪些服务要被注册
    dubbo.scan.base-packages=com.kuang.service

    引入依赖:pom.xml

    <!--导入依赖: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>
    
    <!--zkclient-->
    <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>
    <!--日志会冲突-->
    <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.6.0</version>
    <!-- 排除这个slf4j-log4j12-->
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    2.2  创建订单服务(服务消费者)

    在项目中创建第二个模块:consumer-server

     业务层接口:UserService

    package com.kuang.service;
    
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService {
        // 想拿到provider-server提供的票,要去注册中心拿到服务
        @Reference  // 引用服务, pom坐标,可以定义路径相同的接口名
        TicketService ticketService;
    
        public void buyTicket() {
            String ticket = ticketService.getTicket();
            System.out.println("在注册中心拿到=>"+ticket);
        }
    }
    

      为了引用TicketService,可以用pom坐标的方式,也可以定义路径相同的接口名

    两边的接口相同,才能调用到,在consumer-server中也写一个TicketService

    TicketService

    package com.kuang.service;
    
    public interface TicketService {
        public String getTicket();
    }
    

      application.properties

    server.port=8002
    
    # 消费者去哪里拿服务需要暴露自己的名字
    dubbo.application.name=consumer-server
    # 注册中心的地址,可以在任何电脑上!
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    

    2.3 启动

    首先启动zookeeper的zkServer.cmd,zkCli.cmd,双击即可

     

    再开启dubbo-admin,java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

    再启动两个模块的主启动类

    服务提供者:

     

     消费者:

     

    3.在开发过程中遇到的bug

     我的解决办法是将pom.xml中的这两个依赖降级到2.12.0就可以了

     参考:

    https://www.cnblogs.com/xichji/p/14097076.html

    bug调试:

    https://blog.csdn.net/TO_my_honour/article/details/98806550?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

    https://www.cnblogs.com/zhangmingcheng/p/12073818.html

    https://blog.csdn.net/qq_39597203/article/details/86065353?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242

    https://blog.csdn.net/weixin_39816332/article/details/83239307

  • 相关阅读:
    2015/12/26 十六、 八 、二 进制转十进制
    2015/12/25 ① 图灵测试 ② 安装jdk出现的问题 ③ 配置环境变量
    java如何产生随机数
    二分查找法
    冒泡排序法
    计算阶乘
    九九乘法小练习
    数组循环语句练习
    经典循环例题练习
    如何用循环语句输出一个三角形
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14929899.html
Copyright © 2011-2022 走看看