
centos7部署Nacos(超详细)
centos中配置nacos并连接到子模块中被注册到nacos服务列表中
Nacos官网: https://nacos.io/zh-cn/index.html
github中nacos下载链接: https://github.com/alibaba/nacos/releases
nacos快速开始官网文档: https://nacos.io/zh-cn/docs/quick-start.html
Nacos 鉴权:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
Nacos 多数据源插件:https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html
Nacos 集群部署说明 :https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
需要以下环境
JDK 教程地址:https://blog.csdn.net/m0_58943936/article/details/134604149
Mysql 教程地址: https://blog.csdn.net/m0_58943936/article/details/134604238
Nacos (当前文章)
1. Nacos安装与启动
- Nacos 端口
| 端口 | 描述 |
| 7848 | 集群数据同步端口 |
| 8848 | Web管理端访问端口 |
| 9848 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
| 9849 | 服务端gRPC请求服务端端口,用于服务间同步等 |
1.解压nacos压缩文件:
unzip nacos-server-2.0.3.zip
解压后的内容我放到了下方目录下
2.配置开机自启动
在/etc/systemd/system/ 目录下创建 nacos.service 文件
sudo nano /etc/systemd/system/nacos.service
在其中添加如下内容
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/opt/software/nacos1.4.4/bin/startup.sh -m standalone
ExecReload=/opt/software/nacos1.4.4/bin/shutdown.sh
ExecStop=/opt/software/nacos1.4.4/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意: 其中Exec后面的路径是你nacos的路径
配置完毕文件之后,重载系统配置
sudo systemctl daemon-reload
然后开启开机自启
sudo systemctl enable nacos.service
之后启动nacos
systemctl start nacos.service
然后使用status命令查看是否启动成功
systemctl status nacos.service
启动失败了
3.启动失败情况
如果启动失败,可能是出现了JDK配置的问题,不用担心,这里假设你已经配置了JDK在系统环境中,然后按照如下配置即可解决
首先是创建软连接
下方/home/soft/jdk/jdk-11.0.20/bin路径为你自己的jdk/bin所在路径,替换即可
ln -s /home/soft/jdk/jdk-11.0.20/bin/javac /usr/bin/javac
ln -s /home/soft/jdk/jdk-11.0.20/bin/jar /usr/bin/jar
ln -s /home/soft/jdk/jdk-11.0.20/bin/java /usr/bin/java
此时可以先试着启动一下nacos
systemctl start nacos.service
-- 查看下是否启动成功
systemctl status nacos.service
如果还是不行,那么就修改nacos的startup.sh文件即可,操作如下
vim /home/soft/nacos/bin/startup.sh
把这里原本是空着的JAVA_HOME直接指定为你的JDK位置即可
如果还是不行,有可能是以为你的nacos启动的方式为集群cluster方式,那么修改为单机启动
– 查看下是否启动成功,
systemctl status nacos.service
4.访问nacos
注意: 配置安全组和防火墙的记得放开端口8848
成功后就可以在浏览器中访问到这个nacos了,端口是8848
备注:
初始用户名和密码都是nacos
http://Ip地址:8848
如果上面的访问不了, 在端口后加/nacos
http://Ip地址:8848/nacos/
2. SpringBoot项目与Nacos配置
背景介绍
Spring Boot是一个开发Java应用程序的框架,而Nacos是一个用于配置管理和服务发现的开源平台。
在Spring Boot项目中使用Nacos作为配置中心,可以实现动态配置管理和实时更新配置的能力。
一、Nacos服务端配置命名空间和yml文件
注意:建议大家以自己的名字全拼命名,防止大家搞混(可以用中文)
配置命名空间
添加配置列表
配置内容编辑
添加子模块配置并添加连接信息
添加子模块
配置连接信息
二、SpringBoot项目父子模块配置nacos
父模块中添加依赖
在父pom.xml中添加spring boot,spring cloud,spring cloud alibaba三个依赖
dependencyManagement标签是父模块共享依赖, 在Maven项目中集中管理所有模块的依赖版本. 在子模块中, 声明该依赖,无需在每个模块中单独声明版本号.
作用:
可以减少在每个模块中声明版本的重复性,提高维护性,避免因为不同的模块使用了不同版本的同一依赖库而导致的版本冲突,
Maven 在解析依赖关系时,会优先使用 dependencyManagement标签 中定义的版本.
<!-- 父模块共享依赖, 在Maven项目中集中管理所有模块的依赖版本. 在子模块中, 声明该依赖,无需在每个模块中单独声明版本号.
作用: 可以减少在每个模块中声明版本的重复性,提高维护性,避免因为不同的模块使用了不同版本的同一依赖库而导致的版本冲突,
Maven 在解析依赖关系时,会优先使用 <dependencyManagement> 中定义的版本。-->
<dependencyManagement>
<dependencies>
<!--支持Spring Boot 2.1.X-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块添加依赖(可以看本文章4部分优化 , 将内容都放入到父模块中, 子模块继承父模块)
为所有子模块的pom.xml中添加服务配置nacos依赖
<dependencies>
<!-- nacos服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 排除 com.alibaba:fastjson 这个依赖的所有模块(可以不排除,不排除不用加) -->
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--nacos配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
子模块从bootstrap.yml中配置nacos信息
在子模块服务的src文件夹中的resources文件夹中右击新建一个bootstrap.yml文件,并进行nacos的配置
进行nacos配置
server:
port: ${SERVER_PORT:0}
spring:
application:
name: business
profiles:
active: ${pom.profile.name}
include: core
# nacos 分布式配置
cloud:
nacos:
config:
enabled: true
server-addr: http://ip地址:8848
file-extension: yaml
prefix: business
namespace: 命名空间唯一标识id
discovery:
enabled: true
server-addr: http://ip地址:8848
namespace: 命名空间唯一标识id
3.启动服务并查看nacos服务列表是否注册服务
子模块启动类增加@EnableDiscoveryClient,启用服务发现功能
在增加@NacosConfigurationProperties,用于将 Nacos 的配置信息映射到Java对象中
/**
* @author business
*/
// @EnableAsync是一个 Spring Framework 的注解,用于启用异步方法调用的支持
@EnableAsync
//排除默认的Druid连接池和数据源,exclude = {DruidDataSourceAutoConfigure.class, DataSourceAutoConfiguration.class}
@SpringBootApplication(scanBasePackageClasses = {CoreApplication.class, BusinessApplication.class})
//@EnableDiscoveryClient 是 Spring Cloud 提供的一个注解,用于启用服务发现功能
@EnableDiscoveryClient
//@EnableFeignClients(basePackageClasses = {CoreApplication.class, BusinessApplication.class})
@MapperScan(basePackages = {"com.Lv.**.mapper"})
@EnableSpringUtil
//将 Nacos 的配置信息映射到一个 Java 对象中,方便在应用程序中使用business.yaml的配置属性。
@NacosConfigurationProperties(dataId = "business.yaml",autoRefreshed = true,groupId = "DEFAULT_GROUP")
public class BusinessApplication {
public static void main(String[] args) {
SpringApplication.run(BusinessApplication.class , args);
}
}
服务启动成功, 打开nacos查看服务是否注册成功
子模块启动成功
打开nacos, 查看服务管理->点击【服务列表】 查看是否成功注册
(服务都到服务列表里说明注册成功)
总结
通过以上步骤,就可以在Spring Boot项目中使用Nacos作为配置中心,并实现动态配置管理。在Nacos中更新配置后,应用程序将自动获取最新的配置值。
4.优化
父pom添加依赖, 子模块共享父pom依赖
在 Maven 项目中,通过在父 POM 文件中添加依赖项,子模块可以共享这些依赖项.
好处:
- 一致性和集中管理:
将依赖项添加到父 POM 中可以确保所有子模块使用相同的版本。
这提供了一致性,并且便于集中管理项目中的依赖项。
当需要升级依赖版本时,只需在父 POM 中进行修改,而不必在每个子模块中都进行修改。
2. 简化子模块配置:子模块不需要重复声明相同的依赖项。
通过继承父 POM 的依赖项,子模块的 POM 文件会变得更简洁,只需声明自己特定的依赖项即可。
3. 避免版本冲突:如果子模块独立声明依赖项,可能会导致不同模块使用了不同版本的同一依赖项,从而引发版本冲突。通过在父 POM 中集中管理依赖项版本,可以避免这种问题。
4. 继承传递:子模块可以继承父模块的依赖关系。
如果一个子模块有一个父模块,而该父模块又有依赖项,那么子模块会自动继承这些依赖项,无需显式声明。
5. 提高可维护性:通过在父 POM 中定义共享的依赖项,可以提高项目的可维护性。
任何需要修改的依赖项只需在一个地方进行修改,而不是在每个子模块中都进行修改。
总的来说:
通过在父 POM 中添加依赖项,可以实现依赖项的一致性、集中管理,并减少子模块的配置和维护工作。
这种组织结构适用于多模块项目,使得项目更易于管理和协同开发。
父pom内容(根据自己项目对应编写即可)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging> --打包方式为pom
<groupId>com.Lv</groupId> --定义父项目com.Lv:test-project:1.0.0
<artifactId>test-project</artifactId>
<version>1.0.0</version>
<name>test-project</name> --定义是项目名称
<description>测试环境1.0</description>
<!--子模块管理-->
<modules>
<module>admin</module>
<module>business</module>
<module>core</module>
<module>gateway</module>
<module>job</module>
</modules>
<!-- 版本管理 -->
<properties>
<core.version>1.0.0</core.version>
<springboot.version>2.3.2.RELEASE</springboot.version>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<lombok.version>1.18.10</lombok.version>
<hutool.version>5.8.12</hutool.version>
</properties>
<!-- 父模块共享依赖, 在Maven项目中集中管理所有模块的依赖版本. 在子模块中, 声明该依赖,无需在每个模块中单独声明版本号.
作用: 可以减少在每个模块中声明版本的重复性,提高维护性,避免因为不同的模块使用了不同版本的同一依赖库而导致的版本冲突,
Maven 在解析依赖关系时,会优先使用 <dependencyManagement> 中定义的版本。-->
<dependencyManagement>
<dependencies>
<!--支持Spring Boot 2.1.X-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 用于列出项目所依赖的外部库(也称为依赖项或依赖关系)-->
--父模块添加外部依赖, 子模块要继承父模块,引用父模块依赖
<dependencies>
<!-- nacos服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 排除 com.alibaba:fastjson 这个依赖的所有模块 -->
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--nacos配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.version}</version>
</plugin>
</plugins>
<!--build节点增加内容-->
<resources>
<resource>
<directory>src/main/resources</directory>
<!--开启过滤,用指定的参数替换directory下的文件中的参数-->
<filtering>true</filtering>
<includes>
<include>bootstrap.yml</include>
<include>application-${pom.profile.name}.yml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>``</include>
<include>**/*.db</include>
<include>**/*.ttf</include>
<include>images/*.*</include>
<include>bgimages/*.*</include>
<include>META-INF/*.*</include>
<include>**/*.conf</include>
<include>**/*.xlsx</include>
</includes>
</resource>
</resources>
</build>
解释下build中引用的内容
resources标签中的内容用于指定 Maven 构建过程中资源文件的处理方式。
<resources>
Maven 中用于配置构建时处理资源文件的元素。
<resource>
指定一个资源目录及其配置。
<directory>
指定资源文件所在的目录,这里是 src/main/resources,通常 Maven 项目的资源文件都放在这个目录下。
<filtering>
设置是否启用资源文件中的参数过滤。当设置为 true 时,Maven 会将目标目录下的资源文件中的参数进行替换,例如 >${pom.profile.name}。我这里的pom.profile.name是值当前运行环境:如开发dev, 测试test,正式prod
<includes>
指定要包含在构建中的资源文件列表。
<include>
具体的资源文件名称或匹配模式,例如 bootstrap.yml 和 application-${pom.profile.name}.yml
第二个
<resource>
元素:类似地,指定了另一个资源目录及其配置,包括要包含的文件和目录的匹配模式。
这个配置的作用是将指定的资源文件和目录复制到 Maven 构建的目标目录中,同时可以进行参数过滤。
这样,就能够在构建过程中方便地将配置文件和其他资源文件打包到生成的 JAR 或 WAR 文件中。
子模块pom内容(其它子模块配置相同,结合内容编写即可)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<!-- 指定当前项目的父项目, 通过指定父项目,当前项目模块将继承父项目的配置-->
<parent>
<groupId>com.Lv</groupId>
<artifactId>test-project</artifactId>
<version>1.0.0</version>
</parent>
--定义当前模块名称
<artifactId>test_business</artifactId>
<name>business</name>
<description>业务中心</description>
--引用项目中的公共模块core
<dependencies>
<dependency>
<groupId>com.Lv</groupId>
<artifactId>test_core</artifactId>
<version>${core.version}</version>
</dependency>
</dependencies>
--设置repackage打包方式, 可以直接使用java-jar运行当前jar包
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.2.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Spring Boot 配置文件中使用${}来引用属性值
使用
${}
语法可以使配置值外部化,即从外部环境或配置源中获取.
好处:
1. 灵活性:外部化配置提供了更大的灵活性。可以在不修改代码的情况下更改应用程序的配置,而不必重新构建或重新部署应用程序。
2. 安全性:有些敏感信息,例如密码、密钥等,不应该硬编码在代码中。通过外部化配置,可以将这些敏感信息存储在安全的地方,并通过配置文件中的**${}**语法引用它们,而不必在代码中明文写入
bootstrap.yml配置中使用${}语法引用
下方${}
语法引用的内容都写在了总pom文件中
server:
port: ${SERVER_PORT:0}
spring:
application:
name: business
profiles:
active: ${pom.profile.name}
include: core
# nacos 分布式配置
cloud:
nacos:
config:
enabled: true
server-addr: ${NACOS_SERVER_ADDR}
file-extension: yaml
prefix: business
namespace: ${NACOS_NAMESPACE}
discovery:
enabled: true
server-addr: ${NACOS_SERVER_ADDR}
namespace: ${NACOS_NAMESPACE}
注意(看了少走弯路):
1.总pom中一定要将指定的资源文件和目录复制到 Maven 构建的目标目录中,同时可以进行参数过滤.
不然bootstrap.yml配置文件不会跟着打包.
2.一定要在各个模块服务的启动类中添加@NacosConfigurationProperties注解, 将 Nacos 的配置信息映射到一个 Java 对象中,方便在应用程序中使用business.yaml的配置属性。
不然使用${}
引用的内容, 不会将信息映射到Java对象中, 读取不到会导致报错
总pom文件
</profiles>
<profile>
<id>dev</id>
<!-- 设置默认环境为 dev -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<pom.profile.name>dev</pom.profile.name>
<NACOS_SERVER_ADDR>http://110.41.54.168:8848</NACOS_SERVER_ADDR>
<NACOS_NAMESPACE>1e379bc0-fda4-4493-818e-dcf5cf84f5a7</NACOS_NAMESPACE>
</properties>
</profile>
</profiles>
5.补充
yml 与properties文件区别
YML(YAML)和Properties文件是两种常见的配置文件格式,用于存储应用程序或系统的配置信息.
它们有以下区别:
语法结构:
YML使用缩进和冒号来表示层级关系,而Properties文件使用键值对的形式表示配置项。可读性:
YML文件使用缩进和结构化的语法,因此更易于阅读和理解。相比之下,Properties文件使用简单的键值对结构,可读性较差。复杂性:
YML文件支持更复杂的数据结构,如列表、嵌套对象等,可以更灵活地表示配置信息。Properties文件只支持简单的键值对,不支持复杂数据结构。扩展性:
YML文件可以轻松地添加注释,以及处理更复杂的配置需求。Properties文件不支持注释,且在处理复杂配置时可能变得冗长和难以维护。应用场景:
YML文件适用于需要更复杂结构和层级关系的配置信息,例如Spring Boot应用程序的配置文件。Properties文件适用于简单的键值对配置,常用于Java应用程序的配置文件。
nacos连接外部Mysql存储
单机模式下,Nacos默认使用嵌入式数据库实现数据的存储,若想使用外部Mysql存储Nacos数据,需要进行以下步骤:
初始化数据库
初始化MySQL数据库名,将nacos-mysql.sql导入
用Navicat导入nacos-mysql.sql
修改配置文件application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=
添加内容
重启nacos即可
systemctl start nacos.service
-- 查看下是否启动成功
systemctl status nacos.service
Nacos存储库
我们实现了基于 nacos 做 分布式配置中心,实施的存储、更新我们的配置文件数据,在使用以往的一些配置中心时,服务重启或者注册中心重启后,配置文件数据将会丢失,这种情况是因为将数据储存在 JVM 的内存当中,当 JVM 不再提供运行时,数据 也会相应的丢失,一些开源框架默认将数据存储在 JVM内存 中的还挺多的,那么 nacos 又是存储在哪里呢?
一、nacos默认存储存储方式
1.nacos默认储存
无论你是在重启服务还是重启 nacos-server 配置中心,你之前所存储的配置文件信息都不会丢失,这是因为 alibaba 默认将 nacos-server 作为分布式配置中心的数据存储到了一个叫做 derby 的内嵌数据库到 Java 应用程序中了
Derby是一个理想的,并且开源的,100% Java编写的,容易管理的关系数据库管理系统,它可以和一些商业 产品的特性进行交付。Apache Derby非常小巧,核心部分derby.jar只有2M,所以既可以做为单独的数据库服 务器使用,也可以内嵌在应用程序中使用。Cognos 8 BI的Content Store默认就是使用的Derby数据库,可以 在Cognos8的安装目录下看到一个叫derby10.1.2.1的目录,就是内嵌的10.1.2.1 版本的derby。
另外,除了上面提到的使用 nacos 做分布式配置中心时,数据除了存储到一个内嵌到 Java 应用程序 derby 数据库中之外, nacos 官方还提供了存储到 MySQL 中,在1.2.1及之前的版本,支持的只有 Mysql ,暂不支持其他关系型 数据库。官方文档介绍如下:
2.单机模式支持mysql
在 0.7 版本之前,在单机模式时 nacos 使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。 0.7 版本增加了支持 mysql 数据源能力,
具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据 源的url、用户名和密码。
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://IP地址:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000& db.user=nacos_devtest db.password=youdontknow
再以单机模式启动 nacos , nacos 所有写嵌入式数据库的数据都写到了 mysql
更多推荐
所有评论(0)