Nacos作为注册中心(二) 使用Dubbo开发消费者对提供者的调用

一、前言

至于为什么使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值