04-Nacos微服务注册中心--集群部署和配置中心

一、配置中心

Nacos不仅可以作为注册中心,也可以作为配置中心

1.1 为什么需要配置中心

在没有配置中心之前,传统应用配置的存在以下痛点:

1、采用本地静态配置,无法保证实时性:修改配置不灵活且需要经过较长的测试发布周期,无法尽快通知到客户端,还有些配置对实时性要求很高,比方说主备切换配置或者碰上故障需要修改配置,这时通过传统的静态配置或者重新发布的方式去配置,那么响应速度是非常慢的,业务风险非常大

2、易引发生产事故:比如在发布的时候,容易将测试环境的配置带到生产上,引发生产事故。

3、配置散乱且格式不标准:有的用properties格式,有的用xml格式,还有的存DB,团队倾向自造轮子,做法五花八门。

4、配置缺乏安全审计、版本控制、配置权限控制功能:谁?在什么时间?修改了什么配置?无从追溯,出了问题也无法及时回滚到上一个版本;无法对配置的变更发布进行认证授权,所有人都能修改和发布配置

使用配置中心后

1、通过格式统一化配置中心,可以使得配置标准化、

2、当配置信息发生变动时,修改实时生效,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上,快速响应变化。比方说某个功能只是针对某个地区用户,还有某个功能只在大促的时段开放,使用配置中心后只需要相关人员在配置中心动态去调整参数,就基本上可以实时或准实时去调整相关对应的业务。

3、通过审计功能还可以追溯问题

1.2 新建modules

1、新建modules子模块:cloud-nacos-config-3377

04-Nacos微服务注册中心--集群部署和配置中心_第1张图片

2、引入依赖

    
    com.alibaba.cloud  
    spring-cloud-starter-alibaba-nacos-config  

3、YAML配置顺序

要注意的是这里我们要配置两个,因为Nacos同SpringCloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

分别要配置的是,这里bootstrap.yml配置好了以后,作用是两个,第一个让3377这个服务注册到Nacos中,第二个作用就是去Nacos中去读取指定后缀为yaml的配置文件:

bootstrap.yml

server:  
  port: 3377  
  
spring:  
  application:  
    name: nacos-config-client  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848  
      config:  
        server-addr: localhost:8848  
        file-extension: yaml

application.yml

spring:
  profiles:
    active: dev # 表示开发环境

启动类需要加上相关注解

@SpringBootApplication  
@EnableDiscoveryClient  
public class CloudNacosConfig3377Application {  
  
    public static void main(String[] args) {  
        SpringApplication.run(CloudNacosConfig3377Application.class, args);  
    }  
  
}

1.3 新建业务类

这里的@RefreshScope实现配置自动更新,意思为如果想要使配置文件中的配置修改后不用重启项目即生效,可以使用@RefreshScope配置来实现

@RestController  
@RefreshScope  
public class DemoController {  
  
    @Value("${config.info}")  
    private String configInfo;  
  
    @GetMapping("/config/info")  
    public String getConfigInfo(){  
        return configInfo;  
    }  
}

1.4 Nacos配置规则

在 Nacos Spring Cloud 中,dataId 的完整格式如下(详情可以参考官网 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html):

${prefix}-${spring.profiles.active}.${file-extension}
  1. prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

  2. spring.profiles.active 即为当前环境对应的 profile,注意:spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}(不能删除)

  3. file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

  4. 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:

  5. 所以根据官方给出的规则我们最终需要在Nacos配置中心添加的配置文件的名字规则和名字为:

# ${spring.application.name}-${spring.profiles.active}.${file-extension}
# nacos-config-client-dev.yaml
# 微服务名称-当前环境-文件格式

04-Nacos微服务注册中心--集群部署和配置中心_第2张图片

1.5 Nacos平台配置中心模块创建配置

04-Nacos微服务注册中心--集群部署和配置中心_第3张图片

发布成功后,即可在列表看到我们刚刚创建的配置文件
04-Nacos微服务注册中心--集群部署和配置中心_第4张图片

1.6 访问验证

在Nacos平台上更改配置,先不要重新启动服务即可刷新新的配置
04-Nacos微服务注册中心--集群部署和配置中心_第5张图片

1.7 Nacos命名空间分组和DataID三者关系

1.7.1 命名空间(NameSpace)

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

1.7.2 配置分组(group)

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置.

1.7.3 配置集ID (dataId)

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

配置集:一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

1.7.4 三者关系

这三者的关系类似于Java里面的package名和类名,最外层的Namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
04-Nacos微服务注册中心--集群部署和配置中心_第6张图片

默认情况

Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

具体情况

Nacos默认的命名空间是public,我们就可以利用Namespace来实现隔离,比如我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

Group本身就是分组的意思,它可以把不同的微服务划分到同一个分组里面去。

剩下的就是具体微服务,一个Service可以包含多个Cluster,Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比如说,将一个Service部署在北京和和杭州的机房中,北京机房的Service就可以起名为(BJ),杭州机房中的Service就可以起名为(HZ),这样就可以尽量让同一个机房的微服务互相调用,提升性能。

1.8 切换不同环境

1.8.1 DataId切换

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置,配置规则:默认空间+新建dev和test两个DataId:

  1. 新建dev配置DataID

  2. 新建test配置DataID
    04-Nacos微服务注册中心--集群部署和配置中心_第7张图片

  3. 通过spring.profile.active属性就能进行多环境下配置文件的读取

spring:  
  profiles:  
    active: dev
  1. 重启项目测试访问
    04-Nacos微服务注册中心--集群部署和配置中心_第8张图片

