服务发现

  1. docker run -d --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:1.4.1

本地开发环境地址:http://127.0.0.1:8848/nacos/#/login
用户名和密码默认是nacos

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>hello-spring-cloud-dubbo</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <modules>
  11. <module>dubbo-provider-sample</module>
  12. <module>dubbo-consumer-sample</module>
  13. <module>dubbo-sample-api</module>
  14. </modules>
  15. <properties>
  16. <maven.compiler.source>1.8</maven.compiler.source>
  17. <maven.compiler.target>1.8</maven.compiler.target>
  18. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  19. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  20. </properties>
  21. <dependencyManagement>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-dependencies</artifactId>
  26. <version>${spring-boot.version}</version>
  27. <type>pom</type>
  28. <scope>import</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.alibaba.cloud</groupId>
  32. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  33. <version>${spring-cloud-alibaba.version}</version>
  34. <type>pom</type>
  35. <scope>import</scope>
  36. </dependency>
  37. </dependencies>
  38. </dependencyManagement>
  39. </project>

创建服务接口

按照传统的 Dubbo 开发模式,在构建服务提供者之前,第一个步骤是为服务提供者和服务消费者定义 Dubbo 服务接口。
为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,该 artifact 甚至无需添加任何依赖。
对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact,并以接口调用的方式执行远程方法。接下来的步骤则是创建 artifact。

创建 api 工程 - dubbo-sample-api

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>hello-spring-cloud-dubbo</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>dubbo-sample-api</artifactId>
  12. <properties>
  13. <maven.compiler.source>1.8</maven.compiler.source>
  14. <maven.compiler.target>1.8</maven.compiler.target>
  15. </properties>
  16. </project>

命令执行后,名为“dubbo-sample-api” 的项目目录生成,切换至该目录,内部结构如下:

  1. ├── pom.xml
  2. └── src
  3. ├── main
  4. ├── java
  5. └── com
  6. └── example
  7. └── dubbo
  8. └── api
  9. └── EchoService.java
  10. └── resources
  11. └── test
  12. └── java

定义 Dubbo 服务接口

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

  1. package com.example.dubbo.api;
  2. public interface EchoService {
  3. String echo(String message);
  4. }

该接口非常简单,仅有一个方法,接下来将 dubbo-sample-api 部署到本地 Maven 仓库。

部署 api 工程 - dubbo-sample-api

利用 Maven 命令, 将 dubbo-sample-api 部署到本地 Maven 仓库:

  1. mvn clean install

服务端开发

前面的准备工作,已经创建了服务端工程,本节主要完成了针对服务接口的实现工作

  1. ├── pom.xml
  2. └── src
  3. ├── main
  4. │ ├── java
  5. │ │ └── com
  6. │ │ └── example
  7. │ │ └── dubbo
  8. │ │ └── provider
  9. │ │ ├── DubboProviderApplication.java
  10. │ │ └── service
  11. │ │ └── EchoServiceImpl.java
  12. │ └── resources
  13. │ └── application.yaml
  14. └── test
  15. └── java

添加 api 依赖 - dubbo-sample-api

打开 dubbo-provider-sample 的 文件;
将 artifact dubbo-sample-api 依赖信息添加到应用 dubbo-provider-sample 中的 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>hello-spring-cloud-dubbo</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>dubbo-provider-sample</artifactId>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba.cloud</groupId>
  24. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.alibaba.cloud</groupId>
  28. <artifactId>spring-cloud-starter-dubbo</artifactId>
  29. </dependency>
  30. <!-- Dubbo 服务 artifact -->
  31. <dependency>
  32. <groupId>org.example</groupId>
  33. <artifactId>dubbo-sample-api</artifactId>
  34. <version>1.0-SNAPSHOT</version>
  35. </dependency>
  36. </dependencies>
  37. <build>
  38. <plugins>
  39. <plugin>
  40. <groupId>org.apache.maven.plugins</groupId>
  41. <artifactId>maven-compiler-plugin</artifactId>
  42. <version>3.8.1</version>
  43. <configuration>
  44. <source>1.8</source>
  45. <target>1.8</target>
  46. <encoding>UTF-8</encoding>
  47. </configuration>
  48. </plugin>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. <version>2.3.7.RELEASE</version>
  53. <executions>
  54. <execution>
  55. <id>repackage</id>
  56. <goals>
  57. <goal>repackage</goal>
  58. </goals>
  59. </execution>
  60. </executions>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </project>

