Requisitos medioambientales
-
Sistema: Windows, Linux, MacOS
-
JDK 8 y superior (se recomienda JDK17)
-
git
-
IntelliJ IDEA (opcional)
-
Ventana acoplable (opcional)
Introducción al proyecto
En esta tarea, se dividirá en tres submódulos para el desarrollo independiente, simulando la arquitectura de implementación en el entorno de producción.
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模块
├── dubbo-samples-spring-boot-consumer // 消费端模块
└── dubbo-samples-spring-boot-provider // 服务端模块
Como se muestra arriba, hay 3 módulos en total y interface
el módulo es codependiente consumer
con provider
dos módulos para almacenar la interfaz API utilizada por la comunicación RPC.
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模块
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── org
│ └── apache
│ └── dubbo
│ └── springboot
│ └── demo
│ └── DemoService.java // API 接口
├── dubbo-samples-spring-boot-consumer // 消费端模块
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── org
│ │ │ └── apache
│ │ │ └── dubbo
│ │ │ └── springboot
│ │ │ └── demo
│ │ │ └── consumer
│ │ │ ├── ConsumerApplication.java // 消费端启动类
│ │ │ └── Task.java // 消费端模拟调用任务
│ │ └── resources
│ │ └── application.yml // Spring Boot 配置文件
├── dubbo-samples-spring-boot-provider // 服务端模块
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── apache
│ │ └── dubbo
│ │ └── springboot
│ │ └── demo
│ │ └── provider
│ │ ├── DemoServiceImpl.java // 服务端实现类
│ │ └── ProviderApplication.java // 服务端启动类
│ └── resources
│ └── application.yml // Spring Boot 配置文件
└── pom.xml
Lo anterior es la estructura de archivos del proyecto que se utilizará en este tutorial.
Implementación rápida (inicio directo basado en muestras)
Este capítulo le enseñará paso a paso cómo implementar y ejecutar un caso de uso basado en Dubbo x Spring Boot mediante unos pocos comandos simples.
Nota: Los detalles del código implementado en este capítulo se pueden encontrar en el almacén apache/dubbo-samples1-basic/dubbo-samples-spring-boot
, que se explicará en el siguiente capítulo.
1. Obtenga el proyecto de prueba
Antes de comenzar todo el tutorial, necesitamos obtener el código del proyecto de prueba. Todos los códigos de casos de prueba de Dubbo se almacenan en el almacén de apache/dubbo-samples ; el siguiente comando puede ayudarle a obtener todos los códigos en el almacén de muestras.
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
2. Inicie un registro simple
Para una aplicación de microservicio, el registro es un componente indispensable. Sólo a través del centro de registro, el consumidor puede descubrir con éxito la información de la dirección del servidor y luego realizar una llamada.
Para que este tutorial sea más fácil de comenzar, proporcionamos un iniciador simple basado en el registro de Apache Zookeeper. Si necesita implementar el registro en un entorno de producción, consulte el artículo sobre inicialización del entorno de producción para implementar un registro de alta disponibilidad.
Windows:
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
3. Módulo API de empaquetado local
Para compilar correctamente los módulos de servidor y consumidor, primero es necesario empaquetar e instalar los módulos localmente dubbo-samples-spring-boot-interface
.
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-interface
4. Inicie el proveedor de servicios.
Después de iniciar el registro, el siguiente paso es iniciar un proveedor de servicios que brinde servicios externamente. Las muestras correspondientes también se proporcionan en dubbo-samples, que se pueden extraer rápidamente con el siguiente comando.
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。
Después de ejecutar el comando anterior, espere un momento hasta que Current Spring Boot Application is await
aparezca el siguiente registro (), lo que significa que el proveedor de servicios se ha iniciado, lo que indica que el proveedor de servicios puede proporcionar servicios al mundo exterior.
2023-02-08 17:13:00.357 INFO 80600 --- [lication.main()] o.a.d.c.d.DefaultApplicationDeployer : [DUBBO] Dubbo Application[1.1](dubbo-springboot-demo-provider) is ready., dubbo version: 3.2.0-beta.4, current host: 30.221.128.96
2023-02-08 17:13:00.369 INFO 80600 --- [lication.main()] o.a.d.s.d.provider.ProviderApplication : Started ProviderApplication in 9.114 seconds (JVM running for 26.522)
2023-02-08 17:13:00.387 INFO 80600 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
5. Inicie el consumidor del servicio.
El último paso es hacer que un consumidor de servicios llame al proveedor de servicios, que es el núcleo de la llamada RPC y proporciona un puente para que el consumidor de servicios llame al proveedor de servicios.
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
Después de ejecutar el comando anterior, espere un momento hasta que Hello world
aparezca el siguiente registro ( ): Los datos impresos se devuelven después de que el proveedor de servicios los procesa, lo que marca el éxito de una llamada de servicio.
2023-02-08 17:14:33.045 INFO 80740 --- [lication.main()] o.a.d.s.d.consumer.ConsumerApplication : Started ConsumerApplication in 11.052 seconds (JVM running for 31.62)
Receive result ======> Hello world
2023-02-08 17:14:33.146 INFO 80740 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
Wed Feb 08 17:14:34 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:35 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:36 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:37 CST 2023 Receive result ======> Hello world
Práctica práctica (desde la versión de desarrollo de código cero)
Este capítulo le enseñará cómo desarrollar una aplicación de microservicio desde cero a través de tutoriales paso a paso.
1. Inicie el registro
Para una aplicación de microservicio, el registro es un componente indispensable. Sólo a través del centro de registro, el consumidor puede descubrir con éxito la información de la dirección del servidor y luego realizar una llamada.
Para que este tutorial sea más fácil de comenzar, proporcionamos un iniciador simple basado en el registro de Apache Zookeeper. Si necesita implementar el registro en un entorno de producción, consulte el artículo sobre inicialización del entorno de producción para implementar un registro de alta disponibilidad .
Windows:
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
cd dubbo-samples
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
cd dubbo-samples
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
2. Inicializar el proyecto
A partir de esta sección, el proyecto se construirá y probará en base a IntelliJ IDEA.
Como se muestra arriba, se puede construir un proyecto básico.
Después de construir el proyecto básico, también necesitamos crear dubbo-spring-boot-demo-interface
y dubbo-spring-boot-demo-provider
tres dubbo-spring-boot-demo-consumer
submódulos.
Después de crear los tres submódulos, debe crear las siguientes carpetas:
-
Crear paquete
dubbo-spring-boot-demo-consumer/src/main/java
enorg.apache.dubbo.springboot.demo.consumer
-
Crear paquete
dubbo-spring-boot-demo-interface/src/main/java
enorg.apache.dubbo.springboot.demo
-
Crear paquete
dubbo-spring-boot-demo-provider/src/main/java
enorg.apache.dubbo.springboot.demo.provider
La referencia final de la carpeta se muestra en la imagen de arriba.
3. Agregar dependencia de Maven
Después de inicializar el proyecto, primero debemos agregar las dependencias de Maven relacionadas con Dubbo.
pom.xml
Para proyectos de varios módulos, primero debe configurar la información de dependencia en el proyecto principal .
Edite ./pom.xml
este archivo y agregue la siguiente configuración.
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-spring-boot-demo-interface</module>
<module>dubbo-spring-boot-demo-provider</module>
<module>dubbo-spring-boot-demo-consumer</module>
</modules>
<properties>
<dubbo.version>3.2.0-beta.4</dubbo.version>
<spring-boot.version>2.7.8</spring-boot.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
Luego configure las dependencias específicas en los dubbo-spring-boot-consumer
dos dubbo-spring-boot-provider
módulos .pom.xml
Edite ./dubbo-spring-boot-consumer/pom.xml
y ./dubbo-spring-boot-provider/pom.xml
agregue la siguiente configuración a ambos archivos.
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo-interface</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
En esta configuración, se definen las dependencias de dubbo y zookeeper (y el curador del conector correspondiente).
Después de agregar la configuración anterior, puede Maven - Reload All Maven Projects
actualizar las dependencias a través de IDEA.
4. Definir la interfaz del servicio.
La interfaz de servicio es el puente entre el consumidor y el servidor en Dubbo.
Cree una interfaz bajo el dubbo-spring-boot-demo-interface
módulo , definida de la siguiente manera:org.apache.dubbo.samples.api
DemoService
package org.apache.dubbo.springboot.demo;
public interface DemoService {
String sayHello(String name);
}
En , este método GreetingsService
está definido . Los servicios posteriores publicados por el servidor y los servicios suscritos por el consumidor se desarrollan sayHi
en torno a la interfaz.GreetingsService
5. Definir la implementación del servidor.
Después de definir la interfaz de servicio, puede definir la implementación correspondiente en el lado del servidor. En comparación con el lado del consumidor, esta parte de la implementación es una implementación remota y no hay información relevante localmente.
Cree una clase bajo el dubbo-spring-boot-demo-provider
módulo , definida de la siguiente manera:org.apache.dubbo.samples.provider
DemoServiceImpl
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.springboot.demo.DemoService;
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
En DemoServiceImpl
, se implementa la interfaz DemoService
para que sayHello
el método regrese Hello name
.
Nota: DemoServiceImpl
Se agregan @DubboService
anotaciones a la clase. A través de esta configuración, los servicios Dubbo se pueden publicar en función de Spring Boot.
6. Configure el archivo de configuración Yaml del lado del servidor.
Desde este paso hasta el paso 7, se configurará cierta información básica de Dubbo a través de Spring Boot.
Primero, creemos un archivo de configuración para el servidor.
Cree un archivo en la carpeta de recursos dubbo-spring-boot-demo-provider
del módulo , definido de la siguiente manera:resources
application.yml
dubbo:
application:
name: dubbo-springboot-demo-provider
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
En este archivo de configuración, se definen el nombre de la aplicación Dubbo, la información del protocolo Dubbo y la dirección de registro utilizada por Dubbo.
7. Configure el archivo de configuración YAML del lado del consumidor.
De manera similar, necesitamos crear un archivo de configuración para el consumidor.
Cree un archivo en la carpeta de recursos dubbo-spring-boot-demo-consumer
del módulo , definido de la siguiente manera:resources
application.yml
dubbo:
application:
name: dubbo-springboot-demo-consumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
En este archivo de configuración, se definen el nombre de la aplicación Dubbo, la información del protocolo Dubbo y la dirección de registro utilizada por Dubbo.
8. Configure la clase de inicio del servidor según Spring
Además de configurar el archivo de configuración Yaml, también necesitamos crear una clase de inicio basada en Spring Boot.
En primer lugar, primero creamos la clase de inicio del servidor.
Cree una clase bajo el dubbo-spring-boot-demo-provider
módulo , definida de la siguiente manera:org.apache.dubbo.springboot.demo.provider
Application
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
En esta clase de inicio, uno está configurado ProviderApplication
para leer el archivo de configuración definido en el paso 6 anterior application.yml
e iniciar la aplicación.
9. Configure la clase de inicio del consumidor basada en Spring
De manera similar, necesitamos crear una clase de inicio para el consumidor.
Cree una clase bajo el dubbo-spring-boot-demo-consumer
módulo , definida de la siguiente manera:org.apache.dubbo.springboot.demo.consumer
Application
package org.apache.dubbo.springboot.demo.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
En esta clase de inicio, uno está configurado ConsumerApplication
para leer el archivo de configuración definido en el paso 7 anterior application.yml
e iniciar la aplicación.
10. Configurar tareas de solicitud de consumidores.
CommandLineRunner
Además de configurar la clase de inicio del lado del consumidor, también podemos crearla en función del modo Spring Boot.
Cree una clase bajo el dubbo-spring-boot-demo-consumer
módulo , definida de la siguiente manera:org.apache.dubbo.springboot.demo.consumer
Task
package org.apache.dubbo.springboot.demo.consumer;
import java.util.Date;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.springboot.demo.DemoService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Task implements CommandLineRunner {
@DubboReference
private DemoService demoService;
@Override
public void run(String... args) throws Exception {
String result = demoService.sayHello("world");
System.out.println("Receive result ======> " + result);
new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}).start();
}
}
En Task
la clase, al @DubboReference
obtener una suscripción RPC de Dubbo, esto demoService
se puede llamar directamente como una llamada local. run
Se crea un hilo en el método para realizar la llamada .
11. Inicie la aplicación.
A partir del paso 10, el código se desarrolló y esta sección iniciará todo el proyecto y lo verificará.
Lo primero es comenzar org.apache.dubbo.samples.provider.Application
, Después de un rato Current Spring Boot Application is await
aparecerá el registro () que se muestra en la figura siguiente, lo que significa que el proveedor de servicios ha iniciado, lo que indica que el proveedor de servicios puede brindar servicios al mundo exterior.
[Dubbo] Current Spring Boot Application is await...
Luego comience. Después de un tiempo, aparecerá org.apache.dubbo.samples.client.Application
el registro ( ) como se muestra en la siguiente figura, lo que significa que el consumidor del servicio inició y llamó al servidor para obtener el resultado con éxito.Hello world
Receive result ======> Hello world