一、前言
至于为什么使用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