微服务搭建踩坑

背景

最近要新搭建一个微服务项目,在搭建过程中踩了不少坑。为了防止再犯,这里把踩过的坑总结一下

微服务踩坑

泛型和Object

之前一直认为泛型和Object是差不多的,直到我搭建服务时碰到了ClassCastException异常,被折腾的很难受,这才仔细去了解两者的差异:

  1. 泛型提供了编译时类型检查,可以在编译时发现类型错误,而不是在运行时。这样可以有效避免运行时抛出异常ClassCastException。而Object所有的类型信息在运行时才会被检查,因此存在在运行时发生类型错误的风险。
  2. 泛型提高了代码的重用性和可读性。通过使用泛型,可以编写更加通用和类型安全的代码,而不像Object那样需要进行显式的类型转换。
  3. 泛型是一种参数化类型的编程范式,它允许在编写代码时指定类型参数,提供了更灵活和安全的方式来处理不同类型的数据。

依赖报错

我在搭建服务时有用到nacos,以下nacos依赖建议不要使用:

xml 复制代码
<dependency>
  <groupId>io.github.pig-mesh.nacos</groupId>
  <artifactId>nacos-config</artifactId>
  <version>3.0.0</version>
</dependency>

使用时会提示以下异常:

java 复制代码
Exception in thread "main" java.lang.IllegalStateException: java.lang.NoSuchMethodError: 'java.lang.Boolean org.springframework.core.SpringProperties.checkFlag(java.lang.String)'

建议尽量使用官方提供的依赖。

yml文件占位符

在yml文件里使用@占位符时,需要在pom.xml里进行以下配置:

xml 复制代码
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                </configuration>
            </plugin>
        </plugins>
    </build>

如果yml占位符的值是从pom的父文件里获取的,也可以把该配置写在父pom.xml里

大型项目依赖管理

如果是一个大型项目,建议把项目的核心框架版本(Spring Boot、Spring Cloud等)、构建配置和环境管理放在根pom.xml里,把其他依赖的版本管理放在独立的子模块bom里。这样做有如下好处:

  1. 职责分离。分离职责后使每个配置文件职责清晰,便于维护
  2. 大型微服务项目包含大量内部模块,而每个模块又包含多个子模块,通过独立模块集中管理内部模块依赖,可确保版本一致性,避免循环依赖。
  3. 新增或调整内部模块依赖时,只需修改BOM模块,不影响根POM

nacos命名空间

你可能会碰到这样的问题:日志明明已经显示服务实例已成功注册,但是在nacos控制台却没有查询到该服务的信息。这种情况可能是nacos的namespace配置有问题,需要进行以下排查:

  1. 查询namespace的值是否为命名空间的id。namespace填写的是命名空间id,而不是命名空间的名称。
  2. 如果是id,排查id填写是否有误

gateway路由配置

gateway路由配置的uri必须有http://或https://请求头。此外,gateway的predicates不能为空

相关推荐
Linux-18741 小时前
分布式链路追踪系统之docker-compose安装skywalking
云原生·docker-compose·skywalking·分布式链路追踪系统·应用程序性能监控
CS创新实验室3 小时前
量子计算机的操作系统:原理、实践与经典架构之对比
架构·操作系统·量子计算
人间凡尔赛3 小时前
WAIC 2026 落幕,AI Agent 开发已进入 Harness 架构时代
人工智能·架构
极客侃科技4 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
晏宁科技YaningAI4 小时前
VoIP系统的工程实现模型:从信令控制到媒体传输的完整架构解析
网络·人工智能·架构·系统架构·信息与通信
剑之所向5 小时前
前后端分离架构
架构
延凡科技5 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
隔窗听雨眠7 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
Hui Baby8 小时前
K8S使用CRD和控制器简单应用
云原生·容器·kubernetes
大鱼>9 小时前
深入Real-ESRGAN架构:RRDBNet设计精髓与ONNX/TensorRT部署优化
人工智能·深度学习·架构