• Nacos极简教程


    简介

    Nacos是服务发现与注册,服务配置中心。

    Nacos 具有如下特性:

    服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;

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

    动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务;

    服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。

    Nacos 为 C/S 架构,服务端 NacosServer 是一个 jar 包,客户端直接集成在业务微服务中,一个业务微服务就是一个 NacosClient。

    NacosServer

    安装目录

    
    ├── bin
    │   ├── logs
    │   ├── shutdown.sh
    │   ├── startup.sh
    │   └── work
    ├── conf
    │   ├── 1.4.0-ipv6_support-update.sql
    │   ├── application.properties
    │   ├── application.properties.example
    │   ├── cluster.conf
    │   ├── cluster.conf.example
    │   ├── nacos-logback.xml
    │   ├── nacos-mysql.sql
    │   └── schema.sql
    ├── data
    │   ├── config-data
    │   ├── loader
    │   ├── naming
    │   ├── protocol
    │   ├── tps
    │   └── upgrade.state
    ├── NOTICE
    ├── status
    │   └── heartBeat.txt
    ├── target
    │   └── nacos-server.jar
    
    
    • bin/startup.sh:启动nacos
    • bin/shutdown.sh:停止nacos
    • bin/logs:运行日志
    • conf/application.properties:节点配置文件
    • conf/clutser.conf:集群配置文件
    • data:运行时候数据,持久化数据。
    • target/nacos-server.jar :nacosServer主程序

    配置参考

    application.properties配置参考:
    一般情况下,主要配置 mysql 数据源;ip and port;打开所有监控端点。

    
    #*************** Spring Boot Related Configurations ***************#
    ### Default web context path:
    server.servlet.contextPath=/nacos
    ### Default web server port:
    server.port=8848
    
    
    #*************** Network Related Configurations ***************#
    ### If prefer hostname over ip for Nacos server addresses in cluster.conf:
    # nacos.inetutils.prefer-hostname-over-ip=false
    
    ### Specify local server's IP:
    nacos.inetutils.ip-address=192.168.1.188
    
    
    
    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://192.168.1.235:3306/ngh-nacos-cluster?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=Yj6vT8CZlI%15IxV
    
    ### Connection pool configuration: hikariCP
    db.pool.config.connectionTimeout=30000
    db.pool.config.validationTimeout=10000
    db.pool.config.maximumPoolSize=20
    db.pool.config.minimumIdle=2
    
    
    
    #*************** Metrics Related Configurations ***************#
    ### Metrics for prometheus
    management.endpoints.web.exposure.include=*
    
    ### Metrics for elastic search
    management.metrics.export.elastic.enabled=false
    #management.metrics.export.elastic.host=http://localhost:9200
    
    ### Metrics for influx
    management.metrics.export.influx.enabled=false
    
    

    cluster.conf 配置参考:

    #2022-02-09T15:48:27.383025
    192.168.1.124:8848
    192.168.1.130:8848
    192.168.1.137:8848
    

    常用命令

    命令 说明 示例
    sh startup.sh 启动nacos,默认为集群模式启动
    sh startup.sh -m standalone 单实例启动nacos

    常用接口

    接口 作用 备注
    http://192.168.1.199:8848/nacos/v1/cs/configs?dataId=app-dev.yaml&group=DEFAULT_GROUP 获取配置详情 Get请求
    http://192.168.1.124:8848/nacos/v1/ns/instance?serviceName=nacos-client-user-service&ip=192.168.3.169&port=8818 服务注册 put请求,若注册成功接口返回ok
    http://192.168.1.124:8848/nacos/v1/ns/instance/list?serviceName=nacos-client-user-service 服务发现 Get请求,根据serviceName获取服务实例详情

    端口

    端口 与主端口的偏移量 描述
    8848 主端口,webui访问端口,客户端注册端口
    9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
    9849 1001 服务端gRPC请求服务端端口,用于服务间同步等
    7848 7848 是 Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等

    集群部署

    Nacos 原生支持高可用,部署集群非常简单,仅仅需要修改每一个节点的 cluster.conf 配置文件即可,将所有节点(包括自己)ip:port 按行写入此文件即可。

    /conf/cluster.conf

    192.168.1.124:8848
    192.168.1.130:8848
    192.168.1.137:8848
    

    客户端在连接 NacosServer 的时候配置集群中所有节点。

    spring:
      application:
        name: nacos-client-user-service
      profiles:
        active: dev
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.124:8848,192.168.1.130:8848,192.168.1.137:8848
          config:
            server-addr: 192.168.1.124:8848,192.168.1.130:8848,192.168.1.137:8848
            file-extension: yaml
    

    官方推荐的集群部署方式是在 NacosServer 集群上面搭建一个代理层,并对外提供一个域名给客户端访问。这种部署方式要求代理层也是高可用的,可选的方案有 域名+ Vip+Nginx,相关端口需要层层暴露。

    官方推荐集群部署架构

    WebUI

    • 默认访问地址: http://ip:8848/nacos
    • 配置管理->配置列表:nacos作为统一配置中心管理的微服务配置文件,存储在mysql中
    • 服务管理->服务列表:已注册的微服务列表
    • 集群管理->节点列表:nacosServer 集群节点展示。

    NacosClient

    以 SpringBoot 2.5.3 为例

    pom

    主要引入spring-boot-starter-web,spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-nacos-config,spring-cloud-starter-bootstrap

        <properties>
            <java.version>11</java.version>
            <spring.cloud.dependencies>2020.0.3</spring.cloud.dependencies>
            <spring.cloud.alibaba.dependencies>2021.1</spring.cloud.alibaba.dependencies>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring.cloud.dependencies}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${spring.cloud.alibaba.dependencies}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <!-- nacos-discovery -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <!-- nacos-config -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
        </dependencies>
    

    bootstrap.yml

    server:
      port: 8818
    spring:
      application:
        name: nacos-client-user-service
      profiles:
        active: dev
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.124:8848,192.168.1.130:8848,192.168.1.137:8848
          config:
            server-addr: 192.168.1.124:8848,192.168.1.130:8848,192.168.1.137:8848
            file-extension: yaml
    logging:
      level:
        com.alibaba.nacos.common.http.client: debug
    
    

    主启动类

    需要增加 @EnableDiscoveryClient 注解

    客户端集成

    启动测试

    启动客户端之前需要确保 NacosServer 集群正常运行,各个节点的 WebUI 可以正常打开,集群管理--->节点列表中各个节点状态为 UP。

    启动 SpringBoot 客户端程序,若没有报错,在每一个节点 服务管理--->服务列表 中可以看到服务已经注册成功。

    若启动失败,报异常了,或者服务未在所有节点完成注册,可通过如下思路排查:

    • 详细阅读控制台输出日志
    • 使用postman访问服务端提供的获取配置详情接口,测试是否可以通过直连某节点获取到配置信息
    • 断点调试 NacosRestTemplate ,客户端获取服务配置文件是通过访问服务端http接口完成的,而客户端发起请求是使用的NacosRestTemplate
    • 确保端口可以连通,7848,8848,9849,9848
    • 详细阅读 Nacos.log 和 access_log.2022-02-09.log
    • 集群心跳日志在 nacos-cluster.log 中

    问题记录

    报错信息

    NacosServer 启动报错

    Error: Could not find or load main class Caused by: 
    
    java.lang.ClassNotFoundException:
    

    解决办法

    /bin/startup.sh 修改为如下内容

    
    #!/bin/bash
    # Copyright 1999-2018 Alibaba Group Holding Ltd.
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    cygwin=false
    darwin=false
    os400=false
    case "`uname`" in
    CYGWIN*) cygwin=true;;
    Darwin*) darwin=true;;
    OS400*) os400=true;;
    esac
    error_exit ()
    {
        echo "ERROR: $1 !!"
        exit 1
    }
    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
    [ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
    if [ -z "$JAVA_HOME" ]; then
      if $darwin; then
        if [ -x '/usr/libexec/java_home' ] ; then
          export JAVA_HOME=`/usr/libexec/java_home`
        elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
          export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
        fi
      else
        JAVA_PATH=`dirname $(readlink -f $(which javac))`
        if [ "x$JAVA_PATH" != "x" ]; then
          export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
        fi
      fi
      if [ -z "$JAVA_HOME" ]; then
            error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
      fi
    fi
    export SERVER="nacos-server"
    export MODE="cluster"
    export FUNCTION_MODE="all"
    export MEMBER_LIST=""
    export EMBEDDED_STORAGE=""
    while getopts ":m:f:s:c:p:" opt
    do
        case $opt in
            m)
                MODE=$OPTARG;;
            f)
                FUNCTION_MODE=$OPTARG;;
            s)
                SERVER=$OPTARG;;
            c)
                MEMBER_LIST=$OPTARG;;
            p)
                EMBEDDED_STORAGE=$OPTARG;;
            ?)
            echo "Unknown parameter"
            exit 1;;
        esac
    done
    export JAVA_HOME
    export JAVA="$JAVA_HOME/bin/java"
    export BASE_DIR=`cd $(dirname $0)/..; pwd`
    export CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/conf/
    #===========================================================================================
    # JVM Configuration
    #===========================================================================================
    if [[ "${MODE}" == "standalone" ]]; then
        JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
        JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
    else
        if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
            JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
        fi
        JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
        JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
        JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
    fi
    if [[ "${FUNCTION_MODE}" == "config" ]]; then
        JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
    elif [[ "${FUNCTION_MODE}" == "naming" ]]; then
        JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
    fi
    JAVA_OPT="${JAVA_OPT} -Dnacos.member.list=${MEMBER_LIST}"
    JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
    if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
      JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
    else
      JAVA_OPT_EXT_FIX="-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext"
      JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
    fi
    JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins/health,${BASE_DIR}/plugins/cmdb"
    JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
    JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar"
    JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
    JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}"
    JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml"
    JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"
    if [ ! -d "${BASE_DIR}/logs" ]; then
      mkdir ${BASE_DIR}/logs
    fi
    echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}"
    if [[ "${MODE}" == "standalone" ]]; then
        echo "nacos is starting with standalone"
    else
        echo "nacos is starting with cluster"
    fi
    # check the start.out log output file
    if [ ! -f "${BASE_DIR}/logs/start.out" ]; then
      touch "${BASE_DIR}/logs/start.out"
    fi
    # start
    echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
    nohup $JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
    echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
    
    
    

    报错信息

    客户端启动时候报错

     failed to req API:/nacos/v1/ns/instance after all servers([192.168.1.169:8848]) tried: ErrCode:400, ErrMsg:<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Tue Feb 08 21:19:48 CST 2022</div><div>There was an unexpected error (type=Bad Request, status=400).</div><div>receive invalid redirect request from peer 127.0.0.1</div></body></html>
    	at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:556) ~[nacos-client-1.4.1.jar:na]
    	at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:498) ~[nacos-client-1.4.1.jar:na]
    	at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:493) ~[nacos-client-1.4.1.jar:na]
    	at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:246) ~[nacos-client-1.4.1.jar:na]
    

    解决办法

    删除data文件夹重启

    Nacos 非常占资源,Windows11 下,启动就能把CPU占到56%(酷睿I5-11代),启动成功之后占了1.7G的内存。此解决方法是百度出来的,首先停止 SpringBoot 程序、Nacos集群;然后删除三个实例下面的 data 文件夹并重新启动集群;最后重新启动 SpringBoot。此时可以正常注册到 Nacos 集群中, 每一个实例中的服务列表中都有该 SpringBoot 服务。

    修改cluster.conf文件

    本来以为上述方法已经可以解决此问题,毕竟【百度】出来的!可是过了一会之后又报400问题,中间(应该)没有特别特殊的操作,无非(可能)就是重启 SpringBoot 服务,修改 Nacos 的 application.properties 文件和重启集群等等。

    重新排查了一遍,发现NacosWebUI中的 集群管理—>节点列表 中多了一个实例,变成了四个,重新查看了集群 cluster.conf, 发现每一个实例此配置文件中都多了一行【192.168.1.169:8858】。这行(好像)不是我加的,但是不管怎么说,这行都是不必须的,所以我决定删除这行。首先停止 SpringBoot 程序、Nacos集群;然后删除三个实例下面的 data 文件夹,删除 cluster.conf 文件中无故(手残添加)增加的那行,并重新启动集群;最后重新启动 SpringBoot。此时可以正常注册到 Nacos 集群中, 每一个实例中的服务列表中都有该 SpringBoot 服务

  • 相关阅读:
    升级Xcode之后VVDocumenter-Xcode不能用的解决办法
    iOS国际化
    display:table 表格布局
    display: run-in
    连续字符换行 溢出点点点 多行省略
    Number 类型
    Boolean 相关
    Browsing contexts 浏览器上下文
    return flase 作用
    JS外链
  • 原文地址:https://www.cnblogs.com/Naylor/p/15878182.html
Copyright © 2020-2023  润新知