Yolov5自定义数据集训练全流程指南
2026/9/24 23:45:56
关键词:毕设、微服务、Spring Cloud Alibaba、Docker Compose、服务拆分
先别急着把“微服务”写进开题报告,看看下面几条有没有中枪:
ConnectTimeout,老师一句“健壮性呢?”直接问懵。localhost:8848。如果你也踩过类似的坑,下面的实战复盘或许能救你一命。
| 维度 | Spring Cloud Alibaba(SCA) | Dubbo |
|---|---|---|
| 学习曲线 | 与 Spring Boot 无缝衔接,注解丰富 | 额外掌握dubbo配置、SPI 机制 |
| 注册中心 | Nacos(自带控制台,可视化佳) | Zookeeper/Nacos,控制台需额外搭 |
| 通信协议 | HTTP(OpenFeign),调试抓包一目了然 | 默认 dubbo 协议,二进制包抓包需解码 |
| 毕业场景 | 演示、答辩、本地一键启动 | 高并发压测更优,但毕设往往用不上 |
结论:时间紧、人手少、答辩优先,选 SCA;如果团队里有大神想玩高并发,再考虑 Dubbo。
校园资源共享平台,允许学生发布二手教材、闲置电子设备。两个核心子域:
user-service。user表只在user-service,resource表只在resource-service。userId写进请求头。resource-service通过 OpenFeign 调用user-service拿到用户摘要,本地缓存 30 s,降低并发重复查询。场景:两同学同时下单同一本二手书。
解决步骤:
version字段。spring-integration-redis),锁 key 为resource:{id},持有时间 3 s。Retryer两次、间隔 500 ms,防止网络抖动误判为库存不足。以下代码均基于 Spring Boot 3.2 + Spring Cloud 2022.0.0,端口分别为8081、8082,注册中心 Nacos 本地8848。
/inner/{userId}// UserController.java @RestController @RequestMapping("/inner") @RequiredArgsConstructor public class UserInnerController { private final UserRepository repo; @GetMapping("/{userId}") public UserDTO get(@PathVariable Long userId){ return repo.findById(userId) .map(u -> new UserDTO(u.getId(), u.getNickname())) .orElseThrow(()-> new BizException("USER_NOT_FOUND")); } }// UserClient.java @FeignClient(value = "user-service", fallback = UserClientFallback.class) public interface UserClient { @GetMapping("/inner/{userId}") UserDTO getUser(@PathVariable Long userId); } @Component class UserClientFallback implements UserClient { @Override public UserDTO getUser(Long userId){ // 返回空对象,前端展示“用户已注销” return new UserDTO(null, "匿名用户"); } }@PostMapping public ApiResp<String> publish(@RequestBody PublishReq req, @RequestHeader(HttpHeaders.AUTHORIZATION) String token){ // 1. 验证 JWT Long userId = JwtHolder.parse(token); // 2. 幂等性:使用 token + 请求体 MD5 作为 key,Redis 缓存 60 s String idemKey = "publish:" + userId + ":" + DigestUtils.md5DigestAsHex(req.toString().getBytes()); if (Boolean.TRUE.equals(redisTemplate.hasKey(idemKey))) { return ApiResp.ok("重复提交,已忽略"); } redisTemplate.opsForValue().set(idemKey, "1", Duration.ofSeconds(60)); // 3. 业务处理 resourceService.publish(userId, req); return ApiResp.ok("发布成功"); }JWT 令牌
userId请求头,不解析 token,减少重复计算。接口幂等
冷启动延迟
spring-cloud-starter-bootstrap提前加载 Nacos 配置,把初始化耗时从 2.3 s 降到 1.1 s。paketobuildpacks打出来的 120 M,比官方 openjdk 瘦身 40%,启动再快 500 ms。| 现象 | 根因 | 解决 |
|---|---|---|
| Nacos 配置热更新失效 | @RefreshScope没加、或配置类是内部类 | 把@Configuration单独建文件,并加@RefreshScope |
| Docker 容器互相 ping 不通 | 默认 bridge 网络隔离 | 建自定义网络docker network create campus,所有服务networks: - campus |
Feign 调用报404 | 路径拼写错 / 网关 stripPrefix=1 误删 | 本地用feign.Logger.Level=FULL打印 URL 对照 |
| 日志时间差 8 h | 容器缺 locale | Dockerfile 加ENV TZ=Asia/Shanghai并RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime |
| 压测时 Hystrix 线程池爆满 | 毕设根本用不到高并发,把超时设短一点即可,或者直接 Sentinel 限流 |
version: "3.9" services: nacos: image: nacos/nacos-server:v2.3.0 environment: MODE: standalone ports: ["8848:8848"] user-service: build: ./user-service networks: [campus] depends_on: [nacos] resource-service: build: ./resource-service networks: [campus] depends_on: [nacos] gateway: build: ./gateway networks: [campus] ports: ["80:80"] depends_on: [user-service, resource-service] networks: campus:本地测试:
docker compose up -d浏览器访问http://localhost/api/resource即可。
把微服务写进毕设,最怕“为了拆而拆”。下面三句话送给还在纠结的你:
docker logs翻半天。动手复现,把仓库跑通,再思考“如果只有两台 2C4G 轻量云,如何既保证高内聚,又省运维成本?”——这或许比“微服务”本身,更像一份合格的毕业答卷。