java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java毕设推荐用SpringCloud微服务架构

为什么Java毕设推荐用SpringCloud微服务架构

作者:运维 Ops

还在用单体架构做Java毕设?本文手把手教你用SpringCloud搭建微服务项目,涵盖Nacos注册中心、Gateway网关、OpenFeign调用等核心技术,轻松提升毕设技术含量和答辩通过率

最近在帮学弟学妹们看Java毕业设计,发现一个挺普遍的现象:很多同学的项目还是传统的单体架构,一个Spring Boot应用包打天下。答辩时老师一问“为什么不用微服务?”,往往就答不上来了。其实,对于Java方向的毕设来说,引入Spring Cloud实现一个简单的微服务架构,不仅能显著提升项目的技术含量和答辩印象分,更是一次非常好的学习实践。

今天,我就结合自己带项目的经验,聊聊如何从零开始,把一个单体应用平滑迁移成基于Spring Cloud的微服务毕设项目。我们会避开复杂的理论,聚焦于“跑起来”和“用明白”。

1. 为什么毕设需要从单体走向微服务?

你可能觉得,一个毕业设计,业务逻辑简单,用户量几乎为零,用单体应用不是更省事吗?这话没错,但毕设的目的不仅仅是“完成功能”,更是“展示能力”和“学习新知”。

单体应用的局限性在毕设中主要体现在:

引入微服务的必要性:

简单说,用微服务做毕设,是一个“低风险、高收益”的选择——你可以在一个可控的环境里,学习并应用一套业界广泛使用的架构。

2. Spring Cloud 技术选型:我该用哪个?

Spring Cloud其实是一个“全家桶”,里面有很多组件可以选。对于新手,最头疼的莫过于“我该用Eureka还是Nacos?用Zuul还是Gateway?”。

这里我直接给出一个2023-2024年比较主流且对新手友好的选型建议,并说明理由:

服务注册与发现:Nacos

服务网关:Spring Cloud Gateway

服务间调用:OpenFeign

熔断降级:Resilience4j 或 Sentinel

总结一下我们的技术栈:Spring Boot + Spring Cloud + Nacos + Gateway + OpenFeign + Resilience4j。 这套组合拳兼顾了主流性、易用性和学习价值。

3. 手把手搭建最小化微服务集群

理论说完,我们来点实际的。假设我们的毕设是一个简单的“电商平台”,我们把它拆分成三个服务:

第一步:搭建Nacos Server 去Nacos官网下载最新稳定版(建议用2.x),解压后,在bin目录下执行启动命令(单机模式):

# Linux/Mac
sh startup.sh -m standalone

# Windows
cmd startup.cmd -m standalone

访问 http://localhost:8848/nacos,默认账号密码都是 nacos。看到管理界面就成功了。

第二步:创建父工程管理依赖 创建一个Maven父工程,在pom.xml中统一管理Spring Cloud和Spring Boot的版本,避免子模块间版本冲突。

<!-- 父工程 pom.xml 关键部分 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18</version> <!-- 选用一个长期支持的版本 -->
</parent>
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2021.0.8</spring-cloud.version> <!-- 与Boot 2.7.x匹配的Cloud版本 -->
    <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud 依赖管理 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud Alibaba 依赖管理 -->
        <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>

第三步:开发user-service(服务提供者)

  1. 创建子模块user-service。
  2. 引入关键依赖:spring-boot-starter-web, spring-cloud-starter-alibaba-nacos-discovery。

编写配置文件application.yml:

server:
  port: 8081 # 指定端口
spring:
  application:
    name: user-service # 服务名,非常重要!
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos服务器地址
# 配置管理部分(如果后续要用Nacos当配置中心,可以在这里开启)
#  config:
#    server-addr: localhost:8848
#    file-extension: yaml

主类添加@EnableDiscoveryClient注解(新版本Spring Cloud Alibaba默认已开启,可省略)。

编写一个简单的REST控制器:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        // 模拟查询数据库
        return "用户信息: User_" + id;
    }
}

