一、前言

至于为什么使用 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 的实现类不在同一个包下的问题

springboot 整合 dubbo ,@Reference @Service 可能空指针