• 【分布式入门】Dubbo


    什么是Dubbo

    在分布式系统中,一个核心部分是远程方法调用,既然有远程方法调用则必须进行远程通信,而Dubbo就是为了解决通信问题而诞生的,这里引用官方的描述:Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

    什么是RPC

    说白了RPC就是一种通信方式,他的目的是使一台计算机可以远程调用另一台计算机上的方法
    简述一下RPC的工作流程
    1.客户端调用client sub传入参数
    2.客户端把参数转为序列化消息
    3.将消息发送给服务端
    4.服务端将数据传给server sub
    5.server sub解析数据
    6.server sub调用服务端方法,并将结果返回客户端
    如果想详细的了解可以参阅在这篇文章:RPC是什么,看完你就知道了

    注册中心

    注册中心有很多种,这里面dubbo中最推荐的是zookeeper注册中心

    zookeeper安装

    前提:安装jdk并配置好java_home环境变量
    zookeeper下载链接
    1.下载zooleeper
    在这里插入图片描述
    2.解压文件,打开bin文件夹,打开cmd 运行bin文件夹中的zkServer.cmd
    这时可能会出现闪退,通过报错信息来判断,如果报错信息如下
    在这里插入图片描述
    检查conf目录下是否有zoo.cfg文件 若没有则复制zoo_sample.cfg并重命名为zoo.cfg
    再次运行zkServer.cmd提示如下信息则表示启动成功
    在这里插入图片描述
    3.使用zkCli.cmd验证
    这时候我们就可以执行zkCli.cmd 执行完毕后显示如下代表执行成功
    在这里插入图片描述
    使用ls /命令可以查看当前存在的键值对
    使用create -e /test 123456命令可以创建key为test value为123456的键值对
    至此Dubbo安装成功

    Dubbo-admin

    dubbo-admin是一个监控管理后台,其作用类似于phpmyadmin。
    dubbo-admin主页
    dubbo-admin发行版
    使用方法:运行注册中心的服务端之后运行dubbo-admin发行版下bin目录下的启动脚本即可
    可能遇到的问题:
    1:
    在这里插入图片描述
    运行zeekeeper服务端即可解决
    2:8080端口被占用,zookeeper部署后, 3.5以后的版本, 会自动占用8080端口. 需要修改配置文件
    我们只需要修改conf/zoo.cfg文件添加 admin.serverPort=8887,之后重新运行zookeeper即可

    创建服务–providerServer

    准备

    创建一个speringBoot项目并添加web模块 起名providerService

    依赖:

            <dependency>
                <groupId>org.apache.dubbogroupId>
                <artifactId>dubbo-spring-boot-starterartifactId>
                <version>3.0.10version>
            dependency>
    
    		<dependency>
    			<groupId>com.github.sgroschupfgroupId>
    			<artifactId>zkclientartifactId>
    			<version>0.1version>
    		dependency>
    		
    		<dependency>
    			<groupId>org.apache.zookeepergroupId>
    			<artifactId>zookeeperartifactId>
    			<version>3.8.0version>
    		dependency>
    
    		
    		<dependency>
    			<groupId>org.apache.curatorgroupId>
    			<artifactId>curator-frameworkartifactId>
    			<version>5.2.1version>
    		dependency>
    		<dependency>
    			<groupId>org.apache.curatorgroupId>
    			<artifactId>curator-recipesartifactId>
    			<version>5.2.1version>
    		dependency>
    		<dependency>
    			<groupId>org.apache.curatorgroupId>
    			<artifactId>curator-x-discoveryartifactId>
    			<version>5.2.1version>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    创建并实现接口

    创建接口

    package com.example.providerserver.service;
    
    public interface TicketService {
        public String getTick();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实现接口

    package com.example.providerserver.service.impl;
    import com.example.providerserver.service.TicketService;
    import org.apache.dubbo.config.annotation.DubboService;
    import org.springframework.stereotype.Service;
    
    //zookeeper 服务注册与发现
    
    @DubboService   //可以被扫描到
    @Service
    public class TickserviceImpl implements TicketService{
    
        @Override
        public String getTick() {
            return "hello tickservice";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    配置文件

    server.port=8081
    #配置应用名
    dubbo.application.name=providerService
    #当前注册中心的访问地址
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    #要扫描注解的包
    dubbo.scan.base-packages=com.example.providerserver.service
    # 防止端口冲突
    dubbo.protocol.port=20881
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行

    先运行zookeeper 再运行本程序及dubbo-admin 在dubbo-admin中可以查看自己创建的服务
    在这里插入图片描述

    创建消费者-consumerServer

    当一个服务器需要调用远程的服务时可以通过以下方式来完成

    准备

    创建springboot项目

    依赖

    依赖方面与providerServer一致

    配置文件

    只需要简单配置应用名和注册中心地址即可

    server.port=8082
    #应用名
    dubbo.application.name=consumerServer
    #注册中心地址
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建远程调用包名

    为保证本地调用不会报错,需要创建所需服务的全类名路径
    在这里插入图片描述
    在这里插入图片描述
    并按远程服务的方法写好对应接口
    在这里插入图片描述

    创建消费者service

    package com.example.consumerserver.service;
    
    import com.example.providerserver.service.TicketService;
    import org.apache.dubbo.config.annotation.DubboReference;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService {
        @DubboReference
        TicketService ticketService;
    
        public void getTicket(){
            System.out.println("取到票=》"+ticketService.getTick());
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里重要的就是DubboReference注解它可以远程引用dubbo服务

    测试

    在test中测试

    package com.example.consumerserver;
    
    import com.example.consumerserver.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class ConsumerServerApplicationTests {
    
        @Autowired
        UserService userService;
    
        @Test
        void contextLoads() {
            userService.getTicket();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    先启动zookeeper和提供者服务
    再运行测试函数
    可以看到控制台输出:
    在这里插入图片描述
    至此,demo搭建完毕

  • 相关阅读:
    手把手教你用AirtestIDE无线连接手机
    Mybatis的关系关联配置
    QT QScrollArea控件 使用详解
    国产时序数据库IotDB安装、与SpringBoot集成
    随想录一刷Day51——动态规划
    LabelImg标注快捷键
    SQL之游标
    一体化运维监控:提供全方位数据洞察
    【深度学习21天学习挑战赛】1、我的手写被模型成功识别——CNN实现mnist手写数字识别模型学习笔记
    网易云信 toB 质量保障体系实践
  • 原文地址:https://blog.csdn.net/qq_35499838/article/details/125939851