5.2.2 定义 Dubbo 服务接口
Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如EchoService
接口:
package com.alibaba.cloud; public interface EchoService { String echo(String message); }
该接口非常简单,仅有一个方法,接下来将 dubbo-sample-api 部署到本地 Maven 仓库。
5.2.3 部署 artifact - dubbo-sample-api
利用 Maven 命令, 将 dubbo-sample-api 部署到本地 Maven 仓库:
% mvn clean install ... [INFO] BUILD SUCCESS
注:如果读者所使用机器的 JDK 版本过高的话,可能会出现错误提示:“不再支持源选项 5。请使用 7 或更高版本”。本例推荐选择 JDK 8 编译。
本地部署成功后,该 artifact 能被 Dubbo 服务提供者应用 dubbo-provider-sample 依赖。
5.2.4 依赖 artifact - dubbo-sample-api
将 artifact dubbo-sample-api 依赖信息添加到应用 dubbo-provider-sample 中的 pom.xml:
<!-- Dubbo 服务 artifact --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>dubbo-sample-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
依赖增加之后,下一步实现 Dubbo 服务 -EchoService
?
5.2.5 实现 Dubbo 服务
在 应用 dubbo-provider-sample 中的 com.alibaba.cloud.dubboprovidersample 包下创建实现类:
public class SimpleEchoService implements EchoService { @Override public String echo(String s) { return "[ECHO] " + s; } }
其中,@org.apache.dubbo.config.annotation.Service
?是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。因此,下一步需要将其配置 Dubbo 服务(远程)。
5.2.6 配置 Dubbo 服务提供方
在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。
Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注
@DubboComponentScan
来实现基准包扫描。
同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 bootstrap.yaml 配置如下所示:
dubbo: scan: # dubbo 服务扫描基准包 base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap protocol: # dubbo 协议 name: dubbo # dubbo 协议端口( -1 表示自增端口,从 20880 开始) port: -1 spring: 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 开始)
下半部分则是 Spring Cloud 相关配置:
-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 引导类。
5.2.7 引导 Dubbo Spring Cloud 服务提供方应用
Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:
@EnableDiscoveryClient @SpringBootApplication public class DubboProviderSampleApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderSampleApplication.class); } }
在引导DubboProviderSampleApplication
? 之前,请提前启动 Nacos 服务器。当DubboProviderSampleApplication
? 启动后,将应用dubbo-provider-sample
将出现在 Nacos 控制台界面:
当 Dubbo 服务提供方启动后,下一步实现一个 Dubbo 服务消费方。
5.3 使用 Dubbo Spring Cloud 实现 Dubbo 服务消费方
由于 Java 服务仅为?EchoService
、服务提供方应用 dubbo-provider-sample?以及 Nacos 服务器均已准备完毕。由于应用创建的步骤类似,构建消费方应用 dubbo-consumer-sample 的操作不再重复。
5.3.1 依赖 artifact - dubbo-sample-api
与服务提供方 Maven 工程类,需添加 artifact dubbo-sample-api 依赖,完整的组件 Maven 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <!-- Dubbo 服务 artifact --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>dubbo-sample-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
5.3.2 配置 Dubbo 服务消费方
Dubbo 服务消费方配置与服务提供方类似,当前应用 dubbo-consumer-sample 属于纯服务消费方,因此,所需的 boostrap.yaml 文件配置更精简:
dubbo: cloud: subscribed-services: dubbo-provider-sample spring: cloud: nacos: # Nacos 服务发现与注册配置 discovery: server-addr: 127.0.0.1:8848
对比应用 dubbo-provider-sample,除应用名称?spring.application.name
?存在差异外,dubbo-consumer-sample 新增了属性?dubbo.cloud.subscribed-services
?的设置。并且该值为服务提供方应用 “dubbo-provider-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 服务端口,如果 dubbo-provider-sample 和 dubbo-consumer-sample 在本地同步部署的话, 两者 Web 端口会出现冲突,需调整 dubbo-consumer-sample application.properties 中的?server.port
?和management.server.port
??:
# 应用服务 WEB 访问端口 server.port=9090 # Actuator Web 访问端口 management.server.port=9091
5.3.3 引导 Dubbo Spring Cloud 服务消费方应用
为了减少实现步骤,编辑引导类DubboConsumerSampleApplication
?将 Dubbo 服务消费以及引导功能合二为一:
@EnableDiscoveryClient @EnableAutoConfiguration @RestController public class DubboConsumerSampleApplication { @Reference private EchoService echoService; @GetMapping("/echo") public String echo(String message) { return echoService.echo(message); } public static void main(String[] args) { SpringApplication.run(DubboConsumerSampleApplication.class); } }
运行该引导类,通过curl
?命令访问 REST 资源/echo
?:
% curl "http://127.0.0.1:9090/echo?message=Hello,World" [ECHO] Hello,World
不难发现,Dubbo 服务提供方应用 dubbo-provider-sample 的EchoService
?计算结果返回到 dubbo-consumer-sample 中的 REST 资源/echo
。同时,在 dubbo-provider-sample 应用日志出现了以下内容:
[DUBBO] The connection of /x.x.x.x:64051 -> /x.x.x.x:20881 is established., dubbo version: 2.7.6, current host: x.x.x.x
说明 Dubbo 服务消费端应用 dubbo-consumer-sample(端口:64051) 向服务提供方应用 dubbo-provider-sample 建立连接(端口:20881)。