Nacos简介和原理

一,Nacos简介

1.1 Nacos是什么

Nacos提供了统一配置管理、服务发现与注册。其中服务注册和发现的功能,相当于dubbo里面使用到 的zookeeper、或者spring cloud里面应用到的consoul以及eureka

1.2 Nacos特性

服务发现和服务健康检测

Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务 的注册,服务消费者可以使用API或者Http来查找和发现服务

同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻止服务消费者向不健康的服务发送请求。

配置管理

传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置 中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。

动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景

1.3 Nacos数据模型 

命名空间(Namespace) 

可用于进行不同环境的配置隔离。

例如:

  1. 可以隔离开发环境——测试环境和生产环境,因为它们的配置可能各不相同;
  2. 可以隔离不同的用户——不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。 不同的命名空间下可以存在相同名称的配置分组(Group) 或配置集。

配置分组(Group) 

配置分组是对配置集进行分组。 通过一个有意义的字符串(如 Buy 或 Trade )来表示。 不同的配置分组下可以有相同的当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 配置分组的常见场景——可用于区分不同的项目或应用

配置集(Data ID)。 

配置集(Data ID) 在系统中,一个配置文件通常就是一个配置集。 一个配置集可以包含了系统的各种配置信息。

1.4 Nacos官网

Nacos支持三种部署模式

二,Nacos部署

Nacos支持三种部署模式

单机模式 - 用于测试和单机试用。

集群模式 - 用于生产环境,确保高可用。

多集群模式 - 用于多数据中心场景。

2.1 单机模式支持mysql

1.安装数据库,版本要求:5.6.5+ 
2.初始化mysql数据库,数据库初始化文件:mysql-schema.sql 
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。 spring.datasource.platform=mysql 
db.num=1 
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow ​ 
4.启动nacos sh startup.sh -m standalone 
5.访问nacos localhost:8848/nacos

 

 

2.2集群模式

2.2.1配置集群配置文件

在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848

2.2.2确定数据源

使用内置数据源

无需进行任何配置

Nacos默认自带的是嵌入式数据库derby

使用外置数据源

生产使用建议至少主备模式,或者采用高可用数据库。

初始化 MySQL 数据库

sql语句源文件

application.properties 配置

application.properties配置文件

2.2.3启动服务器

单机模式

sh startup.sh -m standalone

集群模式

使用内置数据源

sh startup.sh -p embedded

使用外置数据源

sh startup.sh

三,服务注册&发现和配置管理

OPen API指南: Open API 指南

服务注册

curl -X PUT 'http://101.43.xx.xx:8848/nacos/v1/ns/instance?serviceName=ITPortal&ip=20.18.7.10&port=8080'
​
curl -X PUT 'http://101.43.xx.xx:8848/nacos/v1/ns/instance?serviceName=ITPortal&ip=20.18.7.11&port=8080'

服务发现

curl -X GET 'http://101.43.xx.xx:8848/nacos/v1/ns/instance/list?serviceName=ITPortal'

发布配置

curl -X POST "http://101.43.xx.xx:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"

获取配置

curl -X GET "http://101.43.xx.xx:884/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

四,SpringCloud集成Nacos

注册中心

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

使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@EnableFeignClients
@EnableRedisHttpSession
public class GulimallSearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallSearchApplication.class, args);
    }
}

(1)注册服务nacos-payment-provider,存在9001,9002两个实例

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 101.43.xx.xx:8848 #配置Nacos地址
server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 101.43.xx.xx:8848 #配置Nacos地址

 这样Nacos上就注册了一个服务nacos-payment-provider,有2个实例分别是9001和9002

(2)注册一个客户端

 

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 101.43.xx.xx:8848
        metadata:
          preserved.heart.beat.interval: 1000
          preserved.heart.beat.timeout: 1000
          preserved.ip.delete.timeout: 1000
ribbon:
  ServerListRefreshInterval: 1000
#消费者将要去访问的微服务名称(成功注册进nacos的微服务提供者),在这配置了访问的服务,业务类就不用在定义常量了
service-url:
  nacos-user-service: http://nacos-payment-provider

 

 

测试接口

@RestController
public class OrderNacosController {
    /*
    因为在yml中配置了service-url.nacos-user-service,
    这里不需要再定义要访问微服务名常量,而是通过boot直接读出来
     */
    @Value("${service-url.nacos-user-service}")
    private String serverURL;
    @Resource
    private RestTemplate restTemplate;
    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id){
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}

 

访问接口

http://localhost:83/consumer/payment/nacos/1 可以看出轮询调用服务9001和9002(默认使用的ribbon做为负载工具)

下线9001再次访问上述接口就会只有9002提供服务

 

配置中心

 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      //注册
      discovery:
        server-addr: 101.43.xx.xx:8848 #Nacos服务注册中心地址
      //配置
      config:
        server-addr: 101.43.xx.xx:8848 #Nacos作为配置中心地址
        file-extension: yaml  #指定yaml格式的配置 

(1)测试接口

@RestController
@RefreshScope   //SpringCloud原生注解 支持Nacos的动态刷新功能
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

(2)Nacos中增加配置文件

 命名格式

 

 (3)访问测试

http://localhost:3377/config/info输出结果:NACOS CONFIG DEV

再次修改配置内容

 

http://localhost:3377/config/info输出结果:NACOS CONFIG DEV222

五,Nacos原理

5,1注册中心原理

心跳机制

(1)心跳的发送间隔

(2)心跳的超时时间 。设置一个心跳超时的阈值 。记录针对于某一个服务实例的最后一次更新的时间 。当前时间-当前实例最后一次更新的时间>心跳超时的阈值

5.2配置中心原理

客户端把本地缓存的配置MD5处理后和服务端配置的MD5编码比较,如果不一样代码配置改动了,否则配置未改动