一起来学SpringCloud之整合Nacos配置中心与注册中心

271 阅读5分钟

前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个SpringCloud长期系列教程,从入门到进阶, 篇幅会较多~

适合人群

  • 有一定的ava基础
  • 想尝试微服务开发
  • 有SpringBoot开发基础
  • 想学习或了解SpringCloud
  • 想提高自己的同学

大佬可以绕过 ~

背景

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot这门框架,熟练掌握了单体应用的开发,如今微服务开发盛行,对我们的技术要求也是越来越高,薪资也是令人兴奋。这个系列将会带大家学习SpringCloud微服务开发,我会带大家一步一步的入门,耐心看完你一定会有收获~

情景回顾

上期带大家一起认识了什么是微服务以及各种场景下暴露出的问题,本期呢,就是带着这些问题去一起看一下有哪些成熟的技术可以帮助我们去解决问题。之前我们谈到服务间调用的时候,给大家讲到了配置中心和注册中心,它能够帮助我们管理我们的服务,让我们调用的时候从配置中心获取服务的信息,然后进行调用,本节呢,就是要学习一下配置中心和注册中心,我们主要学习一下Nacos,目前市场上用的也是比较多的,我们一起来看一下吧~

SpringCloud是啥

学习之前,我们要先有一个概念,SpringCloud它不是一个框架,不像SpringBoot那样,我们要学习它的各个方法和特性,首先要理解的是它是一个解决方案,他把社区里各个优秀的开源技术整合到了自己的Spring大家族里,形成了一套完善的微服务体系,在后边的学习中,你将会学习到各种组件的整合,它们都有独特的功能和特定的使用场景

Nacos是啥

当我们学习一门新技术的时候,首先要去它的官网看一下,先了解一下它是在什么场景下使用的,不要学到了最后,都不知道是干啥的。

Nacos官网是这么介绍的:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施

![nacos.io/img/nacosMa…]

其实官网介绍的很全了,我就不复制了,大家可以自行去查看,这里给大家总结几个主要特性:

  • 服务发现和服务健康监测

  • 动态配置服务

  • 动态 DNS 服务

  • 服务及其元数据管理

环境搭建

有了基本的认识之后,我们开始整吧, 首先需要安装nacos,大家可以取下载对应的jar包,下载地址 https://nacos.io/zh-cn/docs/quick-start.html

我用的是1.1.4的,大家可以在github上下载往期版本,目前最新应该是1.4.3

下载好后,解压它,找到配置文件,修改它,在 conf下,修改application.properties

db.num=0
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=xxxx

然后需要我们做的是,把conf下的sql导入到数据库,因为nacos可以持久化配置,接下来就是启动了, 回到它的bin目录,运行./startup.sh, win用户可以运行startup.cmd, 它有一个控制台地址localhost:8848,默认用户名和密码都是nacos

集成SpringCloud

首先修改pom.xml引入如下依赖, 项目我们依然使用之前的项目,大家可以自己单独建一个工程

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring.boot.version>2.2.5.RELEASE</spring.boot.version>
    <spring.cloud.version>Hoxton.SR3</spring.cloud.version>
    <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>

<!-- 依赖约束 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>3.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>
</dependencies>

然后我们添加一个模块springcloud-nacos, 在它的根目录下修改pom.xml:

 <dependencies>
    <!-- nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

resources下新建 bootstrap.yml, 之前我们都是建的application.yml,这里给大家说下它。它比application.yml有较高的优先级,也就是说它的配置不会被覆盖,我们可以把固定的配置写到这里,因为我们要集成nacos,所以后边我们就直接从nacos里获取配置了,可以实现动态获取

修改bootstrap.yml

server:
  port: 8003

spring:
  application:
    name: app-nacos
  cloud:
    # nacos
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml

接着我们新建一个启动类,测试一下:

@SpringCloudApplication
public class NacosAppication {
    public static void main(String[] args) {
        SpringApplication.run(NacosAppication.class, args);
    }
}

运行成功后,打开nacos控制台看一下,服务列表,会发现多了一个服务app-nacos,那么表示服务自动注册成功了, 默认下是在命名空间public下,如果想指定命名空间,需要新建命名空间,并修改bootstrap配置:

nacos:
    config:
    server-addr: 127.0.0.1:8848
    file-extension: yml
    namespace: '2ef2186e-078c-4904-8643-ff5e90555456'

如何从nacos中获取配置

那么作为配置中心我们可以干啥呢?我们看到控制台有一个配置列表,点开,发现是空的,首先说明的是Nacos配置中心通过namespace、dataId和group来唯一确定一条配置。也就是

${prefix} - ${spring.profiles.active} . ${file-extension}
  • file-extension 一般我们指定yml

  • spring.profiles.active 这个有没有很熟悉(之前讲的多环境)

  • prefix 我们也可以手动指定,默认为pring.application.name的值

好,有了上面的基本概念之后,我们新建一个配置app-nacos.yml,选择文件类型是yaml,随便输入点

app: 
    name: nacos

下面我们要做的就是从nacos中获取这个配置信息, 在这之前,给大家提示一下,这个配置也可以分层的,我们可以看到还有一个Group组的概念,也就是说可以指定组中的配置,好家伙,又约束了一层

cloud:
# nacos
nacos:
    config:
    server-addr: 127.0.0.1:8848
    file-extension: yml
    namespace: '2ef2186e-078c-4904-8643-ff5e90555456'
    prefix: febs
    group: g_nacos

好了之后,我们来代码实操一下,为了方便演示,我直接就写到控制器里了

@RestController
@RefreshScope
public class ConfigController {
    @Value("${app:name}")
    private String appName;

    @GetMapping("/api/appInfo")
    public String appInfo() {
        return "appName: " + appName;
    }
}

主要通过@RefreshScope这个注解去获取,它支持动态刷新,大家可以试试把配置的app.name修改一下,会发现配置立即就生效了,这个功能有利于我们切配置的时候无缝衔接,比如我们服务转移了,或者数据库迁移了,很方便,所以说为啥要用Nacos,因为它方便强大

如果我想回滚配置怎么办呢?

我们可以发现配置列表有一个回滚的按钮,它可以帮助我们回滚到上一个版本的配置,

如果我想禁止它自动刷新怎么做呢?

修改配置

 nacos:
    config:
    server-addr: 127.0.0.1:8848
    file-extension: yml
    namespace: '2ef2186e-078c-4904-8643-ff5e90555456'
    prefix: febs
    group: g_nacos
    refresh: false

如何进行多配置读取呢?

我们可以通过指定的配置:

extension-configs:
        - dataId: nacos1.yaml
        group: g_1
        refresh: true
        - dataId: nacos2.yaml
        group: g_2
        refresh: false

另外我们也可以通过共享配置

extension-configs:
       shared-configs: ext-config-one.yaml,ext-config-two.yaml

或者我们就直接不指定

shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

结束语

本期就到这里结束了,总结一下,本节主要讲了Nacos的基本介绍以及带大家安装了它,然后集成到SpringCloud的项目中,带大家体验了一下它作为注册中心配置中心的功能使用。

下期预告

有了配置中心之后,下期我们就带大家实现一下远程调用,看看在nacos下如何轻松的实现服务间调用, 将带大家学习RestTemplate的使用, 实现一个生产者和消费者的小例子, 下期不见不散 ~

更文时间

  • 工作日(周一 🍉 周五)
  • 周末不更 ☀️
  • 节假日不定时更

往期内容

项目源码(源码已更新 欢迎star⭐️)