Dubbo Spring Cloud 入门
简介
Dubbo Spring Cloud
基于Dubbo Spring Boot 2.7.1
和Spring 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-starter
等artifact
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.Service
是Dubbo
服务注解,仅声明该 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
服务提供方和消费方的运用,更多的详情请直接参考模块:
模块说明
- spring-cloud-dubbo-sample-api:
API
模块,存放Dubbo
服务接口和模型定义 - spring-cloud-dubbo-provider-web-sample:
Dubbo Spring Cloud
服务提供方示例(Web 应用) - spring-cloud-dubbo-provider-sample:
Dubbo Spring Cloud
服务提供方示例(非 Web 应用) - spring-cloud-dubbo-consumer-sample:
Dubbo Spring Cloud
服务消费方示例 - spring-cloud-dubbo-servlet-gateway:
Dubbo Spring Cloud Servlet
网关简易实现示例
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/26/getting-started-with-dubbo-spring-cloud/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论