依赖增加之后,下一步实现 Dubbo 服务 -EchoService

实现 Dubbo 服务

在应用 dubbo-provider-sample 中的 com.example.dubbo.provider.service 包下创建实现类

  1. package com.example.dubbo.provider.service;
  2. import com.example.dubbo.api.EchoService;
  3. import org.apache.dubbo.config.annotation.DubboService;
  4. @DubboService
  5. public class EchoServiceImpl implements EchoService {
  6. @Override
  7. public String echo(String s) {
  8. return s;
  9. }
  10. }

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

配置 Dubbo 服务提供方

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: dubbo-provider-sample
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 127.0.0.1:8848
  10. namespace: public
  11. dubbo:
  12. scan:
  13. base-packages: com.example.dubbo.provider.service
  14. protocol:
  15. name: dubbo
  16. port: -1
  17. cloud:
  18. subscribed-services: ""

在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。
Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注 @DubboComponentScan 来实现基准包扫描。
application.properties 的配置项说明:

  • dubbo.scan.base-packages: 指定 Dubbo 服务实现类的扫描基准包
  • dubbo.protocol: Dubbo 服务暴露的协议配置,其中子属性name为协议名称,port为协议端口( -1 表示自增端口,从 20880 开始)
  • spring.application.name: Spring 应用名称,用于 Spring Cloud 服务注册和发现。

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

  • spring.cloud.nacos.discovery: Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口

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

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

  1. package com.example.dubbo.provider;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @EnableDiscoveryClient
  6. @SpringBootApplication
  7. public class DubboProviderApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboProviderApplication.class, args);
  10. }
  11. }

客户端开发

增加 api 依赖 - dubbo-sample-api

与服务提供方 Maven 工程类似,将 artifact dubbo-sample-api 依赖信息添加到应用 dubbo-consumer-sample 中的 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>hello-spring-cloud-dubbo</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>dubbo-consumer-sample</artifactId>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba.cloud</groupId>
  24. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.alibaba.cloud</groupId>
  28. <artifactId>spring-cloud-starter-dubbo</artifactId>
  29. </dependency>
  30. <!-- Dubbo 服务 artifact -->
  31. <dependency>
  32. <groupId>org.example</groupId>
  33. <artifactId>dubbo-sample-api</artifactId>
  34. <version>1.0-SNAPSHOT</version>
  35. </dependency>
  36. </dependencies>
  37. <build>
  38. <plugins>
  39. <plugin>
  40. <groupId>org.apache.maven.plugins</groupId>
  41. <artifactId>maven-compiler-plugin</artifactId>
  42. <version>3.8.1</version>
  43. <configuration>
  44. <source>1.8</source>
  45. <target>1.8</target>
  46. <encoding>UTF-8</encoding>
  47. </configuration>
  48. </plugin>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. <version>2.3.7.RELEASE</version>
  53. <executions>
  54. <execution>
  55. <id>repackage</id>
  56. <goals>
  57. <goal>repackage</goal>
  58. </goals>
  59. </execution>
  60. </executions>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </project>

目录结构

  1. ├── pom.xml
  2. └── src
  3. ├── main
  4. ├── java
  5. └── com
  6. └── example
  7. └── dubbo
  8. └── consumer
  9. ├── DubboConsumerApplication.java
  10. └── controller
  11. └── EchoController.java
  12. └── resources
  13. └── application.yaml
  14. └── test
  15. └── java

restful

  1. package com.example.dubbo.consumer.controller;
  2. import org.apache.dubbo.config.annotation.DubboReference;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import com.example.dubbo.api.EchoService;
  7. @RestController
  8. public class EchoController {
  9. @DubboReference
  10. private EchoService echoService;
  11. // http://127.0.0.1:8080/echo?msg=hello
  12. @GetMapping("/echo")
  13. public String echo(@RequestParam(name = "msg", defaultValue = "hello world") String msg) {
  14. return echoService.echo(msg);
  15. }
  16. }

入口程序

  1. package com.example.dubbo.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @EnableDiscoveryClient
  6. @SpringBootApplication
  7. public class DubboConsumerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboConsumerApplication.class, args);
  10. }
  11. }