启动后,在Nacos控制台“服务管理”列表里,应该能看到名为user-service的服务。

第四步:开发order-service(服务消费者,使用OpenFeign)

  1. 创建子模块order-service。
  2. 引入依赖:spring-boot-starter-web, spring-cloud-starter-alibaba-nacos-discovery, spring-cloud-starter-openfeign。
  3. 配置文件application.yml,端口设为8082,服务名设为order-service,同样注册到Nacos。
  4. 主类添加@EnableFeignClients注解。

关键步骤:声明Feign客户端接口

// 这个接口定义了如何调用 user-service
@FeignClient(name = "user-service") // name指定了要调用的服务名
public interface UserServiceClient {

    @GetMapping("/users/{id}") // 这里复刻了user-service的接口路径
    String getUserById(@PathVariable("id") Long id); // 方法签名也保持一致
}

在OrderController中注入并使用UserServiceClient:

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private UserServiceClient userServiceClient; // 像使用本地Bean一样注入

    @GetMapping("/{orderId}")
    public String getOrderWithUser(@PathVariable Long orderId) {
        // 模拟订单逻辑
        String orderInfo = "订单ID: " + orderId;

        // 通过Feign远程调用用户服务,无需关心URL和HTTP细节
        String userInfo = userServiceClient.getUserById(1001L);

        return orderInfo + " | " + userInfo;
    }
}

启动order-service。访问 http://localhost:8082/orders/1,你会看到返回结果中包含了从user-service获取的用户信息。这就是服务间调用的魔力!

4. 本地开发调试与基础安全

调试技巧:

基础安全配置(接口鉴权): 对于毕设,实现一个完整的OAuth2或JWT可能较重。一个简单实用的方法是使用Spring Cloud Gateway的过滤器进行简单的令牌校验。

在Gateway服务的配置中,添加一个全局过滤器(GlobalFilter):

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("X-Token");
        // 简单校验,实际项目中应从Redis或数据库验证
        if (token != null && "valid-token".equals(token)) {
            return chain.filter(exchange); // 放行
        }
        // 拒绝访问
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
    @Override
    public int getOrder() {
        return -1; // 过滤器执行顺序
    }
}

这样,所有通过Gateway的请求都必须携带正确的X-Token头才能访问背后的微服务。

5. 生产环境避坑指南(毕设答辩版)

这里的“生产环境”指的是你的毕设演示环境。以下几个坑,我几乎见每个新手都会踩一遍:

版本兼容性!版本兼容性!版本兼容性!

YAML缩进错误

服务启动成功,但Nacos上看不到

Feign调用报错:UnknownHostException 或 Connection refused

这通常是服务名解析失败。确保:

跨域问题(CORS)

# 在Gateway的application.yml中
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有路径
            allowedOrigins: "*" # 毕设演示为了方便可以设为*,实际项目要指定前端地址
            allowedMethods: "*"
            allowedHeaders: "*"

6. 结尾与思考

按照上面的步骤,你应该已经拥有了一个虽然简单但“五脏俱全”的微服务毕设骨架。它包含了服务注册发现、声明式HTTP调用等核心特性,代码结构清晰,完全可以直接在此基础上填充你的业务逻辑。

最后留一个思考题,也是你可以为毕设增加的亮点:

如何为你的毕设增加链路追踪?

当一次用户请求先后调用Gateway -> order-service -> user-service时,如何清晰地追踪这个请求的完整路径和性能瓶颈?你可以去了解一下 Spring Cloud Sleuth 和 Zipkin(或 SkyWalking)。集成它们后,你可以在日志中看到唯一的TraceId,或者在Zipkin的UI上看到漂亮的调用链图,这会让你的答辩演示更加出彩。

微服务的学习之路很长,但通过这个毕设项目起步,你已经拿到了打开这扇大门的钥匙。最重要的是动手去试,遇到问题多查文档(官方文档永远是第一选择)、多调试。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文