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

前言

这篇文章主要从搭建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博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容