zoukankan      html  css  js  c++  java
  • 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
      
  • 相关阅读:
    J2SE API & J2EE API & SSH API
    JSP转发和重定向的区别
    Tomcat详解
    面试题:通过问题排查,考察测试链路熟练程度
    c语言中求数组的长度
    CGContextBeginPath
    CGContextAddAr绘制一个圆弧
    将当前的手机屏幕上的视图控件的view拍照 并保存到手的album中
    CGContextFillPath(ctx)
    CGContextSetRGBFillColor
  • 原文地址:https://www.cnblogs.com/HHbJ/p/14836874.html
Copyright © 2011-2022 走看看