苍穹外卖项目:从Nacos配置优化到Gateway网关搭建实战

一、准备工作

  • 已搭建的苍穹外卖后端工程(含sky-server-admin-operationsky-common等模块)
  • 本地Nacos 2.4.x(单机模式,可正常访问控制台)
  • 中文版IDEA 2025.2.4
  • JDK 1.8
  • Maven 3.6+(已配置阿里云仓库)

二、微服务Nacos配置优化(解决启动报错)

之前启动sky-server-admin-operation时遇Nacos ConnectionFailureException(endpoint is blank),调整如下:

1. 调整配置文件加载逻辑

(1)主配置application.yml(放Nacos连接信息,确保初始化加载)

spring:
  application:
    name: sky-server-admin-operation
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:dev}  # 环境变量优先,默认dev
  config:
    # 引入Nacos配置集(公共+模块专属)
    import:
      - nacos:common-config-${spring.profiles.active}.yml?namespace=你的Nacos命名空间ID&group=sky-group-common
      - nacos:${spring.application.name}-${spring.profiles.active}.yml?namespace=你的Nacos命名空间ID&group=sky-group-admin
  cloud:
    nacos:
      # Nacos Config配置(初始化必加载)
      config:
        server-addr: ${NACOS_SERVER_ADDR:你的本地Nacos地址:8848}  # 本地默认值,云上可覆盖
        username: ${NACOS_USERNAME:你的Nacos用户名}
        password: ${NACOS_PASSWORD:你的Nacos密码}
        namespace: ${NACOS_NAMESPACE:你的Nacos命名空间ID}
        group: sky-group-common
      # Nacos Discovery配置(复用Config信息)
      discovery:
        server-addr: ${spring.cloud.nacos.config.server-addr}
        username: ${spring.cloud.nacos.config.username}
        password: ${spring.cloud.nacos.config.password}
        namespace: ${spring.cloud.nacos.config.namespace}
        group: sky-group-admin

踩坑说明:之前将Nacos连接信息放在Profile配置(application-dev.yml)中,导致Nacos Config初始化时拿不到信息报“endpoint is blank”,因此需将连接信息放在主配置确保初始化加载。

(2)Profile配置application-dev.yml(只放业务配置,敏感信息占位)

# 数据库配置
sky:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    host: 你的MySQL主机地址
    port: 3306
    database: 你的数据库名称
    username: 你的MySQL用户名
    password: 你的MySQL密码
# Redis配置
  redis:
    host: 你的Redis主机地址
    port: 6379
    database: 你的Redis数据库编号
    password: 你的Redis密码
    timeout: 3000ms
# OSS配置
  alioss:
    endpoint: 你的OSS地域节点(如oss-cn-beijing.aliyuncs.com)
    access-key-id: 你的OSS AccessKey ID
    access-key-secret: 你的OSS AccessKey Secret
    bucket-name: 你的OSS Bucket名称

2. 父pom.xml添加版本管理(解决依赖爆红)

在项目根目录pom.xml<dependencyManagement>中添加:

<dependencyManagement>
    <dependencies>
        <!-- Spring Boot版本管理 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud版本(适配Boot 2.7.3) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud Alibaba版本(适配Cloud 2021.0.4) -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.4.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 项目内部模块版本管理 -->
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</dependencyManagement>

踩坑说明:网关和微服务的Spring Cloud/Alibaba依赖版本不匹配会导致依赖爆红,因此需在父pom统一管理版本。

3. 验证Nacos配置优化

  1. 启动本地Nacos(单机模式):
    sh /usr/local/nacos/bin/startup.sh -m standalone
    
  2. 启动sky-server-admin-operation,Nacos控制台「服务列表」可看到该服务。

三、Spring Cloud Gateway网关搭建(中文版IDEA操作)

1. 创建网关模块sky-server-gateway

  1. 右键项目根目录→「新建」→「模块」→选「Maven」;
  2. 填写:GroupIdcom.sky、ArtifactIdsky-server-gateway、Version1.0-SNAPSHOT→完成。

2. 配置网关pom.xml(避依赖冲突)

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.sky</groupId>
        <artifactId>sky-take-out</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.sky</groupId>
    <artifactId>sky-server-gateway</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- Gateway核心依赖(禁加spring-boot-starter-web) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- Nacos服务发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 项目公共模块 -->
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

踩坑说明:Gateway基于WebFlux框架,若引入spring-boot-starter-web(Servlet栈)会导致依赖冲突,因此pom中禁止添加该依赖;此外,初期因sky-common依赖未指定版本导致Maven报错,需在pom中明确版本或父pom统一管理。

3. 编写网关配置文件

(1)application.yml(通用配置)

spring:
  application:
    name: sky-server-gateway
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:dev}
  cloud:
    gateway:
      routes:
        - id: admin-operation-route  # 路由唯一ID
          uri: lb://sky-server-admin-operation  # 目标微服务名(Nacos中一致)
          predicates:
            - Path=/admin/**  # 路径匹配规则

踩坑说明:路由的uri服务名需与Nacos中微服务的spring.application.name完全一致,否则网关无法发现服务。

(2)application-dev.yml(本地配置)

server:
  port: 8080  # 网关统一端口
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 你的本地Nacos地址:8848
        username: 你的Nacos用户名
        password: 你的Nacos密码
        namespace: 你的Nacos命名空间ID
        group: sky-group-gateway

4. 创建网关启动类(避包路径/注解冲突)

  1. 右键src/main/java → 「新建」→ 「软件包」→ 输入com.sky.gateway踩坑说明:初期将启动类放在com.sky根包下,未按模块划分,易与其他微服务类冲突,规范放在com.sky.gateway下);
  2. 右键com.sky.gateway → 「新建」→ 「Java类」→ 类名SkyGatewayApplication
  3. 编写代码:
package com.sky.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication(exclude = {RedisAutoConfiguration.class})
@EnableDiscoveryClient
public class SkyGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyGatewayApplication.class, args);
    }
}

踩坑说明@EnableWebMvc会与Gateway的WebFlux框架冲突,启动类禁止添加该注解;且启动类包路径若层级混乱,会导致SpringBoot组件扫描异常,需按模块规范划分包路径。

5. 启动网关并验证

按「Nacos→微服务→网关」顺序启动(踩坑说明:若先启动网关,会因Nacos中无服务信息导致启动后无法转发),Nacos控制台可看到网关服务在线。

四、网关接口503错误记录(待排查)

1. 错误现象

访问http://localhost:8080/admin/employee/login返回503 Service Unavailable。

2. 待排查方向

  1. Nacos命名空间/分组是否与微服务一致(之前因分组不匹配出现过服务不可见);
  2. 网关路由的服务名是否与Nacos中微服务名完全匹配;
  3. 微服务实例是否处于健康状态;
  4. 网关与微服务的Nacos注册信息是否同步(如实例IP/端口是否正确)。

五、总结

  1. 完成微服务Nacos配置优化,解决“endpoint is blank”启动报错,通过主配置+Profile配置实现多环境隔离;
  2. 规避依赖冲突、包路径混乱、注解冲突等坑点,成功搭建Gateway网关并规范配置,实现请求统一入口;
  3. 记录网关503错误,关联之前的服务发现类踩坑点,明确后续排查方向,为微服务联调打下基础。
posted @ 2025-11-30 01:08  WILK  阅读(2)  评论(0)    收藏  举报