在现代微服务架构中,服务注册和配置管理是至关重要的组件。Nacos 作为阿里巴巴开源的一站式解决方案,集成了服务注册、发现、配置管理、动态DNS服务等功能,非常适合微服务架构的需求。在本文中,我们将基于 JDK 17 和 Spring Boot 3.3.4 来接入 Nacos,以实现服务注册与配置管理的功能。
为什么选择 JDK 17 和 Spring Boot 3.3.4?
- JDK 17:作为当前长期支持 (LTS) 版本,它稳定性高,性能提升显著,适合在生产环境中长期使用。
- Spring Boot 3.3.4:是一个现代、成熟的开发框架,提供了对 Spring Cloud 和 Nacos 的良好兼容,能帮助我们快速构建和管理微服务应用。
接下来,我们将逐步演示如何使用 Docker 部署 Nacos 并在 Spring Boot 项目中接入 Nacos,实现微服务的注册与配置管理。
1.首先我们在父类工程中加入对应的依赖版本
# 这里用2023.0.1.0版本后续如果需要修改版本在这里修改即可
<properties>
<alibaba.version>2023.0.1.0</alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
然后我们在响应的子类中添加依赖和配置(我就随便拿我一个子类举例)
<dependencies>
<!-- Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${alibaba.version}</version>
</dependency>
<!-- Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
ps:一定要确认这个是父子级关系不然${alibaba.version}会爆红
2.服务器上Nacos安装部署
1. 拉取 Nacos Docker 镜像
在你的 CentOS 7 服务器上,使用 Docker 拉取 Nacos 镜像(推荐用2.2.0版本)。运行以下命令:
docker pull nacos/nacos-server:latest
2. 启动 Nacos 容器
启动 Nacos 容器时,可以设置一些环境变量来配置 Nacos 的行为(PS:这里我建议把9849,9848端口都开放不然到时候会报连接超时的错,问题很抽象具体原因可以去看官网文档)。执行以下命令来启动 Nacos:
docker run -d --name nacos-standalone \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
--restart=always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
nacos/nacos-server:latest
解释
-d
:以后台模式运行容器。--name nacos-standalone
:指定容器的名称为nacos-standalone
。-e MODE=standalone
:设置 Nacos 运行在单机模式下。--restart=always
:配置容器在异常退出时自动重启。-e PREFER_HOST_MODE=hostname
:这个变量指定 Nacos 使用主机名作为服务注册的地址,如果你的容器内外访问都需要使用主机名,这个配置是有用的。-p 8848:8848
:将宿主机的 8848 端口映射到容器的 8848 端口,这样你可以通过http://your-server-ip:8848
访问 Nacos 控制台。
3.配置防火墙(如果有需要)
如果你的服务器上有防火墙,请确保开放 8848 端口来允许外部访问:
firewall-cmd --permanent --add-port=8848/tcp
firewall-cmd --permanent --add-port=9848/tcp
firewall-cmd --permanent --add-port=9849/tcp
firewall-cmd --reload
PS:如果是阿里云服务器可以直接在安全组中修改如图
4.打印一下nacos的log日志看下是否能正常启动,或者是直接容器请求看是否能正常请求
docker logs nacos-server
其他问题的补充如果上面地址连接不上,就去CMD中敲如下命令:
# 这个请求地址是你自己的公网IP地址!
curl http://47.238.***.**:8848/nacos/v1/ns/operator/metrics
如果结果显示{"status":"UP"}就证明是可以连接上的,报caused: Param 'serviceName' is required.则是不行
还有有种可能连不上你仔进入到容器内部访问试试:
# (这里是你nacos容器的名称)
docker exec -it younacos /bin/bash
# 8848左边是nacos容器的名称,你也可以用你的公网ip
curl -I http://nacos-server:8848/nacos/index.html
如果结果输出差不多是这样开头的话就证明成功了:
HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Security-Policy: script-src 'self'.......
如果还是不行就去百度nacos从内部访问不到,这我就建议你把容器删了重新安装部署试试。
3.项目连接nacos
1.首先我们去配置文件里面添加注解注意是子类的启动类里面加上
@EnableDiscoveryClient
2.再去修改子类的配置文件:
spring:
config:
import: optional:nacos:/${spring.application.name}.yml
cloud:
nacos:
discovery:
server-addr: 47.238.**.**:8848 #这里填你的公网IP地址
connect-timeout: 10000 # 连接超时设置为5000毫秒
retry:
max-attempts: 5 # 设置最大重试次数
config:
server-addr: 47.238.**.***:8848
file-extension: yml
refresh-enabled: true # 自动刷新配置
timeout: 10000 # 配置文件读取的超时时间
3.最后启动项目如果是这样的就证明成功了!
如果后续需要将其他子类注册到nacos中就把配置写到子类的yml配置中去,然后去服务列表查看它是否注册成功(如果将服务关闭列表里面就会消失你关闭的服务),过程中可能还会遇到其他问题基本上百度或者问GPT都能解决我就不一一赘述了。