Nacos部署以及Spring Cloud应用配置

434 阅读4分钟

简介

Nacos 是一个构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 的关键特性包括:服务发现和服务健康监测、动态配置服务、动态 DNS 服务、服务及其元数据管理。
Nacos 作为 Spring Cloud Alibaba 的一员,用于分布式服务解决方案的服务注册与发现和分布式配置。
本文则主要记录在 Docker 上搭建 Nacos 的过程,以及在 Spring Cloud 应用中如何配置。

快速开始(简单测试)

快速地运行一个 Nacos Server 用于简单测试
MODE,指定系统启动方式,standalone为单机,cluster(默认值)为集群

docker run --name nacos-quick \
  -e MODE=standalone \
  -p 8848:8848 \
  -p 9848:9848 \
  -d nacos/nacos-server:2.0.2

以嵌入式数据库存储启动

PREFER_HOST_MODE,支持IP还是域名模式,取值ip(默认值)或hostname
NACOS_AUTH_ENABLE,是否开启权限系统,取值truefalse(默认值)
-v,挂载卷,/home/nacos/logs是Nacos服务容器存储日志的位置

docker run -d --name nacos \
  -p 8848:8848 \
  -p 9848:9848 \
  -v /Users/wei/data/nacos/standalone-logs/:/home/nacos/logs \
  -e PREFER_HOST_MODE=hostname \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \
  nacos/nacos-server:v2.0.4-slim

以外部MySQL数据库存储启动

在单机模式时Nacos可以使用嵌入式数据库实现数据的存储,但是这不便于观察数据存储情况
从0.7版本起,Nacos增加了支持MySQL数据源的能力
在运行此Nacos服务容器前需要先准备好环境变量文件并初始化数据库
--env-file,指定文件并从中读取环境变量,MySQL数据库连接属性即配置在里面

docker run -d --name nacos \
  -p 8848:8848 \
  -p 9848:9848 \
  -v /Users/wei/data/nacos/standalone-logs/:/home/nacos/logs \
  --env-file=./env/nacos-standlone-mysql.env \
  nacos-server:v2.0.3-arm64

环境变量文件

由于运行容器时需要的环境变量太多,将变量统一写在nacos-standlone-mysql.env

  • PREFER_HOST_MODE,支持IP还是域名模式,取值ip(默认值)或hostname
  • MODE,指定系统启动方式,standalone为单机,cluster(默认值)为集群
  • SPRING_DATASOURCE_PLATFORM,单机模式下数据源平台,取值mysql或留空(默认)
  • MYSQL_SERVICE_HOST,数据库连接地址
  • MYSQL_SERVICE_DB_NAME,数据库库名
  • MYSQL_SERVICE_PORT,数据库端口,默认3306
  • MYSQL_SERVICE_USER,数据库用户名
  • MYSQL_SERVICE_PASSWORD,数据库用户密码
  • MYSQL_SERVICE_DB_PARAM,数据库连接参数
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

初始化数据库

1.创建nacos数据库用户
2.创建nacos_config数据库
3.赋予用户nacosnacos_config数据库的所有权限
4.初始化数据库,数据库脚本:github.com/alibaba/nac…

create user 'nacos'@'%' identified by 'nacos';

CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARSET utf8 COLLATE utf8_bin;

grant all privileges on nacos_config.* to 'nacos'@'%' with grant option;

flush privileges;

Docker Compose编排

官方提供的 Compose 编排用例中使用了官方自制的MySQL镜像,启动运行时会自动初始化数据库

version: "2"
services:
  nacos:
    image: nacos/nacos-server:v2.0.4
    container_name: nacos-standalone-mysql
    env_file:
      - ../env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9848:9848"
    depends_on:
      - mysql
    restart: always
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:8.0.16
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

mysql服务环境变量文件

MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=nacos_devtest
MYSQL_USER=nacos
MYSQL_PASSWORD=nacos

自定义Compose编排

实际上在生产中并不建议将MySQL服务以容器化运行,所以应当自定义Compose编排,只存留nacos

version: "2"
services:
  nacos:
    image: nacos/nacos-server:v2.0.4-slim
    container_name: nacos
    env_file:
      - ./env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
    ports:
      - "8848:8848"
      - "9848:9848"

访问Nacos控制台

浏览器访问:localhost:8848/nacos
默认用户名/密码:nacos/nacos

Spring Cloud应用配置

模块及依赖管理

聚合模块的POM

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.7.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

子模块的POM

分别引入两个依赖
spring-cloud-starter-alibaba-nacos-discovery用于Nacos服务注册与发现
spring-cloud-starter-alibaba-nacos-config用于Nacos配置中心

<!-- spring cloud alibaba nacos 服务注册发现 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- spring cloud alibaba nacos 配置中心 -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

应用属性文件配置

bootstrap.yml

spring.application.name用于构成Nacos配置管理的dataId
spring.cloud.nacos.config.server-addr配置Nacos Server地址
usernamepassword为访问Nacos Server的用户名和密码
file-exetension表示配置内容的数据格式,也用于构成dataId

spring:
  application:
    name: account-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
        file-extension: yml

Nacos配置管理

访问Nacos控制台,选择配置管理-配置列表
创建或配置dataId: account-service.yml
image.png

account-service.yml

spring.cloud.nacos.discovery.server-addr配置Nacos Server地址用于服务注册与发现
usernamepassword为访问Nacos Server的用户名和密码
其他属性配置与通常的 Spring Boot 配置一样

server:
  port: 8012

spring:
  application:
    name: account-service
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/seata_account?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true&tinyInt1isBit=false&allowMultiQueries=true
    username: seata
    password: seata
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos

mybatis-plus:
  mapper-locations:
    - classpath:mapper/*.xml

参考

[1] Github nacos-docker: github.com/nacos-group…
[2] Nacos Official nacos-docker: nacos.io/zh-cn/docs/…
[3] Docker Hub Nacos: hub.docker.com/r/nacos/nac…
[4] mysql-schema.sql: github.com/alibaba/nac…