NACOS 认识和学习

Posted 认真的菜鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NACOS 认识和学习相关的知识,希望对你有一定的参考价值。

NACOS 认识和学习

官网路径:https://nacos.io/zh-cn/

简介

1. nacos是什么?

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

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

2. nacos特性

Nacos 的关键特性包括:

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

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API查找和发现服务。

    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、mysql、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理

    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

    等等...

3.nacos架构

架构:https://nacos.io/zh-cn/docs/architecture.html

安装

1.版本选择

github地址:https://github.com/alibaba/nacos/releases

当前推荐的稳定版本为1.4.2或2.0.1。

2.环境依赖

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下载 & 配置
  3. Maven 3.2.x+;下载 & 配置

3.下载

你可以通过源码和发行包两种方式获取nacos.

4.启动和停止

  • 启动

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

懒得用命令的话

可以在编辑startup.cmd在启动将

set MODE="cluster" ##这是集群模式
set MODE="standalone" ##这是单机模式
  • 关闭

Linux/Unix/Mac

sh shutdown.sh

Windows

shutdown.cmd

或者双击shutdown.cmd运行文件。

  • 配置数据库(默认使用的是自己的内置数据库),更改成本地的数据库很简单

    • 找到conf/nacos-mysql.sql 提供了数据库文件,创建数据库

    • 配置conf/application.properties 配置文件,修改如下地方(因为我这里是单机模式,所以就是一个,如果是多个的话,就是数组形式去填加)

      #*************** Config Module Related Configurations ***************#
      ### If use MySQL as datasource:
      # 指定数据源为 MySQL
      spring.datasource.platform=mysql
      
      ### Count of DB:
      # 数据库实例数量
      db.num=1
      
      ### Connect URL of DB:
      # 数据库连接
      db.url.0=jdbc:mysql://127.0.0.1:3306/db_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
      db.user.0=
      db.password.0=
      

