Dubbo 基础篇 (一) - hello world

开发环境
Dubbo 架构
  • 服务提供方
  • 服务消费方
  • 注册中心 (使用zookeeper作为本例注册中心)
  • 监控中心
准备工作

为了更好的理解Dubbo的工作流程,我们先下载dubbo源码和管理后台源码

# 下载dubbo源码
git clone git@github.com:freeseawind/incubator-dubbo.git

# 下载管理后台源码
git clone https://github.com/dubbo/dubbo-ops.git 

使用以下命令分别做一次构建,然后我们可以和好基友happy的去玩两把游戏等待编译结束

mvn clean install -Dmaven.test.skip

N分钟后,自从Dubbo “高富帅“ 以后,这个构建流程就越来越麻麻dei(慢)了。好吧,这咱都能忍,但是what竟然编译失败,这简直不能忍。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
6.0:testCompile (default-testCompile) on project dubbo-config-spring: Compilatio
n failure -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
ch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
eption
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command

[ERROR]   mvn <goals> -rf :dubbo-config-spring

嗯、啊、唉,研究了半天还是无果,决定先跳过dubbo-config-spring的编译,如果有知道的朋友欢迎告知本菜 (T T)。

编码时刻

我们使用spring boot 2.x + dubbo 来作为本次学习的例子

使用xml配置方式见官方DEMO, 这里演示如何在spring boot 2中运行Dubbo 的 hello world

1. 创建Maven项目
├── copycat-dubbo
│   ├── pom.xml
│   └── copycat-dubbo-example
│       └── src/main/java
│       └── src/main/resource
│           └── dubbo.properties
│           └── log4j.properties
│           └── application-customer.properties
│           └── application.properties
│       └──  pom.xml

copycat-dubbo项目pom文件部分配置如下:

  <!-- 以上部分忽略-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.6.2</version>
            </dependency>
                        <!-- zookeeper依赖包 -->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-client</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.0.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

copycat-dubbo-example项目pom文件部分配置如下:

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
2. 定义服务接口和实现
定义服务接口
public interface DemoService
{
    String sayHello(String name);
}
定义接口实现
@Service(timeout = 5000)
public class DemoServiceImpl implements DemoService
{
    @Override
    public String sayHello(String name)
    {
        return "Hello " + name;
    }
}

细心的朋友会发现在接口的实现上,增加了@Service(timeout = 5000)的注解,这个注解的主要作用是暴露和注册服务。

3. 服务消费者
服务消费者配置
@Configuration
public class ConsumerConf
{
    @Bean
    public ApplicationConfig applicationConfig()
    {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("consumer-test");
        return applicationConfig;
    }

    /**
     * 服务消费者配置
     * 
     * @author freeseawind
     * @return
     */
    @Bean
    public ConsumerConfig consumerConfig()
    {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(3000);
        return consumerConfig;
    }

    /**
     * 注册中心配置
     * 
     * @author freeseawind
     * @return
     */
    @Bean
    public RegistryConfig registryConfig()
    {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("curator");
        return registryConfig;
    }
}

这里的配置信息只是把xml替换成API的方式,通过Spring的IOC容器对Bean进行管理。详见API 参考手册schema 配置参考手册

消费者启动类
@SpringBootApplication
@Controller
@DubboComponentScan(basePackages = "github.freeseawind.springboot.helloworld.consumer")
public class ConsumerApplication
{
    @Reference
    private DemoService demoService;
    
    public static void main(String[] args)
    {
        SpringApplication.run(ConsumerApplication.class, args);
    }
    
    @RequestMapping("/a")
    @ResponseBody
    public String sayHello()
    {
        return demoService.sayHello("freeseawind");
    }
}

@DubboComponentScan 是Dubbo自定义bean加载的扩展。它在消费方主要的作用是,扫描需要注入的服务接口(该服务接口以@Reference注解标识),同时向注册中心发起注册消费者服务请求。

3. 服务提供者
服务提供者配置
@Configuration
public class ProviderConf
{
    @Bean
    public ApplicationConfig applicationConfig()
    {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("provider-test");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig()
    {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("curator");
        return registryConfig;
    }
    
    @Bean
    public ProtocolConfig protocolConfig()
    {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setPort(20881);
        protocolConfig.setName("dubbo");
        return protocolConfig;
    }
}
服务提供者启动类
@SpringBootApplication
@EnableAutoConfiguration
@DubboComponentScan(basePackages = "github.freeseawind.service.impl")
public class ProviderApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

@DubboComponentScan 扫描的是服务接口的实现(该实现以@Service注解标识),同时向注册中心发起注册服务提供者请求。

顺序启动服务
  • 注册中心
  • 服务提供者
  • 服务消费者
  • 管理后台
1. 启动注册中心

2. 启动服务提供者

截取部分启动日志如下

[DUBBO] Export dubbo service github.freeseawind.service.DemoService to url dubbo://169.254.63.31:20881/
[DUBBO] Start NettyServer bind /0.0.0.0:20881, export /169.254.63.31:20881
[DUBBO] Subscribe: provider://169.254.63.31:20881/github.freeseawind.service.DemoService?
3. 启动服务消费者

配置启动参数


启动参数配置

截取部分启动日志如下

[DUBBO] Subscribe: consumer://169.254.63.31/github.freeseawind.service.DemoService?
[DUBBO] Successed connect to server /169.254.63.31:20881 from NettyClient 169.254.63.31
[DUBBO] Start NettyClient xiaolong-PC/169.254.63.31 connect to the server /169.254.63.31:20881

从启动日志中我们可以看到消费者和服务提供者建立了连接

4. 启动管理后台
管理后台工程结构

访问 http://localhost:7001/
用户名:root 密码:root

相关配置在application.properties中可找到

我们可以看到服务提供者和消费者均已经注册成功,并可在管理后台查看

服务提供者
服务消费者
验证
请求服务

下一篇:Dubbo 基础篇 - 配置和目录

Github工程地址

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