• Dubbo实战教程


    “Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。”
    RPC翻译过来叫做远程过程调用(Remote Process Call),我们为什么需要RPC框架?
    HTTP了解过吧,平常我们的Web项目,从网页向服务端发起请求,用的就是HTTP协议
    当然,服务端和服务端之间也可以通过HTTP来进行交互,不过HTTP底层是使用TCP进行传输(三次握手,四次挥手),对服务来说:“太重了”,服务和服务之间的调用不需要例如HTTP的一些东西,比如:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    Content-Length: 137521
    Expires: Thu, 05 Dec 2019 16:00:00 GMT
    Last-Modified: Wed, 5 August 2019 15:55:28 GMT
    Server: Apache 0.84
    <html>
     <body>Hello xdclass</body>
    </html>
    

    所以,RPC诞生了,它是专为分布式而生,是一个轻量级的“HTTP”,同时为分布式服务提供“负载均衡”“服务发现”“熔断降级”等功能
    PS:很多同学不想学新技术的很大一个原因在于:不知道怎么学起,官方文档太多,看着太枯燥,B站大学内容丰富,但动则几百个小时,让人失去耐心,大家都想速成,迅速掌握一个知识点或者一门技术。在这里我和大家分享一个skill,我自己学习的方法是:先广,而深;先用,再精。
    先广而深,其实就是一个量变到质变的过程,先广泛的用,不管什么技术,我自己先实战一遍,既然这门技术是趋势,我就先学,底层什么原理都不管,会用就行。
    先用后精,当你已经能够熟练使用一门技术的时候,你就应该去探索它的底层实现了,因为使用的门槛低啊,而且之前积累了那么多知识后,再去了解它的底层实现,自然水到渠成,因为大道至简,很多东西都是相通的。
    好了,不多BB,看下实战吧。

    1、创建工程 demo-dubbo-parent

    为了方便,就不创多个工程了,使用多模块的开发。

    1.1创建一个Maven项目

    image.png

    1.2.引入依赖

    这是完整的 pom.xml文件,可以直接复制过去

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
    
        <groupId>org.xiaofengstu</groupId>
        <artifactId>demo-dubbo-parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <artifactId>spring-boot-starter-parent</artifactId>
            <groupId>org.springframework.boot</groupId>
            <version>2.3.5.RELEASE</version>
        </parent>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                    <version>2.3.7.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <version>2.3.7.RELEASE</version>
                </dependency>
    
                <!-- dubbo 依赖 -->
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo-spring-boot-starter</artifactId>
                    <version>3.0.8</version>
                </dependency>
    
                <!-- 注册中心 zk 依赖 -->
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                    <version>5.2.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-framework</artifactId>
                    <version>5.2.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-x-discovery</artifactId>
                    <version>5.2.1</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    

    2、创建 api 模块

    这里爆红是因为我之前创过一次,所以大家创建的时候是没有问题的
    image.png
    这个 module 不需要引入依赖,只需要写一个接口就行
    image.png

    3、创建 provider 模块

    方法和创建 api module 一样,不过 pom.xml 需要改动

    3.1.引入依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>demo-dubbo-parent</artifactId>
            <groupId>org.xiaofengstu</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>provider</artifactId>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <artifactId>api</artifactId>
                <groupId>org.xiaofengstu</groupId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                </dependency>
    
                <!-- dubbo 依赖 -->
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo-spring-boot-starter</artifactId>
                </dependency>
    
                <!-- 注册中心 zk 依赖 -->
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-framework</artifactId>
                    <version>5.2.1</version>
                </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-x-discovery</artifactId>
                <version>5.2.1</version>
            </dependency>
        </dependencies>
    
    </project>
    

    这也是完整的 pom.xml 文件,可以直接拷贝,这里把 api module 打包进来了,一会儿需要写个子类去实现刚刚在 api module 中写的接口。

    package com.xiaofengstu.dubbo.service;
    
    import org.apache.dubbo.config.annotation.DubboService;
    
    /**
     * @Author FengZeng
     * @Date 2022-06-19 20:37
     * @Description TODO
     */
    @DubboService
    public class DemoDubboServiceImpl implements DemoDubboService {
    
      @Override
      public String demo(String param) {
        System.out.println("provider的demo方法被调用。。。");
        return param + "123";
      }
    
    }
    

    还需要写一个启动类,因为是Springboot项目嘛

    package com.xiaofengstu.dubbo;
    
    import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @Author FengZeng
     * @Date 2022-06-19 20:44
     * @Description TODO
     */
    @SpringBootApplication
    @EnableDubbo
    public class ProviderApplication {
      public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class);
      }
    }
    

    3.2.配置文件

    dubbo:
      application:
        name: dubbo-provider
      registry:
        address: zookeeper://127.0.0.1:2181
      protocol:
        name: dubbo
        port: 20881
    

    provider module 目录结构如下:
    image.png

    4、创建 consumer 模块

    4.1.引入依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>demo-dubbo-parent</artifactId>
            <groupId>org.xiaofengstu</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>comsumer</artifactId>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <artifactId>api</artifactId>
                <groupId>org.xiaofengstu</groupId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- dubbo 依赖 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
            </dependency>
    
            <!-- 注册中心 zk 依赖 -->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>5.2.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-x-discovery</artifactId>
                <version>5.2.1</version>
            </dependency>
        </dependencies>
    
    </project>
    

    4.1.创建 service

    package com.xiaofengstu.service;
    
    /**
     * @Author FengZeng
     * @Date 2022-06-19 20:50
     * @Description TODO
     */
    public interface DemoService {
      public String demo();
    }
    
    

    实现类:

    package com.xiaofengstu.service.impl;
    
    import com.xiaofengstu.dubbo.service.DemoDubboService;
    import com.xiaofengstu.service.DemoService;
    import org.apache.dubbo.config.annotation.DubboReference;
    import org.apache.dubbo.config.annotation.DubboService;
    import org.springframework.stereotype.Service;
    
    /**
     * @Author FengZeng
     * @Date 2022-06-19 20:51
     * @Description TODO
     */
    @DubboService
    @Service
    public class DemoServiceImpl implements DemoService {
    
      @DubboReference(loadbalance = "RoundRobin")
      private DemoDubboService demoDubboService;
    
    
      @Override
      public String demo() {
          
        return demoDubboService.demo("张三丰");
      }
    }
    
    

    写一个Controoler 对外进行访问:

    package com.xiaofengstu.controller;
    
    import com.xiaofengstu.service.DemoService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author FengZeng
     * @Date 2022-06-19 20:56
     * @Description TODO
     */
    @RestController
    public class DemoController {
    
      @Autowired
      private DemoService demoService;
    
      @RequestMapping("/demo")
      public String demo() {
        System.out.println("开始远程调用。。。");
        return demoService.demo();
      }
    }
    

    4.2.配置文件

    dubbo:
      application:
        name: dubbo-consumer
      registry:
        address: zookeeper://127.0.0.1:2181
    

    consumer module 的目录结构如下:
    image.png

    5、启动项目

    dubbo 需要注册中心,官方推荐的是 zookeeper,所以还需要启一个 zookeeper
    如果图方便,可以参考我使用 docker 部署 zk 服务,传送门

    1. 启动 provider module
    2. 启动 consumer module
    3. 访问 localhost:8080/demo

    控制台输出:
    image.png
    image.png
    到此,我们已经完整的实现了一次 dubbo 的rpc 调用。

    6、dubbo的注解

    因为是使用的 Springboot项目,所以需要在启动类上添加 @EnableDubbo注解。
    Dubbo被调用的服务需要加上 @DubboService注解
    注意Dubbo的服务需要加上 @DubboReference注解
    同时,这些注解也是会被 Spring 进行管理的,原因在 @EnableDubbo上。
    源码我放在 gitee 上了,不清楚的同学可以下载下来学习。gitee地址

  • 相关阅读:
    enca工具,检测文件编码
    ubuntu 支持gbk
    LinkedList线程安全问题
    php防止form重复提交的方法
    Linux 内存泄露调试工具
    从B树、B+树、B*树谈到R 树
    Ubuntu 语言设置
    wwwauthenticate
    Lua脚本语法说明
    jQuery学习总结之元素的相对定位和选择器持续更新中
  • 原文地址:https://www.cnblogs.com/Fzeng/p/16393290.html
Copyright © 2020-2023  润新知