目录

1. 前言

2. 项目结构

3. dubbo2项目

4. SayProvider项目

4.1. pom.xml文件

4.2. application.yml文件

4.3. AppMain类文件

4.4. SayProvider接口文件

4.5. SayProviderImpl实现类文件

4.6. 启动项目

5. SayConsumer项目

5.1. pom.xml文件

5.2. application.yml文件

5.3. AppMain类文件

5.4. SayService类文件

5.5. SayController类文件

5.6. 启动项目


1. 前言

本文在依旧是提供最简单的dubbo项目,抛弃任何多余的技术栈,只单纯的演示基于dubbo实现服务提供者和消费者的项目如何开发。

本文使用的技术栈包括 springboot + dubbo 没有zookeeper,采用的点对点直连方式进行服务调用。

2. 项目结构

本项目的结构入下图

dubbo使用案例 dubbo实例_dubbo

可以看到本项目名为 dubbo2,项目中有两个模块 SayProviderSayConsumer

dubbo2是parent项目

SayProvider和SayConsumer是两个子项目。

dubbo2只是提供了两个模块的通用maven依赖的管理,并没有其他的功能。

SayProvider是服务提供者。

SayConsumer是服务消费者。

SayProvider提供了一个方法 String  sayHi(String uname), SayConsumer调用该方法,传递进去字符串的用户姓名,将返回 Hello,uname 这样的字符串。

功能就是这么简单,咋地!我就是为了排除任何复杂业务逻辑对 dubbo 理解的影响。

3. dubbo2项目

该项目啥都没有,就一个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>com.pingbu</groupId>
    <artifactId>dubbo2</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

    <modules>
        <module>SayProvider</module>
        <module>SayConsumer</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.11</version>
        </dependency>

    </dependencies>

</project>

没啥说的,就是引入了 dubbo + springboot 的通用依赖。

4. SayProvider项目

这个项目是 服务提供者,它提供了一个 String sayHi(String uname) 的方法,功能就是传入一个用户姓名的字符串,返回字符串为 hello,uname

这个项目继承自 dubbo2 项目。 

 代码结构如下图

dubbo使用案例 dubbo实例_zookeeper_02

可以看到就几个文件:

pom.xml文件: 不解释,maven 配置文件

application.yml 文件: 不解释

AppMain 类文件: springboot的启动文件,不解释

SayProvider 接口文件:是服务接口

SayProviderImpl实现类文件:是服务功能的实现

接下来一个个捋过去。 

4.1. 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">
    <parent>
        <artifactId>dubbo2</artifactId>
        <groupId>com.pingbu</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SayProvider</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

</project>

这个文件确实没啥可解释的

4.2. application.yml文件

dubbo:
  application:
    name: sayProvider
    owner: pingbu
    qos:
      port: 55555
      enable: true
      accept:
        foreign:
          ip: false
  monitor:
    protocol: registry
  registry:
    address: N/A
  protocol:
    name: dubbo
    port: 20880

配置了dubbo相关的参数,这些参数在一般的文档都是配置在 xml里面,我将其改造到了springboot的application.yml 文件中。

dubbo.application: 这个节点下配置的是服务名称之类的,必须配置,否则会报错,且必须唯一,也就是在注册中心这个名字得唯一。不过这个项目是点对点直连的,就无所谓了。

dubbo.registry.address: 这是配置 dubbo的注册中心地址,N/A 表示不配置注册中心。因为我要实现点对点直连,因此不需要注册中心。

dubbo.protocol: 定义的是dubbo的协议。

4.3. AppMain类文件

package com.pingbu.dubbo2;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class AppMain {
    
    public static void main(String[] args) {
        SpringApplication.run(AppMain.class, args);
    }

}

可以看到,增加了 @EnableDubbo

4.4. SayProvider接口文件

package com.pingbu.dubbo2.provider;

public interface SayService {

    String sayHi(String uname);
}

简单到爆,无法解释。

4.5. SayProviderImpl实现类文件

