一、前言
至于为什么使用 Nacos 而不是 ZooKeepr?网上有很多文章是关于 Nacos 与 ZooKeeper,Nacos 与 Consul、Eureka 的对比。
Dubbo 的版本目前主力维护的有 2.6.x 和 2.7.x 两大版本,其中:
- 2.6.x 主要以 bugfix 和少量 enhancements 为主,因此能完全保证稳定性
- 2.7.x 作为社区的主要开发版本,得到持续更新并增加了大量新 feature 和优化,同时也带来了一些稳定性挑战
Dubbo 的版本说明可以参考 dubbo.apache.org 网址的说明: Dubbo 版本发布及新特性速览
二、Nacos 的安装
Nacos 的安装参考该篇文章《Nacos 作为注册中心 (一) 使用 Spring Cloud 开发消费者对提供者的调用》
三、创建 IDEA 项目
项目的结构如下:

3.1 创建 Maven 工程



然后把 src 目录删除掉,这是父项目,没有代码。

3.2 模块 nacos-dubbo-interface
3.2.1 创建 Module



在 nacos-dubbo-interface 下创建 1 个 interface,取名为 IEchoService.class
package com.anron.common.service;
/**
* @Author: Anron
* @Date: 2020/8/5 11:28
*/
public interface IEchoService {
String echo(String str);
}
3.3 模块 nacos-dubbo-provider
3.3.1 创建工程



3.3.2 修改 pom.xml
# 在<dependencies></dependencies>中添加4个库
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</dependency>
# 在<properties></properties>中添加1个配置
<maven.test.skip>true</maven.test.skip>
如果 Nacos Server 没有启动时,而 pom.xml 文件中没有配置 “<maven.test.skip>true</maven.test.skip>”,maven package 打包时会出现如下错误信息:
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project nacos-dubbo-provider: There are test failures.
3.3.3 创建 EchoServiceImpl.java
package com.anron.provider.service.impl;
import com.anron.common.service.IEchoService;
import org.apache.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
/**
* @Author: Anron
* @Date: 2020/8/5 11:42
*/
@Service(version = "${dubbo.service.version}")
public class EchoServiceImpl implements IEchoService {
@Autowired
private Environment environment;
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public String echo(String str) {
String port = environment.getProperty("dubbo.application.qos-port");
log.info("port=" + port + ", param="+ str);
return str;
}
}
注意:这里的 @Service 是 Dubbo 的注解,不是 Spring Framework 的注解,来自 org.apache.dubbo.config.annotation.Service 而不是 org.springframework.stereotype.Service,否则程序在运行时会提示以下信息
No Spring Bean annotating Dubbo's @Service was found under package
3.3.4 修改 application.yml
spring:
application:
name: nacos-dubbo-demo
nacos:
service-address: 192.168.1.17
port: 8848
dubbo:
service:
version: 1.0.0
application:
name: dubbo-service-provider
qos-enable: true
#qos-port: -1
registry:
address: nacos://${nacos.service-address}:${nacos.port}
protocol:
name: dubbo
port: -1 # -1 表示端口自增 from 20880
scan:
base-packages: com.anron.*.service.impl
3.3.5 修改父项目的 pom.xml
子项目由于是 Spring Boot 项目,没有自动添加到父项目 pom 中的 modules,需手动添加
# 在<modules></modules>中增加
<module>nacos-dubbo-provider</module>
3.4 模块 nacos-dubbo-consumer
3.4.1 创建工程

注意这里的包名:com.anron.consumer,下面引用了 @Reference 的类要放在该目录或其子目录下,否则 Dubbo 不扫描,导致消费者注册不上 Nacos Server


3.4.2 修改 pom.xml
# 在<dependencies></dependencies>中添加4个库
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</dependency>
3.4.3 创建 TestController
package com.anron.consumer.controller;
import com.anron.common.service.IEchoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: Anron
* @Date: 2020/8/5 17:12
*/
@RestController
public class TestController {
@Reference(version = "${dubbo.service.version}", check = false)
private IEchoService echoService;
@RequestMapping(value = "/echo-test/{str}", method = RequestMethod.GET)
public String test(@PathVariable String str) {
return echoService.echo(str);
}
}
注意:@Reference 中加上 check=false 或者在 pom.xml 中加上 <maven.test.skip>true</maven.test.skip>,否则 maven package 打包时会提示以下错误信息
Error creating bean with name 'testController': Injection of @Reference dependencies is failed
3.4.4 修改 application.yml
spring:
application:
name: nacos-dubbo-demo
nacos:
service-address: 192.168.1.17
port: 8848
dubbo:
service:
version: 1.0.0
application:
name: dubbo-service-consumer
registry:
address: nacos://${nacos.service-address}:${nacos.port}
3.4.5 修改父项目的 pom.xml
子项目由于是 Spring Boot 项目,没有自动添加到父项目 pom 中的 modules,需手动添加
# 在<modules></modules>中增加
<module>nacos-dubbo-consumer</module>
四、测试
先确保 Nacos server 已启动,然后开启 2 个服务提供者
java -jar nacos-dubbo-provider-0.0.1-SNAPSHOT.jar --dubbo.application.qos-port=22222
java -jar nacos-dubbo-provider-0.0.1-SNAPSHOT.jar --dubbo.application.qos-port=22223
开启 1 个服务消费者
java -jar nacos-dubbo-consumer-0.0.1-SNAPSHOT.jar
调用 consumer 的接口进行多次测试
curl http://127.0.0.1:8080/echo-test/11
curl http://127.0.0.1:8080/echo-test/22
curl http://127.0.0.1:8080/echo-test/33
curl http://127.0.0.1:8080/echo-test/44
有关 Dubbo Qos 的说明可以参考 dubbo.apache.org 网址的说明:在线运维命令 QOS
必看!!!
关于 springBoot 整合 dubbo 时,扫描配置 service 的接口和 service 的实现类不在同一个包下的问题