Spring Boot整合Dubbo和Nacos

Spring Boot整合Dubbo和Nacos

目前适用于Spring Cloud服务注册中心的解决方案比较多,诸如:ConsulSpring Cloud EurekaZookeeperEtcd等,配置中心有:Spring Cloud ConfigApolloDisconf等。总感觉这些搭建起来较为繁琐,所以考虑使用Nacos来做配置和服务注册中心。

简介


Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。Dubbo的注册中心有多种:Multicast、zookeeper、Nacos、Redis、Simple,官方推荐使用Zookeeper作为注册中心,不过在我之前搭建大数据的时候,总感觉Zookeeper太重了,觉得Nacos才是我想要的。

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它具有:动态配置服务、服务发现及管理、动态DNS服务等功能。
这里我用到的环境为:

  • Dubbo 2.7.5
  • Nacos 1.1.4
  • MariaDB 10.3.10
  • Windows 10
  • IntelliJ IDEA 2019.3.1
  • 64 bit JDK 1.8.0_231
  • Spring Boot 2.2.3.RELEASE

部署Nacos开发环境

数据库安装在这里就不展开细说,大家自行探索。首先需要去https://github.com/alibaba/nacos/releases下载Nacos,解压之后目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
│  LICENSE
│ NOTICE

├─bin
│ shutdown.cmd
│ shutdown.sh
│ startup.cmd
│ startup.sh

├─conf
│ application.properties
│ application.properties.example
│ cluster.conf.example
│ nacos-logback.xml
│ nacos-mysql.sql
│ schema.sql

└─target
nacos-server.jar
  • 先初始化Nacos数据库,这里我创建了一个名为nacos-config的数据库并导入nacos-mysql.sql的数据库脚本.
  • 修改conf/application.properties文件,添加mysql数据源的url、用户名和密码。
    1
    2
    3
    4
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=root
    我们进入到bin目录,双击startup.cmd文件启动Nacos服务:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
             ,--.
    ,--.'|
    ,--,: : | Nacos 1.1.4
    ,`--.'`| ' : ,---. Running in stand alone mode, All function modules
    | : : | | ' ,'\ .--.--. Port: 8848
    : | \ | : ,--.--. ,---. / / | / / ' Pid: 24724
    | : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.3.27:8848/nacos/index.html
    ' ' ;. ;.--. .-. | / / '' | |: :| : ;_
    | | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
    ' : | ; .' ," .--.; |' ; :__| : | `----. \
    | | '`--' / / ,. |' | '.'|\ \ / / /`--' /
    ' : | ; : .' \ : : `----' '--'. /
    ; |.' | , .-./\ \ / `--'---'
    '---' `--`---' `----'

    此处省略xxx行

    2020-01-18 11:17:19,063 INFO Exposing 2 endpoint(s) beneath base path '/actuator'

    2020-01-18 11:17:19,104 INFO Initializing ExecutorService 'taskScheduler'

    2020-01-18 11:17:19,297 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

    2020-01-18 11:17:19,304 INFO Nacos Log files: E:\tool\nacos-server-1.1.4\nacos/logs/

    2020-01-18 11:17:19,304 INFO Nacos Conf files: E:\tool\nacos-server-1.1.4\nacos/conf/

    2020-01-18 11:17:19,305 INFO Nacos Data files: E:\tool\nacos-server-1.1.4\nacos/data/

    2020-01-18 11:17:19,306 INFO Nacos started successfully in stand alone mode.

    2020-01-18 11:17:19,812 INFO Initializing Servlet 'dispatcherServlet'

    2020-01-18 11:17:19,823 INFO Completed initialization in 11 ms
    由于只是开发环境,所以就先搭建这个单机模式版本,现在我们访问Nacos服务:http://192.168.3.27:8848/nacos/index.html

    默认用户名和密码为:nacos/nacos

IDEA创建多模块项目

新建一个Maven项目

步骤:Create New Project->选择Maven点击Next->输入项目名称、选择目录存放地址等,点击Finish,创建完成后,我们需要删除src目录并且在pom添加<packaging>pom</packaging>,如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.nacos</groupId>
<artifactId>dubbo-nacos</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