1.8.2 Group方案

Group默认分组名称是:DEFAULT_GROUP。创建两个分组:DEV和TEST

1、新建DEV_GROUP分组
04-Nacos微服务注册中心--集群部署和配置中心_第9张图片

2、 新建TEST_GROUP分组
04-Nacos微服务注册中心--集群部署和配置中心_第10张图片

3、查看配置中心列表

DataID 名字一致,但分组不同的两个配置文件

04-Nacos微服务注册中心--集群部署和配置中心_第11张图片

4、完整以上配置后,需要配置yml文件

完成以上配置以后,接下来就需要通过bootstrap+application来配合完成。
具体方式:在config下增加一条Group的配置即可,可以配置为DEV_GROUP或TEST_GROUP

bootstrap:

server:  
  port: 3377  
  
spring:  
  application:  
    name: nacos-config-client  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848  
      config:  
        server-addr: localhost:8848  
        file-extension: yaml #指定yaml文件  
        group: TEST_GROUP  #增加分组

application:

spring:  
  profiles:  
   # active: test  
     active: info

5、测试访问(不同的组)

04-Nacos微服务注册中心--集群部署和配置中心_第12张图片

1.8.3 NameSpace方案

1、 我们找到Nacos平台的命名空间模块,创建新的命名空间

04-Nacos微服务注册中心--集群部署和配置中心_第13张图片

2、 在我们刚新建的命名空间下,创建配置文件

dev:
04-Nacos微服务注册中心--集群部署和配置中心_第14张图片

test:
04-Nacos微服务注册中心--集群部署和配置中心_第15张图片

查看Nacos的配置中心列表,看到我们新创建的配置

04-Nacos微服务注册中心--集群部署和配置中心_第16张图片

3、 修改Java配置文件

主要增加NameSpace参数,找到命名空间下面的DataId
bootstrap:

server:  
  port: 3377  
  
spring:  
  application:  
    name: nacos-config-client  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848  
      config:  
        server-addr: localhost:8848  
        file-extension: yaml #指定yaml文件  
        group: TEST_GROUP  #增加分组  
        namespace: a5b1e448-8bee-412f-86ca-81500e029560 #增加命名空间

4、 测试访问

04-Nacos微服务注册中心--集群部署和配置中心_第17张图片

二、Nacos集群部署

参考网站:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

2.1 Nacos支持三种部署方式

  • 单机模式: 用于测试和单机试用
  • 集群模式: 用于生产环境,确保高可用
  • 多集群模式:用于多数据中心场景

生产环境集群部署架构图:
04-Nacos微服务注册中心--集群部署和配置中心_第18张图片
具体拆分后如下:
04-Nacos微服务注册中心--集群部署和配置中心_第19张图片

默认Nacos使用嵌入式数据库实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据储存存在一致性问题,为了解决这个问题,Nacos采用了集中存储方式来支持集群化部署,目前仅支持MySql的存储

  1. 推荐使用Linux
  2. 可以使用内部数据源或者外部数据源(推荐使用外部)MySql

2.2 准备环境

简单搞搞:因为Nacos占用内存较大,准备1Nginx+2Nacos+1MySql

节点 IP 端口
nacos 192.168.184.131 8848
nacos2 192.168.184.131 8849
nacos3 192.168.184.131 8850

2.3 安装Linux版本的Nacos安装包

2.4 持久化切换配置

Nacos默认自带嵌入式数据库derby,所以我们每次创建一个Nacos实例就会有一个derby,当有多个Nacos节点的时候,就会出现一致性问题,所以Nacos支持了外部数据库统一数据管理MySql。

具体配置方式可以参考官网:https://nacos.io/zh-cn/docs/deployment.html

1、我们需要找到Nacos安装目录下的conf目录中的Sql脚本,然后在数据库中进行执行

注意:由于Nacos给出的SQL脚本没有自带创建数据库SQL,所以我们需要先创建DB

CREATE DATABASE nacos_config;
USE nacos_config;

04-Nacos微服务注册中心--集群部署和配置中心_第20张图片

执行完成后
04-Nacos微服务注册中心--集群部署和配置中心_第21张图片

2.5 更改Nacos配置文件

2.5.1 更改application.properties文件

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
db.user=root
db.password=123456

修改server.prot端口,改成我们自己集群定义好的端口
注意: nacos官方建议我们在定义端口的时候,最好有偏移量。2.x版本Nacos本身会占用其他端口,不建议这样使用(8848 8849 8850),最好隔开 例如8848 8868 8888

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848

配置完成后,分别拷贝两份,nacos、nacos2、nacos3 三个集群,修改各自端口即可

2.5.2 启动三个Nacos

nacos默认集群启动

./startup.sh

image.png

2.6 配置Nginx

修改之前,先备份Nginx配置文件,养成良好的备份习惯

  • 修改nginx-nacos.conf配置文件
 upstream nacos-cluster{
        server 127.0.0.1:8848;
        server 127.0.0.1:8849;
        server 127.0.0.1:8850; 
   }


 server {
        listen       81;
        server_name  localhost;
        
        location /nacos{
            proxy_pass http://nacos-cluster;
        }

启动Nginx

./nginx -c /usr/local/nginx/cong/nginx-nacos.conf

2.7 测试访问效果

04-Nacos微服务注册中心--集群部署和配置中心_第22张图片

可以看到正常访问,并且我们添加一条配置信息后,查看数据库发现已经在MySQL存储

04-Nacos微服务注册中心--集群部署和配置中心_第23张图片

你可能感兴趣的:(微服务,微服务,java,spring,boot)