按照传统的 Dubbo 开发模式,在构建服务提供者之前,第一个步骤是为服务提供者和服务消费者定义 Dubbo 服务接口。
为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,该 artifact 甚至无需添加任何依赖。
对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact,并以接口调用的方式执行远程方法。接下来的步骤则是创建 artifact。
创建 artifact - dubbo-sample-api
选择合适的文件目录,通过 Maven 命令行工具构建 artifact dubbo-sample-api,如下所示:
Bash
mvn archetype:generate -DgroupId=com.alibaba.cloud -DartifactId=dubbo-sample-api -Dversion=0.0.1-SNAPSHOT -DinteractiveMode=false
命令执行后,名为“dubbo-sample-api” 的项目目录生成,切换至该目录,并使用 tree 命令(macOS 命令工具)预览器内部接口:
% tree
.
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── alibaba
│ └── cloud
│ └── App.java
└── test
└── java
└── com
└── alibaba
└── cloud
└── AppTest.java
11 directories, 3 files
其中,App.java 和 AppTest.java 文件并非需要文件,可将其删除。除此之外,当然最重要的是 pom.xml
XML
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba.cloud</groupId>
<artifactId>dubbo-sample-api</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-sample-api</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
不难看出,Maven GAV 信息均按照之前的命令来设定,并没有依赖其他组件。接下来,为当前工程定义 Dubbo 服务接口。
定义 Dubbo 服务接口
Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如EchoService接口:
Java
package com.alibaba.cloud;
public interface EchoService {
String echo(String message);
}
该接口非常简单,仅有一个方法,接下来将 dubbo-sample-api 部署到本地 Maven 仓库。
部署 artifact - dubbo-sample-api
利用 Maven 命令, 将 dubbo-sample-api 部署到本地 Maven 仓库:
Bash
% mvn clean install
...
[INFO] BUILD SUCCESS
注:如果读者所使用机器的 JDK 版本过高的话,可能会出现错误提示:"不再支持源选项 5。请使用 7 或更高版本"。本例推荐选择 JDK 8 编译。
本地部署成功后,该 artifact 能被 Dubbo 服务提供者应用 dubbo-provider-sample 依赖。
依赖 artifact - dubbo-sample-api
将 artifact dubbo-sample-api 依赖信息添加到应用 dubbo-provider-sample 中的 pom.xml:
XML
<!-- Dubbo 服务 artifact -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>dubbo-sample-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
依赖增加之后,下一步实现 Dubbo 服务 -EchoService
实现 Dubbo 服务
在 应用 dubbo-provider-sample 中的 com.alibaba.cloud.dubboprovidersample 包下创建实现类:
Java
public class SimpleEchoService implements EchoService {
@Override
public String echo(String s) {
return "[ECHO] " + s;
}
}
其中,@org.apache.dubbo.config.annotation.Service是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。 因此,下一步需要将其配置 Dubbo 服务(远程)。
配置 Dubbo 服务提供方
在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。
Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注 @DubboComponentScan 来实现基准包扫描。
同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 bootstrap.yaml 配置如下所示:
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 引导类。
引导 Dubbo Spring Cloud 服务提供方应用
Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:
Java
@EnableDiscoveryClient
@SpringBootApplication
public class DubboProviderSampleApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderSampleApplication.class);
}
}
在引导 DubboProviderSampleApplication 之前,请提前启动 Nacos 服务器。当
DubboProviderSampleApplication 启动后,将应用 dubbo-provider-sample 将出现在 Nacos 控制台界面:
当 Dubbo 服务提供方启动后,下一步实现一个 Dubbo 服务消费方。
阅读量:201
点赞量:0
收藏量:0