20. Spring Cloud Alibaba Nacos服务注册和配置中心

Nacos

Nacos简介

为什么叫Nacos

前四个字母分别为:Naming(服务注册) 和 Configuration(配置中心) 的前两个字母,后面的 s 是 Service

什么是Nacos

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos:Dynamic Naming and Configuration Server

Nacos就是注册中心 + 配置中心的组合 + 服务总线

等价于:Nacos = Eureka + Config + Bus

能干嘛

替代Eureka做服务注册中心

替代Config做服务配置中心

替代Bus做服务配置中心

下载

官网:https://github.com/alibaba/nacos

nacos文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

比较

在这里插入图片描述

Nacos在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验

安装并运行

本地需要 java8 + Maven环境

下载:https://github.com/alibaba/nacos/releases/tag/1.1.4

github经常抽风,可以使用:https://blog.csdn.net/buyaopa/article/details/104582141

解压后:运行bin目录下的:startup.cmd

访问http://localhost:8848/nacos结果页面

在这里插入图片描述

Nacos作为服务注册中心

服务提供者注册Nacos

1.New Module: cloudalibaba-provider-payment9001
2.pom
		<!--nacos-discovery-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>

		<!--boot: web actuator-->

		<!--通用配置-->
3.yml
server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'
4.启动类

在这里插入图片描述

5.业务类
@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
     return "nacos registry, serverPort:" + serverPort +"\t id:" + id;
    }
}
6.启动

nacos-payment-provider已经成功注册了

在这里插入图片描述

这个时候 nacos服务注册中心 + 服务提供者 9001 都OK了

7. New Module: cloudalibaba-provider-payment9002

除了传统的新建模块之外,通过IDEA的拷贝映射,也可以实现

端口映射

通过IDEA的拷贝映射,可以实现,以9003为例

在这里插入图片描述

添加-DServer.port=9003

在这里插入图片描述

最后能够看到两个实例

在这里插入图片描述

在这里插入图片描述

服务消费者注册到Nacos

Nacos天生集成了Ribbon,因此它就具备负载均衡的能力

1.New Module: cloudalibaba-consumer-nacos-order83
2.pom

同9001

3.yml
server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos地址

# 消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider
4.启动类

cloudalibaba-consumer-nacos-order83.java

同9001

5.配置类
package com.indi.springcloud.config;

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
5.业务类
@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
     return "nacos registry, serverPort:" + serverPort +"\t id:" + id;
    }
}
6.启动

测试

启动9001、9002、83

测试地址:http://localhost:83/consumer/payment/nacos/13

在这里插入图片描述
在这里插入图片描述

只需要配置了nacos,就能轻松实现负载均衡

服务中心对比

之前我们提到的注册中心对比图

在这里插入图片描述

但是其实Nacos不仅支持AP,而且还支持CP,它的支持模式是可以切换的,我们首先看看Spring Cloud Alibaba的全景图,

在这里插入图片描述

Nacos和CAP

CAP:分别是一致性,可用性,分区容错性

在这里插入图片描述

我们从下图能够看到,nacos不仅能够和Dubbo整合,还能和K8s,也就是偏运维的方向

在这里插入图片描述

Nacos支持AP和CP切换

C是指所有的节点同一时间看到的数据是一致的,而A的定义是所有的请求都会收到响应

何时选择何种模式?

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都是适合AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误

切换模式命令:curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

Nacos作为服务配置中心演示

我们将我们的配置写入Nacos,然后以Spring Cloud Config的方式获取配置

Nacos作为配置中心 - 基础配置

1.New Module: cloudalibaba-config-nacos-client3377
2.pom
		<!--nacos-config-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>
		
		<!--nacos-discovery-->

		<!--boot: web actuator-->

		<!--通用配置-->
3.yml

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: test # 测试环境
    active: dev	# 开发环境
为什么要配置两个yml

Nacos同Spring Cloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常运行。

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

4.main

NacosConfigClientMain3377.java

同9001

5.controller
package com.indi.springcloud.alibaba.controller;

@RefreshScope   // Spring Cloud的原生注解实现自动更新配置
@RestController
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}
6.在Nacos中添加配置信息

Nacos中Data Id的组成格式与Spring Cloud中的配置是有关联的

在这里插入图片描述

组合起来就是nacos-config-client-dev.yaml,我们在Nacos中添加配置时直接使用即可

在这里插入图片描述

