Dubbo Spring Cloud 入门

简介

参考:https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples

Dubbo Spring Cloud基于Dubbo Spring Boot 2.7.1Spring Cloud 2.x开发,无论开发人员是Dubbo用户还是Spring Cloud用户, 都能轻松地驾驭,并以接近“零”成本的代价使应用向上迁移。Dubbo Spring Cloud致力于简化Cloud Native开发成本,提高研发效能以及提升应用性能等目的。

参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Dubbo-Spring-Cloud
参考:https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples

快速开始

定义 Dubbo 服务接口

Dubbo服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如EchoService接口:

public interface EchoService {

    String echo(String message);
}

为了确保契约的一致性,推荐的做法是将Dubbo服务接口打包在第二方或者第三方的artifact(jar)中,如以上接口就存放在 artifact spring-cloud-dubbo-sample-api 之中。 对于服务提供方而言,不仅通过依赖artifact的形式引入Dubbo服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该artifact,并以接口调用的方式执行远程方法。接下来进一步讨论怎样实现Dubbo服务提供方和消费方。

实现 Dubbo 服务提供方

(1)初始化spring-cloud-dubbo-server-sample Maven 工程

首先,创建artifactId名为spring-cloud-dubbo-server-sample的 Maven 工程,并在其pom.xml文件中增添Dubbo Spring Cloud必要的依赖:

<dependencies>
    <!-- Sample API -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dubbo-sample-api</artifactId>
        <version>${project.version}</version>
    </dependency>

    <!-- Spring Boot dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>

    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>

    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

以上依赖artifact说明如下:

  • spring-cloud-dubbo-sample-api: 提供EchoService接口的artifact
  • spring-boot-actuator: Spring Boot Production-Ready artifact,间接引入spring-boot artifact
  • spring-cloud-starter-dubbo: Dubbo Spring Cloud Starter artifact,间接引入dubbo-spring-boot-starterartifact
  • spring-cloud-starter-alibaba-nacos-discovery: Nacos Spring Cloud服务注册与发现artifact

值得注意的是,以上artifact未指定版本(version),因此,还需显示地声明<dependencyManagement>:

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba dependencies -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

以上完整的 Maven 依赖配置,请参考spring-cloud-dubbo-server-sample pom.xml文件

完成以上步骤之后,下一步则是实现Dubbo服务

(2)实现Dubbo服务

EchoService作为暴露的Dubbo服务接口,服务提供方spring-cloud-dubbo-server-sample需要将其实现:

@org.apache.dubbo.config.annotation.Service
class EchoServiceImpl implements EchoService {

    @Override
    public String echo(String message) {
        return "[echo] Hello, " + message;
    }
}

其中,@org.apache.dubbo.config.annotation.ServiceDubbo服务注解,仅声明该 Java 服务(本地)实现为Dubbo服务。因此,下一步需要将其配置Dubbo服务(远程)。

(3)配置Dubbo服务提供方

在暴露Dubbo服务方面,推荐开发人员外部化配置的方式,即指定Java服务实现类的扫描基准包。

Dubbo Spring Cloud继承了Dubbo Spring Boot的外部化配置特性,也可以通过标注@DubboComponentScan来实现基准包扫描。

同时,Dubbo远程服务需要暴露网络端口,并设定通讯协议,完整的YAML配置如下所示:

dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.alibaba.cloud.dubbo.bootstrap
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
  registry:
    # 挂载到 Spring Cloud 注册中心
    address: spring-cloud://localhost

spring:
  application:
    # Dubbo 应用名称
    name: spring-cloud-alibaba-dubbo-server
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

以上YAML内容,上半部分为Dubbo的配置:

  • dubbo.scan.base-packages: 指定Dubbo服务实现类的扫描基准包
  • dubbo.protocol: Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1表示自增端口,从20880开始)
  • dubbo.registry: Dubbo服务注册中心配置,其中子属性address的值spring-cloud://localhost,说明挂载到Spring Cloud注册中心

当前Dubbo Spring Cloud实现必须配置dubbo.registry.address = spring-cloud://localhost,下一个版本将其配置变为可选(参考 issue #592), 并且支持传统 Dubbo 协议的支持(参考 issue #588

下半部分则是Spring Cloud相关配置:

  • spring.application.name: Spring 应用名称,用于Spring Cloud服务注册和发现。