使用

  • 新建父级目录maven项目(依赖约定如下)

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <springboot-cloud.version>Hoxton.SR8</springboot-cloud.version>
        <springboot.version>2.3.2.RELEASE</springboot.version>
        <springcloudalibaba.version>2.2.5.RELEASE</springcloudalibaba.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${springboot-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${springcloudalibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

1.配置中心demo

  • 新建子项目(依赖如下) nacos-config-demo

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!--配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    

    bootstrap配置如下:(单配置文件如下)

    spring.application.name=nacos-config-demo # 项目名字
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # nacos服务地址
    spring.cloud.nacos.config.namespace=1f9392361eb5a36f37b # 命名空间id而不是名字
    spring.cloud.nacos.config.group=DEFAULT_GROUP # 分组名称 
    spring.cloud.nacos.config.name=nacos_config.properties  #data id
    spring.cloud.nacos.config.file-extension=yml  # 看源码可知 默认是private String fileExtension = "properties";
    

    如果你也使用的.yml格式,一定要在bootstrap.yml中指明 file-extension: yml

    如果你也使用的.yml格式,一定要在bootstrap.yml中指明 file-extension: yml

    如果你也使用的.yml格式,一定要在bootstrap.yml中指明 file-extension: yml

    bootstrap配置如下:(多配置文件如下,properties形式)

    spring.application.name=nacos-config-demo
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.cloud.nacos.config.namespace=6f6ed112-546d-41ae-9629-72c63f107c90
            
    spring.cloud.nacos.config.extension-configs[0].data-id=mysql_config.properties
    spring.cloud.nacos.config.extension-configs[0].group=MYSQL_GROUP
    spring.cloud.nacos.config.extension-configs[0].refresh=true
    spring.cloud.nacos.config.extension-configs[1].data-id=redis_config.properties
    spring.cloud.nacos.config.extension-configs[1].group=REDIS_GROUP
    spring.cloud.nacos.config.extension-configs[1].refresh=true
    
    spring.cloud.nacos.config.extension-configs[2].data-id=oa_config.properties
    spring.cloud.nacos.config.extension-configs[2].group=OA_GROUP
    spring.cloud.nacos.config.extension-configs[2].refresh=true
    

    注意1:

    通过spring.cloud.nacos.config.ext-config[n].data-id的配置来配置多个DataId 的配置。
    通过spring.cloud.nacos.config.ext-config[n].group 的配置来指定dataId所在的组,不明确指定的话使用默认的DEFAULT_GROUP
    通过spring.cloud.nacos.config.ext-config[n].refresh 的配置来控制该dataId属性变更时,是否动态刷新加载,默认如果不在DEFAULT_GROUP,自动刷新是关闭的,可以通过置为true来手动开启.

    注意2:

    spring.cloud.nacos.config.ext-config[n].data-id= 必须带上扩展名,即文件格式,支持properties,也支持yaml/yml.

    此时spring.cloud.nacos.config.file-extension 的配置对自定义扩展的配置的data-id是无效的。
    bootstrap配置如下:(多配置文件如下,yml形式)

    spring:
      application:
        name: nacos-config-demo
      cloud:
        nacos:
          config:
            namespace: 973c8477-47e9-4d1e-b1fa-dc709234be4d
            extension-configs:
    # 多配置文件 yml
              -
                data-id: mysql_config.yml
                group: MYSQL_GROUP
                refresh: true 
              -  
                data-id: redis_config.yml
                group: REDIS_GROUP
                refresh: true
              -  
                data-id: oa_config.yml
                group: OA_GROUP
                refresh: true
    
    # 多配置文件 properties
    #          -
    #            data-id: mysql_config.properties
    #            group: MYSQL_GROUP
    #            refresh: true 
    #          -  
    #            data-id: redis_config.properties
    #            group: REDIS_GROUP
    #            refresh: true
    #          -  
    #            data-id: oa_config.properties
    #            group: OA_GROUP
    #            refresh: true
            
            
            
            
    # 单配置
    #      config:
    #        server-addr: 127.0.0.1:8848
    #        group: DEFAULT_GROUP
    #        name: nacos-config.yml
    #        file-extension: yaml
             
    

    这几个名词的关系,官方有给出图(数据模型)

    Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

    数据模型

    使用@Value 和@RefreshScope配合测试

    @RestController
    @RefreshScope  
    public class NacosCopnfigController {
        
        @Value("${zhonglao.name}")
        private String name;
        @Value("${zhonglao.age}")
        private String age;
        
        @RequestMapping("/info")
        public String getConfigInfo(){
            return name + ":" + age;
        }
    }
    

    @RefreshScope注解实时刷新配置信息
    我们在ConfigController控制器上添加了注解@RefreshScope主要目的是来实时同步通过Nacos Console修改的配置内容。

    @RefreshScope注解是SpringCloud内部提供,用于配置热加载

2.服务注册发现和调用demo

​ 简单实现 订单调用库存

  • 创建stock(依赖如下)

     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <!--服务注册与发现-->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
    </dependencies>
    
    
  • 配置如下

    server:
      port: 8084
    spring:
      application:
        name: nacos-stock
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            namespace: 1f939233-3f3f-4e97-82a6-61eb5a36f37b
            cluster-name: stock
    
    
  • 操作如下

    @RestController
    @RequestMapping("/stock")
    public class StockController {
        
        @RequestMapping("/test")
        public String test(String info){
            return "库存模块收到的信息:" + info;
        }
    }
    

    启动类加上@EnableDiscoveryClient 使其他服务能发现

  • 创建order(依赖如下)

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!--服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    
  • 配置如下

    server:
      port: 8083
    spring:
      application:
        name: nacos-order
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
  • 创建service 使用openfeign

    @FeignClient("nacos-stock")
    public interface StockFeignService {
        
        @RequestMapping("/stock/test")
        public String test(@RequestParam("info") String info);
    }
    
  • 创建controller来调用

    @RestController
    @RequestMapping("/order")
    public class TestConrtoller {
        
        @Autowired
        StockFeignService stockFeignService;
        
        @RequestMapping("/info")
        public String test(){
           return stockFeignService.test("牛啊牛啊"); 
        }
    }
    
    

    启动类需加上

    @EnableDiscoveryClient
    @EnableFeignClients(basePackages = "com.zhonglao.feign")
    

3.nacos高可用集群配置

使用windows禁止中文目录!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

为了防止一个nacos崩掉,我们可以搞3个或者更多的nacos服务来搭建集群,实现高可用:

  • 1.启动的时候,使用集群模式

    startup.cmd -m cluster
    
  • 2.将nacos服务复制三份或更多,分别修改端口(不要被占用),端口在conf/application中修改

  • 3.设置ip

    nacos.inetutils.ip-address=127.0.0.1
    
  • 4.将conf/cluster.conf.example修改为cluster.conf,并修改启动的iplist

    #it is ip
    #example
    127.0.0.1:8848
    127.0.0.1:8849
    127.0.0.1:8850
    

以上是关于NACOS 认识和学习的主要内容,如果未能解决你的问题,请参考以下文章

Nacos一篇学会:认识-安装-注册-配置,服务分级存储模型等

Nacos 简单认识

Nacos笔记-对Nacos初步认识

SpringCloud Alibaba核心组件Nacos认识和安装Nacos&快速入门第1章

SpringCloud之微服务实用篇1

SpringCloud之微服务实用篇1