# 配置内容
config: 
    info: "from nacos config center, nacos-config-client-dev.yaml, version=1"

在这里插入图片描述

7.测试

第一次读取配置,成功!

在这里插入图片描述

8.自带动态刷新

运行状态下修改Nacos中的yaml配置文件,将version改为2,保存之后,再次测试,发现已经生效了!

在这里插入图片描述

Nacos作为配置中心 - 分类配置

从上面的配置中心 + 动态刷新 , 就相当于 有了 Spring Cloud Config + Spring Cloud Bus的功能

作为后起之秀的Nacos,还具备分类配置的功能

问题

用于解决多环境多项目管理

在实际开发中,通常一个系统会准备

  • dev:开发环境
  • test:测试环境
  • prod:生产环境

如何保证指定环境启动时,服务能正确读取到Nacos上相应环境的配置文件呢?

同时,一个大型分布式微服务系统会有很多微服务子项目,每个微服务子项目又都会有相应的开发环境,测试环境,预发环境,正式环境,那怎么对这些微服务配置进行管理呢?

Nacos图形化界面

配置管理:

在这里插入图片描述

命名空间:

在这里插入图片描述

Namespace + Group + DataID 三者关系

这种分类的设计思想,就类似于java里面的包名和类名,最外层的namespace是可以用于区分部署环境的,Group 和 DataID逻辑上区分两个目标对象

在这里插入图片描述

默认情况:

Namespace=publicGroup=DEFAULT_GROUPCluster=DEFAULT

Nacos默认的Namespace(命名空间)是public,Namespace主要用来实现隔离

  • 比如说我们现在有三个环境:开发,测试,生产环境,我们就可以建立三个Namespace,不同的Namespace之间是隔离的。

Group默认是DEFAULT_GROUP

  • Group可以把不同微服务划分到同一个分组里面去

Service就是微服务,一个Service可以包含多个Cluster(集群)

  • Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
  • 比如说为了容灾,将Service微服务分别部署在了杭州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称,还可以尽量让同一个机房的微服务相互调用,以提升性能,最后Instance,就是微服务的实例。
三种方案加载配置
DataID方案
  • 指定spring.profile.active 和 配置文件的DataID来使不同环境下读取不同的配置

  • 默认空间 + 默认分组 + 新建dev 和 test两个DataID

  • 在这里插入图片描述

  • 在这里插入图片描述
    在这里插入图片描述

Group方案

创建两个配置,添加分组信息,我们将这两个配置设置成Data ID相同,Group不同

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

再配置好yml

在这里插入图片描述

就可以获取指定分组下的配置文件了

在这里插入图片描述

Namespace方案

首先我们需要新建一个命名空间

在这里插入图片描述

新建完成后,能够看到命名空间ID

在这里插入图片描述

创建完成后,我们会在配置列表、服务列表中都能看到刚创建的几个命名空间

在这里插入图片描述

在这里插入图片描述

然后我们选择一个命名空间,在其下面创建几个配置

在这里插入图片描述

最后创建了三个不同组,但是名称一样的配置

在这里插入图片描述

通过修改yml的属性,即可获取不同配置

在这里插入图片描述

在这里插入图片描述

最后通过 namespace + group + DataID 形成了三级分类

Nacos集群和持久化配置

官网说明

用于部署生产中的集群模式

在这里插入图片描述

Nacos默认使用嵌入式数据库derby实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储,因此我们需要完成从derby到mysql切换。

Nacos支持三种部署模式

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

单机模式支持mysql

在0.7版本之前,在单机模式下nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作流程如下:官网地址

  1. 安装mysql数据库,版本要求:5.6.5 +

  2. 初始化数据库,数据库初始化文件在nacos\conf\nacos-mysql.sql,执行之前加上建库的语句

    create database nacos_config;
    use nacos_config;
    # 再加上sql文件里的内容
    

    在这里插入图片描述

  3. 修改conf\application.properties文件,末尾增加mysql数据源配置,添加mysql数据源的url,用户名和密码

    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
    db.user=root
    db.password=123456
    
  4. 再次以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql中,可以看到是一个全新的空记录页面,这就说明成功了!

    在这里插入图片描述

Linux版Nacos + Mysql生产环境配置

配置

预计需要:1个Nginx + 3个nacos注册中心 + 1个mysql

服务器收到请求之后,先由nginx进行处理

如果是虚拟机的话,建议先把内存设置成4G,否则到时候启动不了3个nacos服务

