除了可以使用传统的XML配置方式开发Dubbo应用,还可以使用Spring Boot开发Dubbo应用,特别对于Java技术薄弱和Maven经验少,且又不熟悉Dubbo框架的开发者更为适合。本文以全新开发过程,向您展示如何使用Spring Boot开发Dubbo应用,并使用SAE服务注册中心实现服务注册与发现。
前提条件
下载Maven并设置环境变量。
下载最新版本的Nacos Server。
启动Nacos Server。
解压下载的Nacos Server压缩包
进入
nacos/bin
目录,启动Nacos Server。Linux/Unix/Mac系统:执行命令
sh startup.sh -m standalone
。Windows系统:修改
startup.cmd
,配置参数set MODE="standalone"
,然后执行。
在本地开发应用时,可以使用Alibaba Cloud Toolkit插件实现本地应用和部署在EDAS中的应用的相互调用,即端云互联,而无需搭建VPN,帮助您提升开发效率。更多信息,请参见端云互联简介。
为什么使用Spring Boot开发Dubbo应用
Spring Boot简化了微服务应用的配置和部署,同时Nacos又提供了服务注册发现和配置管理功能,两者结合的方式能够帮助您快速搭建基于Spring的Dubbo服务,相比XML的开发方式,大幅提升开发效率。
全新场景使用Spring Boot开发Dubbo应用有两种主要的方式:
使用XML开发。
使用Spring Boot的注解方式开发。
使用XML方式的步骤,请参见将Dubbo应用托管到SAE。本文介绍如何使用Spring Boot的注解方式开发Dubbo服务。
视频教程
本视频仅介绍使用Spring Boot开发Dubbo应用,部署部分请参见在SAE控制台部署应用。
示例工程
您可以按照本文的逐步搭建工程,也可以选择直接下载本文对应的示例工程,或者使用Git来clone:git clone https://github.com/aliyun/alibabacloud-microservice-demo.git
该项目包含了众多的示例工程,本文对应的示例工程位于alibabacloud-microservice-demo/microservice-doc-demo/dubbo-samples-spring-boot
。
创建服务提供者
创建命名为
spring-boot-dubbo-provider
的Maven工程。在
pom.xml
文件中添加所需的依赖。这里以Spring Boot 2.0.6.RELEASE为例。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
开发Dubbo服务提供者。
Dubbo中服务都是以接口的形式提供的。
在
src/main/java
路径下创建一个packagecom.alibaba.edas.boot
。在
com.alibaba.edas.boot
下创建一个接口(interface)IHelloService
,里面包含一个SayHello
方法。package com.alibaba.edas.boot; public interface IHelloService { String sayHello(String str); }
在
com.alibaba.edas.boot
下创建一个类IHelloServiceImpl
,实现此接口。package com.alibaba.edas.boot; import com.alibaba.dubbo.config.annotation.Service; @Service public class IHelloServiceImpl implements IHelloService { public String sayHello(String name) { return "Hello, " + name + " (from Dubbo with Spring Boot)"; } }
说明这里的Service注解是Dubbo提供的一个注解类,类的全名称为:com.alibaba.dubbo.config.annotation.Service。
配置Dubbo服务。
在
src/main/resources
路径下创建application.properties
或application.yaml
文件并打开。在
application.properties
或application.yaml
中添加如下配置。# Base packages to scan Dubbo Components (e.g @Service , @Reference) dubbo.scan.basePackages=com.alibaba.edas.boot dubbo.application.name=dubbo-provider-demo dubbo.registry.address=nacos://127.0.0.1:8848
说明以上三个配置没有默认值,必须要给出具体的配置。
dubbo.scan.basePackages
的值是开发的代码中含有com.alibaba.dubbo.config.annotation.Service
和com.alibaba.dubbo.config.annotation.Reference
注解所在的包。多个包之间用逗号隔开。dubbo.registry.address
的值前缀必须以nacos://开头,后面的IP地址和端口指的是Nacos Server的地址。代码示例中为本地地址,如果您使用EDAS托管的注册中心,无需额外调整,EDAS在运行时会自动调整为正确的注册中心地址。如果您使用自建的Nacos注册中心,需将dubbo.registry.address的参数值修改为正确的Nacos地址。
开发并启动Spring Boot入口类
DubboProvider
。package com.alibaba.edas.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DubboProvider { public static void main(String[] args) { SpringApplication.run(DubboProvider.class, args); } }
登录Nacos控制台
http://127.0.0.1:8848
,在左侧导航栏中单击服务列表,查看提供者列表。可以看到服务提供者里已经包含了
com.alibaba.edas.boot.IHelloService
,且可以查询该服务的服务分组和提供者IP。
创建服务消费者
创建一个Maven工程,命名为
spring-boot-dubbo-consumer
。在
pom.xml
文件中添加相关依赖。这里以Spring Boot 2.0.6.RELEASE为例。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <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> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
如果您需要选择使用Spring Boot 1.x的版本,请使用Spring Boot 1.5.x版本,对应的com.alibaba.boot:dubbo-spring-boot-starter版本为0.1.0。
说明Spring Boot 1.x版本的生命周期已于2019年08月结束,推荐使用新版本开发您的应用。
开发Dubbo消费者。
在
src/main/java
路径下创建packagecom.alibaba.edas.boot
。在
com.alibaba.edas.boot
下创建一个接口(interface)IHelloService
,里面包含一个SayHello
方法。package com.alibaba.edas.boot; public interface IHelloService { String sayHello(String str); }
开发Dubbo服务调用。
例如需要在Controller中调用一次远程Dubbo服务,开发的代码如下所示。
package com.alibaba.edas.boot; import com.alibaba.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoConsumerController { @Reference private IHelloService demoService; @RequestMapping("/sayHello/{name}") public String sayHello(@PathVariable String name) { return demoService.sayHello(name); } }
说明这里的Reference注解是com.alibaba.dubbo.config.annotation.Reference。
在
application.properties/application.yaml
配置文件中新增以下配置。dubbo.application.name=dubbo-consumer-demo dubbo.registry.address=nacos://127.0.0.1:8848
说明以上两个配置没有默认值,必须给出具体的配置。
dubbo.registry.address
的值前缀必须以nacos://
开头,后面的IP地址和端口为Nacos Server的地址。代码示例中为本地地址,如果您将Nacos Server部署在其它机器上,请修改为实际的IP地址。
开发并启动Spring Boot入口类
DubboConsumer
。package com.alibaba.edas.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DubboConsumer { public static void main(String[] args) { SpringApplication.run(DubboConsumer.class, args); } }
登录Nacos控制台
http://127.0.0.1:8848
,在左侧导航栏中单击服务列表,再在服务列表页面查看调用者服务。可以看到包含了
com.alibaba.edas.boot.IHelloService
,且可以查看该服务的服务分组和调用者IP。
结果验证
`curl http://localhost:8080/sayHello/SAE`
`Hello, SAE (from Dubbo with Spring Boot)`
部署到SAE
本地使用Nacos作为注册中心的应用,可以直接部署到SAE中,无需做任何修改,注册中心会被自动替换为SAE上的注册中心。
您可以根据实际需求选择部署途径(控制台或工具)。具体信息,请参见应用托管概述。
使用控制台部署前,请参见如下操作将应用程序编译为可运行的JAR包、WAR包。
在
pom.xml
文件中添加以下打包插件的配置。Provider
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.edas.boot.DubboProvider</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
Consumer
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.edas.boot.DubboConsumer</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package将本地的程序打成JAR包。