package com.pingbu.dubbo2.provider;

import org.apache.dubbo.config.annotation.DubboService;
import java.text.SimpleDateFormat;
import java.util.Date;


@DubboService(version = "1.0.0",timeout = 3000)
public class SayServiceImpl implements SayService {

    @Override
    public String sayHi(String uname){
        Date dt = new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        String time1 = sdf.format(dt);
        return time1+" -===- Hello , "+uname;
    }

}

看到这里定义了注 解 @DubboService ,这个是最重要的,在上一篇文章中我采用的是 xml 配置文件方式,也就是基于 Spring的配置文件实现的 dubbo 服务注册。而这个项目我采用的是注解方式。

注解很简单,没啥需要解释的。

当然,这个 DubboService 支持的参数其实是很复杂的,不过我这篇文章力求最简化,因此不过更多解释。有兴趣的朋友完全可以百度到所有的资料。

具体的接口实现代码,更不解释了。

哦,对了,这个 @DubboService 注解是 dubbo 2.6.0 版本开始出现的,以前的版本就叫 @Service,估计朋友们看dubbo的文章很多都是用的这个注解名。新版本的考虑这个命名与Spring的注解容易造成混淆,就改了名字。 这个修改挺好,是的,很好很好!!

4.6. 启动项目

直接执行 mvn clean spring-boot:run

5. SayConsumer项目

这个项目是服务消费者。

项目结构如下:

dubbo使用案例 dubbo实例_spring boot_03

也是简单到没有人性。

提供了5个文件:

pom.xml: 不解释

application.yml: 不解释

AppMain类文件: 不解释

SayService接口文件: 对应 SayProvider项目中的 SayService接口文件。注意,这个文件的命名必须一致,包括包名、类名、方法名。

SayController类文件: 这个类写出来就是为了用于测试的。

一个个的捋一下:

5.1. 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">
    <parent>
        <artifactId>dubbo2</artifactId>
        <groupId>com.pingbu</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SayConsumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

由于要启动 web 应用,以方便测试,因此加入了 spring-boot-starter-web 的依赖,其实 dubbo 真的跟web 没关系,加入这个 依赖并不是 dubbo 的要求,而是为了开发调测和演示的方便。

5.2. application.yml文件

server:
  port: 8086

dubbo:
  application:
    name: SayConsumer
    owner: pingbu
    qos:
      port: 55555
      enable: true
      accept:
        foreign:
          ip: false
  register:
    address: N/A

这个文件更没有什么需要解释的,比服务提供者的还简单。

5.3. AppMain类文件

package com.pingbu.dubbo2;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class AppMain {

    public static void main(String[] args) {
        SpringApplication.run(AppMain.class, args);
    }

}

没啥解释的,就是多了一个 @EnableDubbo

5.4. SayService类文件

package com.pingbu.dubbo2.provider;

public interface SayService {
    String sayHi(String uname);
}

该文件与服务提供者对应的接口一样,包名一样、接口名一样,方法名一下。必须一样,必须一样。

5.5. SayController类文件

代码如下:

package com.pingbu.dubbo2.controller;

import com.pingbu.dubbo2.provider.SayService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/say")
public class SayController {

    @DubboReference(version = "1.0.0", url="dubbo://127.0.0.1:20880")
    private SayService sayService;

    @GetMapping(value = "/hi")
    public String hi(){

        String res = sayService.sayHi("老牛!!!");

        return res ;
    }


}

其他的就不解释了,值说说 @DubboReference注解。

@DubboReference 注解: 这个注解就是说,这里注入的是 dubbo 的服务接口。 url 指向的就是 点对点的服务提供者的 dubbo 地址,看这个地址,就能与 SayProvider项目的application.yml 中的配置对应上了。

5.6. 启动项目

项目启动语句: mvn clean spring-boot:run

启动后在浏览器输入地址  http://127.0.0.1:8086/say/hi 

看到页面如下即可。

dubbo使用案例 dubbo实例_spring boot_04