美文网首页
Dubbo学习(二):开发第一款Dubbo程序

Dubbo学习(二):开发第一款Dubbo程序

作者: 程序员网址导航 | 来源:发表于2019-11-01 21:10 被阅读0次

    前言

    这篇文章主要从搭建Dubbo程序开发所需环境、编写Dubbo服务器和客户端、构建并运行我的第一款Dubbo应用程序三个方面来记录Dubbo学习的第二篇文章。

    配置开发环境

    要编译和运行本片文章相关代码,会使用JDK和Maven这两个工具,其他工具都是辅助性的。

    下载并安装JDK

    首先检查系统是否已经安装好了JDK,在终端输入命令:

    java -version
    

    终端打印如下信息,则可以会略JDK安装(已成功安装):

    image.png

    否则,可以用在 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 中下载最新的JDK8.注意:下载时候需要针对自己的操作系统去下载。

    windowns平台下需要做一些手动配置,可以参考 windows开发环境搭建手册

    下载并安装IDE

    下面是当前比较流行的IDE工具下载地址,可以免费获取这些工具:
    (1)Intellij IDEA : www.jetbrains.com
    (2)Eclipse:www.eclipse.org
    (3)NetBeans:www.netbeans.org
    (4)visual Studio Code:www.visualstudio.micresoft.com

    这里推荐Intellij IDEA,因为IDEA的功能非常齐全。

    下载并配置Maven

    可以在 http://maven.apache.org/中下载Maven。和配置JDK一样简单,首先下载的Maven解压缩到任意目录,我们称为【安装目录】,在【安装目录】中包含类似apache-maven-x.x.x 的文件夹。
    然后我们可以参考一下操作进行环境变量的配置:

    Mac/Linux系统:
    (1)将环境变量M2_HOME 指向【安装目录】/apache-maven-x.x.x。
    (2)将$M2_HOME/bin添加到可执行路径,方便在中断执行Maven命令。

    Windows系统:
    (1)将环境变量M2_HOME指向【安装目录】/apache-maven-x.x.x。
    (2)将%M2_HOME%\bin添加到可执行路径,方便在终端执行Maven命令。

    image.png

    比如我的是解压到/usr/local下:


    image.png

    maven环境变量配置:

    image.png

    中断输入 mvn -v 验证maven是否安装配置正常,正常情况打印如下信息:

    image.png

    下载并配置Zookeeper

    尽管Zookeeper不是必需的,但是在生产环境中已经大量使用Zookeeper作为Dubbo注册中心。为了深入理解Dubbo,这里给出配置单机Zookeeper的步骤,方便本地启动Dubbo。在 http://mirrors.shu.cn/apache/zookeeper/ 中下载最新的版本。

    以3.5.6版本为例:
    (1)加压缩apache-zookeeper-3.5.6.tar.gz 文件到任意目录(这里我还是选用/usr/local下)。
    (2)将环境变量ZOOKEEPER_HOME指定【安装目录】/apache-zookeeper-3.5.6
    (3)将${ZOOKEEPER_HOME}/bin 添加到可执行路径,方便在终端执行ZK命令。
    在【安装目录】\apache-zookeeper-3.5.6\conf 中复制一份zoo_sample.cfg 并重命名为zoo.cfg, 然后在终端执行 zkServer.sh start 即可,默认会监听 2181 端口。

    解压目录:

    image.png

    Zookeeper环境变量配置:

    image.png

    启动Zookeeper:

    image.png

    使用IDEA调试Dubbo源码

    1. 下载源码

    这里下载最新版本的2.7.4.1,首先登陆并访问GitHub https://github.com/apache/dubbo, 可选择git或者Zip包任一下载方式:

    image.png

    使用Git的话,先选择指定目录,执行Git clone命令,等待工程下载完毕即可:

    git clone https://github.com/apache/dubbo.git
    
    2.导入工程

    将工程导入IDE,导入后结构如下:

    下面对几个核心模块做进一步说明,可以对比我的上一篇文章Dubbo学习(一):什么是Dubbo
    中的Dubbo分层一起理解下:

    image.png
    3.安装dubbo admin

    方法1、解压后,根目录里存在dubbo-admin,进入 mvn package -Dmaven.test.skip=true 安装完后,生成target目录,进入这个目录,找到dubbo-admin这个目录,把这个目录全部copy到tomcat的目录webapps下的ROOT下面(删除tomcat webapps目录下ROOT原有内容)

    方法2、解压后,根目录里存在dubbo-admin,进入 mvn install -Dmaven.test.skip=true 安装完后,生成target目录,进入这个目录,找到dubbo-admin.war,把这个war包copy到tomcat的目录webapps下的ROOT下面(删除tomcat webapps目录下ROOT原有内容),然后使用jar xvf dubbo-admin.war解压war包,把解压后的内容全部放到ROOT目录下

    启动tomcat,就可以看到dubbo-admin的界面,默认帐号密码root/root

    image.png

    启动tomcat方法:进入目录/home/admin/apache-tomcat-8.5.24/bin,然后执行

    ./startup.sh
    
    4.代码调试

    如果只是想进行一个简单的Dubbo调用演示,那么我们可以使用dubbo-demo模块,该模块可以演示一个完整的消费者调用服务提供者的过程。

    首先需要启动dubbo-demo-provider,然后启动dubbo-demo-consumer,直接运行对应模块的main方法即可。由于Demo使用的是广播模式,所以需要先启动Provider。此时Consumer不断的调用Provider的com.alibaba.dubbo.demo.DemoService#sayHello,这里刚安装了Zookeeper,所以我想顺便测试一下ZK是否连接正常,我将dubbo-provider和dubbo-consumer的配置修改为发布订阅的方式,配置我的ZK地址。

    image.png

    Consumer消费控制台打印结果如下:

    image.png

    同时我的Dubbo Admin可以看到这个新注册的服务信息:

    image.png

    实现我的第一个Dubbo程序

    Dubbo实现的方式有多种:基于XML配置基于注解方式基于API实现

    这里我将以XML实现为例演示,其他方式实现原理一样的,感兴趣可以去了解下,示例很简单:服务器会接收到客户端发来的消息,然后将消息不做任何处理返回给客户端。

    所有的Dubbo服务接口都可以直接通过配置对外暴露,但用户不需要额外编写服务暴露的代码,因为这些都被Dubbo框架隐藏了,用于减低框架的使用门槛,我们只需要专注一下内容:
    (1)关注业务场景,编写面向接口的业务代码
    (2)少量的启动配置,比如配置中心和暴露的协议等

    说明:为了便于演示和理解,这里我使用SpringBoot分别搭建两个应用dubbo-provider与dubbo-consumer来演示这个服务注册与发现的流程,也能加深对Dubbo的理解。spring boot应用快速搭建及配置可参考我的这篇文章: SPRINGBOOT基础、亮点及轻松搭建SPRINGBOOT项目

    基于XML实现

    Dubbo框架时面向接口的RPC调用框架,需要提供一个新的接口来作为服务暴露的使用,该接口会响应传入的消息。

    首先需要引入dubbo、zookeeper相关依赖到Spring Boot的pom.xml:

    <!--dubbo 依赖 -->
            <dependency>
                <groupId>com.alibaba.spring.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.0.0</version>
            </dependency>
            
            <!-- zookeeper client依赖 -->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.10</version>
            </dependency>
    

    修改配置application.properties:

    spring.application.name=dubbo-provider
    server.port=8088
    
    zookeeper.hosts=zookeeper://远程或者本地ZK地址:2181
    

    比如,首先我需要在dubbo-provider项目中声明并暴露一个MessageXMLService.java的接口:

    接口定义:

    package com.dubbo.dubboprovider.service;
    
    /**
     * @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
     * @Date: 2019-11-1 0001 0:28
     * @Description: 无描述信息
     */
    public interface MessageXMLService {
    
        String message(String msg);
    }
    

    实现类:

    package com.dubbo.dubboprovider.service.impl;
    
    import com.dubbo.dubboprovider.service.MessageXMLService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
     * @Date: 2019-11-1 0001 0:28
     * @Description: 无描述信息
     */
    public class MessageXMLServiceImpl implements MessageXMLService {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(MessageXMLServiceImpl.class);
    
        @Override
        public String message(String msg) {
            LOGGER.info("dubbo provider receive message: {}", msg);
            return msg+": 嘻嘻嘻";
        }
    }
    

    resource下创建一个spring文件夹,在spring文件夹下创建dubbo-provider.xml,内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <!-- 服务提供方应用名称,方便于依赖跟踪 -->
        <dubbo:application name="dubbo-provider"/>
    
        <!-- 使用远程的Zookeeper作为注册中心 -->
        <dubbo:registry address="${zookeeper.hosts}"/>
    
        <!-- 只用Dubbo协议并且指定监听20880端口 -->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <!-- 通过XML方式吧实现配置为Bean, 让Spring托管和实例化 -->
        <bean id="messageXMLService" class="com.dubbo.dubboprovider.service.MessageXMLServiceImpl"/>
    
        <!-- 声明要暴露的服务 -->
         <!-- 声明要暴露的服务 -->
        <dubbo:service interface="com.dubbo.dubboprovider.service.MessageXMLService" ref="messageXMLService" version="0.0.1"/>
    </beans>
    

    修改springBoot启动类,引入XML配置:

    package com.dubbo.dubboprovider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ImportResource;
    
    // 引入配置
    @ImportResource("classpath:spring/dubbo-provider.xml")
    @SpringBootApplication
    public class DubboProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboProviderApplication.class, args);
        }
    
    }
    

    dubbo-consumer:

    1. 同样需要引入上面的dubbo有zookeeper依赖,同时需要引入provider client的jar依赖。

    2.编写一个Controller,依赖MessageXMLService:

    @RestController
    @RequestMapping("/api")
    public class ConsumerController {
    
        @Autowired
        MessageXMLService messageXMLService;
    
        @GetMapping("/send/{msg}")
        public String send(@PathVariable String msg){
           return messageXMLService.message(msg);
        }
    }
    

    3.配置dubbo-consumer.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <!-- 服务提供方应用名称,方便于依赖跟踪 -->
        <dubbo:application name="dubbo-provider"/>
    
        <!-- 使用远程的Zookeeper作为注册中心 -->
        <dubbo:registry address="${zookeeper.hosts}"/>
    
        <!-- 只用Dubbo协议并且指定监听20880端口 -->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <dubbo:reference id="messageXMLService" interface="com.dubbo.dubboprovider.service.MessageXMLService"
                         version="0.0.1" timeout="5000" check="false"/>
    </beans>
    

    测试结果:

    image.png

    总结

    这篇文章主要从搭建Dubbo程序开发所需环境、Dubbo Admin搭建,编写Dubbo服务器和客户端、构建并运行我的第一款基于XML配置实现的dubbo服务。

    更多个人博客,欢迎访问我的个人博客网:Tec博客

    相关文章

      网友评论

          本文标题:Dubbo学习(二):开发第一款Dubbo程序

          本文链接:https://www.haomeiwen.com/subject/harxbctx.html