</project>


创建Provider模块

在项目上点击右键,New->Module输入项目信息,点击Next->Finish


创建Consumer模块

在项目上点击右键,New->Module输入项目信息,点击Next->Finish

引入相关jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<properties>
<spring-boot.version>2.2.3.RELEASE</spring-boot.version>
<dubbo.version>2.7.5</dubbo.version>
<nacos.version>1.1.4</nacos.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>


</dependencies>
</dependencyManagement>

<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<!-- Dubbo Registry Nacos -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>

<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>

Dubbo&Nacos注册中心

我们首先在Provider创建一个服务并注册到nacos中.

  1. 配置application:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    spring.application.name=dubbo-nacos-provider

    # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
    dubbo.scan.base-packages=com.nacos.provider.service
    # Dubbo Protocol
    dubbo.protocol.name=dubbo
    ## Random port
    dubbo.protocol.port=8888

    ## Dubbo Registry
    nacos.server-address = 127.0.0.1
    nacos.port = 8848
    dubbo.registry.address=nacos://${nacos.server-address}:${nacos.port}
  2. 创建一个DemoService接口
    1
    2
    3
    4
    5
    public interface DemoService {

    String sayHello(String name);

    }
  3. 创建实现类并引入dubbo提供的@Service注解:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Service(version = "1.0.0")
    public class DemoServiceImpl implements DemoService {

    @Value("${dubbo.application.name}")
    private String serviceName;

    public String sayHello(String name) {
    return String.format("[%s] : Hello, %s", serviceName, name);
    }
    }
    把我们的Provider运行起来(请勿关闭,供下面consumer程序调用),可以看到服务已经注册到Nacos

现在我们来实现对服务的消费.首先当然还是我们的application的配置:

1
2
3
4
5
6
7

spring.application.name=dubbo-nacos-consumer

## Dubbo Registry
nacos.server-address = 127.0.0.1
nacos.port = 8848
dubbo.registry.address=nacos://${nacos.server-address}:${nacos.port}

新建了一个Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping("/demo")
@RestController
public class DemoController {

@Reference(version = "1.0.0")
private DemoService demoService;

@GetMapping("hello/{name}")
public ResponseEntity<String> sayHello(@PathVariable String name)
{
return new ResponseEntity<String>(demoService.sayHello(name),HttpStatus.OK);
}
}

并引入Provier用到的接口DemoService
启动起来,调用接口:

Nacos作为配置中心

如果要使用Nacos作为我们的配置中心的话,这里还需要引入一个包:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.4</version>
</dependency>

并在配置文件中加入nacos.config.server-addr的配置:

1
nacos.config.server-addr=127.0.0.1:8848  # 根据实际部署情况修改

然后,我们进入到Nacos控制台,新建一个配置名为dubbo-nacos-config,如下:

配置的相关说明,

1
2
3
4
Data ID:com.alibaba.nacos.example.properties
Group:不填写,即使用默认的 DEFAULT_GROUP。
配置格式:Properties
配置内容:connectTimeoutInMills=3000

在Spring Boot启动类加上@NacosPropertySource(dataId = "dubbo-nacos-config", autoRefreshed = true),autoRefreshed表示自动刷新
这里我们在需要用到配置的类中加入如下代码:

1
2
@NacosValue(value = "${service.name:default}", autoRefreshed = true)
private String serviceName

@NacosValue@Value的用法差不多。然后在controller添加了一个方法:

1
2
3
4
5
@GetMapping("version")
public ResponseEntity<String> getNacosConfig()
{
return new ResponseEntity<String>(nacosConfig.getServiceName(),HttpStatus.OK);
}

启动程序,访问http://localhost:8080/demo/version,可以看到我们获取到了nacos中的配置数据:

我在nacos中修改配置文件的值:

1
service.name=demo

直接刷新页面可以发现我们的值自动改变了,

[参考]
https://github.com/apache/dubbo-spring-boot-project/tree/master/dubbo-spring-boot-samples
https://nacos.io/en-us/docs/quick-start-spring-boot.html
http://dubbo.apache.org/en-us/docs/user/quick-start.html

有问题一定要多看官方文档和Github

You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×