1.下载Linux版本Nacos

https://github.com/alibaba/nacos/releases/download/1.1.4/

选择nacos-server-1.1.4.tar.gz

2.安装Nacos

可以使用xftp将文件从windows拷到linux下

# 1) 解压
tar -xvf nacos-server-1.1.4.tar.gz

# 2) 拷贝到其它目录
cp -r nacos /usr/local/
3.Nacos切换数据库
  1. 首先找到SQL脚本
    在这里插入图片描述

  2. 进入mysql环境,分开运行以下命令

    # 1.创建数据库
    create database nacos_config;
    
    # 2.切换到nacos_config数据库
    use nacos_config;
    
    # 3.执行SQL文件
    source /usr/local/nacos/conf/nacos-mysql.sql
    

    能查出表来就说明数据库初始化成功了
    在这里插入图片描述

  3. 修改application.properties

    # 先进入conf目录下
    cd /usr/local/nacos/conf
    
    # 修改之前可以先备份一下
    cp application.properties application.properties.init
    
    # 开始修改
    vim application.properties
    

    直接跳转到最后一行添加,配置内容跟windows的一样,直接用我上面配置的即可(数据库信息根据个人配置进行修改)
    在这里插入图片描述

4.集群配置cluster.conf

梳理出3台nacos机器的不同服务端口号,这里使用:3333、4444、5555

# 先进入conf目录下,我就不写了
	
# 还是最好先备份一下
cp cluster.conf.example cluster.conf
		
# 我们修改cluster.conf
vim cluster.conf

内容,这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP

192.168.2.190:3333
192.168.2.190:4444
192.168.2.190:5555

在这里插入图片描述

5.添加多个端口的启动配置
# 先进入bin目录下
cd /usr/local/nacos/bin
	
# 备份
cp startup.sh startup.sh.bk
		
# 修改
vim startup.sh

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改完成后,就能够使用下列命令启动集群了,建议等待Nginx配置完成之后一起启动

# 启动
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
# 关闭
./shutdown.sh -p 3333
./shutdown.sh -p 4444
./shutdown.sh -p 5555
6.Nginx配置
# 先进入/nginx/conf的配置目录
cd /usr/local/nginx/conf

在这里插入图片描述

# 配置完成之后,启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf

# 查看nginx命令是否启动
ps -ef|grep nginx

在这里插入图片描述

7.测试
  1. 启动nacos
    在这里插入图片描述
  2. 访问:https://写你自己虚拟机的ip:1111/nacos/
    在这里插入图片描述
  3. 新建配置测试
    在这里插入图片描述
  4. 新建成功!
    在这里插入图片描述
  5. 数据库中也可查到,这就意味着全部配置成功了!
    在这里插入图片描述
  6. 微服务cloudalibaba-provider-payment9002注册进nacos集群
    在这里插入图片描述
    查看服务列表,发现已经注册进去了,成功!
    在这里插入图片描述
总结

Nginx + 3个Nacos + mysql的集群化配置

在这里插入图片描述

Nacos是一种用于动态配置管理和服务发现的开源平台。在使用Nacos加载多个配置文件时,我们可以通过以下步骤来实现: 1. 创建多个配置文件:首先,我们可以创建多个配置文件,每个文件可以包含不同的配置项。这些配置文件可以是不同的.properties文件或者.yaml文件,根据个人偏好来选择。 2. 注册配置文件到Nacos:接下来,我们需要将这些配置文件注册Nacos中。可以使用Nacos提供的API或者控制台进行配置文件的注册。 3. 在业务应用中加载配置文件:在业务应用中,我们需要引入Nacos的client SDK,并使用SDK提供的API来加载配置文件。可以使用Nacos配置管理功能,以编程方式从Nacos服务器获取配置文件的内容。 4. 指定配置文件和配置项:根据需要,我们可以指定要加载的配置文件和配置项。这可以通过在应用程序代码中指定配置文件和配置项的名称或者通过使用注解来实现。 这样,我们就可以在应用程序中加载多个配置文件了。通过这种方式,我们可以轻松地管理和更新多个配置文件,并根据需要加载所需的配置项。同时,Nacos可以提供实时的配置更新功能,如果在Nacos中更新了配置文件,应用程序可以立即获取到最新的配置内容。 综上所述,通过使用Nacos和其提供的API和功能,我们可以方便地加载多个配置文件,实现灵活的配置管理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值