nacos 安装配置

1,491 阅读5分钟

简介

nacos.io/zh-cn/docs/…

安装&配置nacos

安装
  1. 下载 wget https://github.com/alibaba/nacos/releases/download/2.0.0-BETA/nacos-server-2.0.0-BETA.zip

  2. 解压

unzip nacos-server-2.0.0-BETA.zip
cd nacos/bin
  1. 启动
  • 单机模式
# Linux/Unix/Mac
sh startup.sh -m standalone 
# ubuntu
bash startup.sh -m standalone
# windows
cmd startup.cmd -m standalone
  • 集群模式
sh startup.sh
bash startup.sh
cmd startup.cmd
  1. 页面 默认端口是8848,访问 http://127.0.0.1:8848/nacos

默认用户名和密码都是 nacos,一般没什么问题就能正常访问该页面

  1. 数据持久化 默认nacos配置数据存储在自带的嵌入式数据库里,为了方便维护我们的配置数据,我把它存到了mysql,官方文档 nacos.io/zh-cn/docs/… 根据配置文件里的sql语句 nacos-mysql.sql 创建数据库和表后,按照如下语句连接到mysql
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

这里mysql的高可用要注意下,否则会导致nacos及后续服务配置获取的异常

  1. 配置开机启动
  • 新建文件 vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target

[Service]
Environment="JAVA_HOME=xxx/jdk1.8.0_151"
Type=forking
# 注意这里是单机模式还是集群模式启动
ExecStart=xxx/nacos/nacos/bin/startup.sh -m standalone
ExecReload=xxx/nacos/nacos/bin/shutdown.sh
ExecStop=xxx/nacos/nacos/bin/shutdown.sh
PrivateTmp=true
 
[Install]  
WantedBy=multi-user.target
  • 重载服务 systemctl daemon-reload

  • 设置开机启动 systemctl enable nacos.service

  • 查看该服务开机启动的状态 systemctl is-enabled nacos.service

  • 启动服务

systemctl start nacos.service
  • 查看该服务运行状态 systemctl status nacos.service

注意 Environment="JAVA_HOME=xxx/jdk1.8.0_151" 指定java环境,我这边出现了systemctl服务启动时找不到java,报如下错误,但是我命名配置了,那就指定下环境好了;另外在startup.sh里也配置下java_home为自己的路径

异常

Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: readlink: missing operand
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: Try 'readlink --help' for more information.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: dirname: missing operand
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: Try 'dirname --help' for more information.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: nacos.service: control process exited, code=exited status=1
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: Failed to start nacos.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: Unit nacos.service entered failed state.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: nacos.service failed.

配置startup.sh

...
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/xxx/jdk1.8.0_211

#[ ! -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
...
  • 停止 systemctl stop nacos.service
配置
  1. 命名空间 默认有一个public保留空间,我这里建一个我用户名命名的空间,比如张三,空间的id如果自己不指定,会自动生成一个唯一id,如果想要这个id有意义,最好是自己指定,

  2. 配置中心 为了格里不同用户、不同环境的配置,我的空间按照用户 > 环境 > 项目的顺序来命名

这样来隔离不同用户、不同环境及不同项目的配置文件

nacos 集群部署后,统一把配置文件管理起来,方便后期维护

  1. 配置中心文件的配置
  • 首先,在配置中心新建的配置文件中,比如 test-application-dev.yml 配置如下
server:
  port: 8083