该值在Dubbo Spring Cloud加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name

  • spring.main.allow-bean-definition-overriding: 在Spring Boot 2.1以及更高的版本增加该设定,因为Spring Boot默认调整了`Bean 定义覆盖行为(推荐一个好的 Dubbo 讨论 issue #3193
  • spring.cloud.nacos.discovery: Nacos服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口

以上完整的YAML配置文件,请参考spring-cloud-dubbo-server-sample bootstrap.yaml 文件

完成以上步骤后,还需编写一个Dubbo Spring Cloud引导类。

(4)引导Dubbo Spring Cloud服务提供方应用

Dubbo Spring Cloud引导类与普通Spring Cloud应用并无差别,如下所示:

@EnableDiscoveryClient
@EnableAutoConfiguration
public class DubboSpringCloudServerBootstrap {

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

在引导DubboSpringCloudServerBootstrap之前,请提前启动Nacos服务器。当DubboSpringCloudServerBootstrap启动后,应用spring-cloud-dubbo-server-sample将出现在Nacos控制台界面。

Dubbo服务提供方启动后,下一步实现一个Dubbo服务消费方。

实现 Dubbo 服务消费方

由于 Java 服务就EchoService、服务提供方应用spring-cloud-dubbo-server-sample以及Nacos服务器均已准备完毕。Dubbo服务消费方 只需初始化服务消费方Maven工程spring-cloud-dubbo-client-sample以及消费Dubbo服务。

(1)初始化spring-cloud-dubbo-client-sample Maven 工程

与服务提供方Maven工程类,需添加相关Maven依赖:

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba dependencies -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Sample API -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dubbo-sample-api</artifactId>
        <version>${project.version}</version>
    </dependency>

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

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

    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>

    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

与应用spring-cloud-dubbo-server-sample不同的是,当前应用依赖spring-boot-starter-web,表明它属于Web Servlet应用。

以上完整的Maven依赖配置,请参考spring-cloud-dubbo-client-sample pom.xml 文件

(2)配置Dubbo服务消费方

Dubbo服务消费方配置与服务提供方类似,当前应用spring-cloud-dubbo-client-sample属于纯服务消费方,因此,所需的外部化配置更精简:

dubbo:
  registry:
    # 挂载到 Spring Cloud 注册中心
    address: spring-cloud://localhost
  cloud:
    subscribed-services: spring-cloud-alibaba-dubbo-server

spring:
  application:
    # Dubbo 应用名称
    name: spring-cloud-alibaba-dubbo-client
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

对比应用spring-cloud-dubbo-server-sample,除应用名称spring.application.name存在差异外,spring-cloud-dubbo-client-sample新增了属性dubbo.cloud.subscribed-services的设置。并且该值为服务提供方应用spring-cloud-dubbo-server-sample

  • dubbo.cloud.subscribed-services: 用于服务消费方订阅服务提供方的应用名称列表,若需订阅多应用,使用","分割。不推荐使用默认值为"*",它将订阅所有应用。

当应用使用属性dubbo.cloud.subscribed-services默认值时,日志中将会输出一行警告:

Current application will subscribe all services(size:x) in registry, a lot of memory and CPU cycles may be used, thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services

由于当前应用属于Web应用,它会默认地使用8080作为Web服务端口,如果需要自定义,可通过属性server.port调整。

以上完整的YAML配置文件,请参考spring-cloud-dubbo-client-sample bootstrap.yaml 文件

(3)引导Dubbo Spring Cloud服务消费方应用

为了减少实现步骤,以下引导类将Dubbo服务消费以及引导功能合二为一:

@EnableDiscoveryClient
@EnableAutoConfiguration
@RestController
public class DubboSpringCloudClientBootstrap {

    @Reference
    private EchoService echoService;

    @GetMapping("/echo")
    public String echo(String message) {
        return echoService.echo(message);
    }

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

不仅如此,DubboSpringCloudClientBootstrap也作为REST Endpoint,通过暴露/echo Web服务,消费Dubbo EchoService服务。因此,可通过curl命令执行HTTP GET方法:

$ curl http://127.0.0.1:8080/echo?message=Joe.Ye

HTTP 响应为:

[echo] Hello, Joe.Ye

以上结果说明应用spring-cloud-dubbo-client-sample通过消费Dubbo服务,返回服务提供方spring-cloud-dubbo-server-sample运算后的内容。

以上操作就一套完整的Dubbo服务提供方和消费方的运用,更多的详情请直接参考模块:

模块说明

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/26/getting-started-with-dubbo-spring-cloud/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Dubbo Spring Cloud 入门
简介 参考:https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples Dubbo Sprin……
<<上一篇
下一篇>>
文章目录
关闭
目 录