spring:
  application:
    name: test-application
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        group: DEV_GROUP
    gateway:
        discovery:
            locator:
                enabled: true
        routes:
        # 自定义的路由 ID,保持唯一
        - id: test
          # 目标服务地址
          uri: http://www.baidu.com
          # 组合成其他复杂的逻辑(比如:与,或,非)
          predicates: # 断言(判断条件)
            - Path=/api/**

# 监控
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 配置自己的工程项目
  • 为了在打包时区别不同的环境,在resource下新建bootstrap.yml文件和application.yml两个文件,其中bootstrap.yml的加载优先级要高于application.yml
  • 配置bootstrap.yml
server:
  port: ${server.port}
spring:
  application:
    name: @nacosAppName@
  cloud:
    nacos:
      discovery:
        server-addr: @nacosAddr@
        namespace: @nacosNamespace@
        group: @nacosGroup@
      config:
        server-addr: @nacosAddr@
        prefix: ${spring.application.name}
        file-extension: yml
        namespace: @nacosNamespace@
        group: @nacosGroup@
    sentinel:
      transport:
        dashboard: @nacosAddr@

这里的参数根据pom里的动态获取,以在打包的时候区别了不同环境

  • pom.xml
...
<!-- 环境信息 -->
	<profiles>
		<!-- 标记开发环境 -->
		<profile>
			<id>dev</id>
			<properties>
				<nacosAddr>localhost:8848</nacosAddr>
				<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
				<nacosAppName>test-gateway-dev</nacosAppName>
				<nacosGroup>DEV_GROUP</nacosGroup>
			</properties>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
		</profile>
		<!-- 测试环境 -->
		<profile>
			<id>test</id>
			<properties>
				<nacosAddr>localhost:8848</nacosAddr>
				<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
				<nacosAppName>test-application-test</nacosAppName>
				<nacosGroup>TEST_GROUP</nacosGroup>
			</properties>
			<activation>
				<activeByDefault>false</activeByDefault>
			</activation>
		</profile>
		<!-- 生产环境 -->
		<profile>
			<id>prod</id>
			<properties>
				<nacosAddr>localhost:8848</nacosAddr>
				<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
				<nacosAppName>test-application-prod</nacosAppName>
				<nacosGroup>PROD_GROUP</nacosGroup>
			</properties>
			<activation>
				<activeByDefault>false</activeByDefault>
			</activation>
		</profile>
	</profiles>
...

以上,启动nacos服务,然后启动工程,一般就会读取到配置中文里的配置信息,并且上面已经配置了服务发现功能,所以在nacos上也能看见自动注册的服务了,简单的注册中心和配置中心大致为此。

顺便说说nacos springcloud和springboot版本的对应问题,工程用的springboot版本为2.4.1版本,但是nacos目前官方支持最高版本如下 github.com/alibaba/spr…

所以在引入的时候,刚开始版本对不上会有一些意想不到的问题,多次试验后,最终成功引入的依赖

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-gateway</artifactId>
          <version>2.2.6.RELEASE</version>
      </dependency>


      <!--监控模块-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
          <version>2.4.1</version>
      </dependency>


      <!--nacos 客户端 配置中心-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
          <version>2.2.5.RELEASE</version>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-context</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

      <!--服务注册-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          <version>${nacos-discovery.version}</version>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-context</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
          <version>3.0.0</version>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

      <!--该依赖不加,请求注册的微服务时会报503的错误-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-loadbalancer</artifactId>
          <version>3.0.0</version>
      </dependency>

      <!--熔断和流控-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
          <version>2.2.5.RELEASE</version>
      </dependency>

安全问题

nacos 安全方面有问题,网上搜索一下有很多

所以nacos的8848端口不要暴露到公网环境了

【问题汇总】

nacos整合springcloud + gateway时,报错:

Whitelabel Error Page
This application has no configured error view, so you are seeing this as a fallback.

Thu Mar 04 11:14:50 CST 2021
[29ad555a-1] There was an unexpected error (type=Service Unavailable, status=503).

试了各种办法死活解决不了,一度怀疑人生,最终,在插电怀疑是版本问题的时候,在issues里发现了一个解决办法 github.com/alibaba/nac… 该问题解决。 主要是返回503后,没有其他任何有线索的日志了,完全不知道到底是哪里出了问题,还是因为自己对这一块不熟悉。想想也是,要实现客户端的负载均衡,比如@LoadBalanced 或者 lb://service_name ,必然需要引入相应的包