基于Java Spring Boot的云原生TodoList Demo 项目,验证云原生核心特性

以下是一个基于 Java Spring Boot 的云原生 TodoList Demo 项目,涵盖 容器化、Kubernetes 编排、CI/CD、可观测性、弹性扩缩容 等核心云原生特性,代码简洁且附详细操作指南,适合入门学习。

在这里插入图片描述

项目概览

  • 目标:实现一个支持增删改查(CRUD)的 TodoList 后端服务,通过云原生技术栈部署,展示完整的云原生实践流程。
  • 技术栈
    • 后端:Java 17 + Spring Boot 3.2(轻量、模块化)
    • 数据库:PostgreSQL(云原生持久化存储)
    • 容器化:Docker
    • 编排:Kubernetes(K8s)
    • CI/CD:GitHub Actions
    • 可观测性:Prometheus(监控) + Grafana(可视化) + Loki(日志)
    • 配置管理:Spring Cloud Config(可选,或直接使用 K8s ConfigMap)

一、项目结构

todolist-cloudnative/
├── src/                    # 核心业务代码
│   ├── main/
│   │   ├── java/com/example/todo/
│   │   │   ├── controller/  # REST 接口
│   │   │   ├── model/       # 数据库实体
│   │   │   ├── repository/  # 数据访问层
│   │   │   ├── service/     # 业务逻辑层
│   │   │   └── TodoApplication.java  # 启动类
│   │   └── resources/
│   │       ├── application.yml  # 主配置
│   │       └── logback-spring.xml  # 日志配置(Loki 集成)
│   └── test/                # 单元测试
├── docker/                  # Docker 相关配置
│   └── Dockerfile           # 容器化构建脚本(多阶段构建)
├── k8s/                     # K8s 部署配置
│   ├── todo-deployment.yaml    # 应用 Deployment
│   ├── todo-service.yaml       # 应用 Service
│   ├── postgres-statefulset.yaml  # PostgreSQL StatefulSet
│   ├── postgres-service.yaml      # PostgreSQL Service
│   ├── configmap.yaml    # 非敏感配置(K8s 注入)
│   └── secret.yaml       # 敏感配置(数据库密码,K8s Secret)
├── prometheus/            # Prometheus 监控配置
│   └── todolist.yml      # 抓取规则
├── .github/               # GitHub Actions 工作流
│   └── workflows/
│       └── deploy.yml    # CI/CD 自动化流程
└── README.md              # 操作指南

在这里插入图片描述

二、核心功能实现(Spring Boot 后端)

1. 初始化项目(Spring Initializr)
  • 访问 https://start.spring.io/,选择:
    • Project: Maven
    • Language: Java
    • Spring Boot: 3.2.0
    • Dependencies:
      • Spring Web(REST 接口)
      • Spring Data JPA(数据库操作)
      • PostgreSQL Driver(数据库驱动)
      • Micrometer Tracing(可观测性)
      • Actuator(健康检查、指标暴露)
2. 数据库模型(src/main/java/com/example/todo/model/TodoItem.java
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Entity
@Table(name = "todo_items")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TodoItem {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String title;private String description;@Column(columnDefinition = "BOOLEAN DEFAULT FALSE")private boolean completed;
}
3. 数据访问层(src/main/java/com/example/todo/repository/TodoRepository.java
import com.example.todo.model.TodoItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface TodoRepository extends JpaRepository<TodoItem, Long> {
}
4. 业务逻辑层(src/main/java/com/example/todo/service/TodoService.java
import com.example.todo.model.TodoItem;
import com.example.todo.repository.TodoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;@Service
@RequiredArgsConstructor
public class TodoService {private final TodoRepository todoRepository;public TodoItem createTodo(TodoItem todoItem) {return todoRepository.save(todoItem);}public List<TodoItem> getAllTodos() {return todoRepository.findAll();}public TodoItem getTodoById(Long id) {return todoRepository.findById(id).orElseThrow(() -> new RuntimeException("Todo not found with id: " + id));}public TodoItem updateTodo(Long id, TodoItem updatedTodo) {TodoItem existingTodo = getTodoById(id);existingTodo.setTitle(updatedTodo.getTitle());existingTodo.setDescription(updatedTodo.getDescription());existingTodo.setCompleted(updatedTodo.isCompleted());return todoRepository.save(existingTodo);}public void deleteTodo(Long id) {todoRepository.deleteById(id);}
}
5. REST 接口(src/main/java/com/example/todo/controller/TodoController.java
import com.example.todo.model.TodoItem;
import com.example.todo.service.TodoService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/todos")
@RequiredArgsConstructor
public class TodoController {private final TodoService todoService;@PostMapping@ResponseStatus(HttpStatus.CREATED)public TodoItem createTodo(@RequestBody TodoItem todoItem) {return todoService.createTodo(todoItem);}@GetMappingpublic List<TodoItem> getAllTodos() {return todoService.getAllTodos();}@GetMapping("/{id}")public TodoItem getTodoById(@PathVariable Long id) {return todoService.getTodoById(id);}@PutMapping("/{id}")public TodoItem updateTodo(@PathVariable Long id, @RequestBody TodoItem updatedTodo) {return todoService.updateTodo(id, updatedTodo);}@DeleteMapping("/{id}")@ResponseStatus(HttpStatus.NO_CONTENT)public void deleteTodo(@PathVariable Long id) {todoService.deleteTodo(id);}
}
6. 配置外部化(src/main/resources/application.yml
spring:datasource:url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}username: ${POSTGRES_USER}password: ${POSTGRES_PASSWORD}driver-class-name: org.postgresql.Driverjpa:hibernate:ddl-auto: update  # 自动创建表(生产环境建议用 flyway)show-sql: truemanagement:endpoints:web:exposure:include: health, info, metrics, prometheus  # 暴露监控端点endpoint:health:show-details: always

三、容器化(Docker)

docker/Dockerfile(多阶段构建,减小镜像体积)
# 阶段 1:构建 Maven 项目
FROM maven:3.9.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
# 缓存依赖(仅当 pom.xml 变化时重新下载)
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn clean package -DskipTests# 阶段 2:运行 Spring Boot 应用
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 从构建阶段复制 JAR 包
COPY --from=build /app/target/todo-cloudnative-*.jar ./todo.jar
# 暴露 Spring Boot 端口(8080)
EXPOSE 8080
# 启动命令(禁用 Tomcat 优雅关闭,适配 K8s 探针)
CMD ["java", "-jar", "todo.jar", "--server.port=8080"]

在这里插入图片描述

四、Kubernetes 编排(云原生核心)

1. 配置管理(k8s/configmap.yamlk8s/secret.yaml

非敏感配置(ConfigMap,注入数据库名、主机等)

apiVersion: v1
kind: ConfigMap
metadata:name: todo-config
data:POSTGRES_DB: "tododb"POSTGRES_HOST: "postgres-service"  # K8s Service 名称(服务发现)

敏感配置(Secret,注入数据库用户、密码,需 base64 编码)

# 生成 base64 编码(实际生产建议用外部密钥管理系统如 HashiCorp Vault)
echo -n "admin" | base64   # 用户名
echo -n "mypassword" | base64  # 密码
echo -n "5432" | base64    # 端口
apiVersion: v1
kind: Secret
metadata:name: todo-secret
type: Opaque
data:POSTGRES_USER: "YWRtaW4="       # "admin" 的 base64POSTGRES_PASSWORD: "bXlwYXNzd29yZA=="  # "mypassword" 的 base64POSTGRES_PORT: "NTQzNg=="       # "5432" 的 base64
2. PostgreSQL 部署(k8s/postgres-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: postgres
spec:serviceName: postgres-servicereplicas: 1  # 生产环境建议 3 副本 + 主从复制(Patroni)selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:15-alpineenv:- name: POSTGRES_USERvalueFrom:secretKeyRef:name: todo-secretkey: POSTGRES_USER- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: todo-secretkey: POSTGRES_PASSWORD- name: POSTGRES_DBvalueFrom:configMapKeyRef:name: todo-configkey: POSTGRES_DBports:- containerPort: 5432volumeMounts:- name: postgres-datamountPath: /var/lib/postgresql/datavolumeClaimTemplates:  # 持久化存储(云原生存储卷,如 AWS EBS、阿里云盘)- metadata:name: postgres-dataspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi
3. Todo 服务部署(k8s/todo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: todo-deployment
spec:replicas: 2  # 初始副本数(弹性扩缩容基础)selector:matchLabels:app: todotemplate:metadata:labels:app: todospec:containers:- name: todoimage: your-docker-username/todolist:v1  # 替换为实际镜像地址ports:- containerPort: 8080env:- name: POSTGRES_USERvalueFrom:secretKeyRef:name: todo-secretkey: POSTGRES_USER- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: todo-secretkey: POSTGRES_PASSWORD- name: POSTGRES_HOSTvalueFrom:configMapKeyRef:name: todo-configkey: POSTGRES_HOST- name: POSTGRES_PORTvalueFrom:secretKeyRef:name: todo-secretkey: POSTGRES_PORT- name: POSTGRES_DBvalueFrom:configMapKeyRef:name: todo-configkey: POSTGRES_DBlivenessProbe:  # 存活探针(自动重启异常实例)httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:  # 就绪探针(流量路由前检查)httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 5periodSeconds: 5resources:  # 资源限制(K8s 调度依据)requests:cpu: "100m"memory: "256Mi"limits:cpu: "500m"memory: "512Mi"
4. 服务暴露(k8s/todo-service.yamlk8s/todo-ingress.yaml

ClusterIP Service(内部访问)

apiVersion: v1
kind: Service
metadata:name: todo-service
spec:type: ClusterIPselector:app: todoports:- protocol: TCPport: 80targetPort: 8080

Ingress(外部访问,需安装 NGINX Ingress Controller)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: todo-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- http:paths:- path: /todospathType: Prefixbackend:service:name: todo-serviceport:number: 80

在这里插入图片描述

五、CI/CD 自动化(GitHub Actions)

.github/workflows/deploy.yml
name: Deploy to Kuberneteson:push:branches: [ "main" ]jobs:build-and-push:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up JDK 17uses: actions/setup-java@v4with:java-version: '17'distribution: 'temurin'- name: Build with Mavenrun: mvn clean package -DskipTests- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Login to Docker Hubuses: docker/login-action@v3with:username: ${{ secrets.DOCKERHUB_USERNAME }}password: ${{ secrets.DOCKERHUB_TOKEN }}- name: Build and push Docker imageuses: docker/build-push-action@v5with:context: .file: docker/Dockerfilepush: truetags: your-docker-username/todolist:latest,your-docker-username/todolist:${{ github.sha }}deploy-to-k8s:needs: build-and-pushruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up kubectluses: azure/setup-kubectl@v3with:version: 'v1.28.0'- name: Deploy to Kubernetes clusterrun: |# 替换镜像标签为最新提交 SHAsed -i "s|your-docker-username/todolist:v1|your-docker-username/todolist:${{ github.sha }}|g" k8s/todo-deployment.yaml# 应用 K8s 配置kubectl apply -f k8s/env:KUBECONFIG: ${{ secrets.KUBECONFIG }}  # 从 GitHub Secrets 读取集群配置

在这里插入图片描述

六、可观测性配置

1. Prometheus 监控(prometheus/todolist.yml
scrape_configs:- job_name: "todo_service"scrape_interval: 15smetrics_path: "/actuator/prometheus"static_configs:- targets: ["todo-service:80"]  # K8s Service 域名(集群内部可解析)
2. 日志集成(Loki)
  • logback-spring.xml 中配置 Logstash 或直接输出 JSON 格式日志:
    <configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder class="net.logstash.logback.encoder.LogstashEncoder"/></appender><root level="info"><appender-ref ref="CONSOLE"/></root>
    </configuration>
    
  • 使用 Promtail 收集日志并发送到 Loki(需额外部署 Promtail)。
3. Grafana 仪表盘(示例查询)
  • 请求速率rate(http_server_requests_seconds_count{job="todo_service"}[5m])
  • 平均延迟rate(http_server_requests_seconds_sum{job="todo_service"}[5m]) / rate(http_server_requests_seconds_count{job="todo_service"}[5m])
  • JVM 内存使用jvm_memory_used_bytes{area="heap"}

在这里插入图片描述

七、云原生特性验证

1. 容器化
  • 本地构建镜像:docker build -t todolist:v1 -f docker/Dockerfile .
  • 运行测试:docker run -p 8080:8080 todolist:v1,访问 http://localhost:8080/api/todos 验证接口。
2. Kubernetes 部署
  • 本地搭建 K8s 集群(Minikube 或 Kind):minikube start
  • 应用配置:kubectl apply -f k8s/
  • 查看状态:kubectl get pods,svc,ingress
3. 弹性扩缩容
  • 手动扩缩容:kubectl scale deployment/todo-deployment --replicas=3
  • 自动扩缩容(HPA):
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:name: todo-hpa
    spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: todo-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70  # CPU 使用率超 70% 自动扩容
    
4. 故障自愈
  • 手动删除 Pod:kubectl delete pod <pod-name>,观察 K8s 自动重建新 Pod(状态变为 Running)。
5. 持续交付
  • 推送代码到 GitHub main 分支,触发 GitHub Actions 自动构建、测试、部署。

在这里插入图片描述

八、总结

通过这个 TodoList Demo,你可以完整体验云原生应用的核心流程:

  1. 容器化:用 Docker 封装应用,确保环境一致性。
  2. Kubernetes 编排:通过 Deployment、Service 等资源实现自动化管理。
  3. CI/CD:GitHub Actions 实现代码提交到生产的全自动化。
  4. 可观测性:Prometheus + Grafana 监控性能,Loki 收集日志。
  5. 弹性扩缩容:HPA 根据负载自动调整资源,保障高可用。

后续可扩展方向:

  • 微服务拆分(如用户服务、待办服务),用 Istio 实现服务网格。
  • 引入数据库读写分离(主从复制)。
  • 添加认证鉴权(OAuth2、JWT)。
  • 使用 Helm 打包 K8s 配置,简化多环境部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96066.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源一个轻量级 Go 工具库:go-commons

项目背景 在日常 Go 开发中&#xff0c;我们经常需要处理字符串操作和系统监控相关的功能。虽然 Go 标准库提供了基础的字符串处理能力&#xff0c;但在实际项目中&#xff0c;我们往往需要一些更便捷的工具函数来提高开发效率。 基于"尽可能不使用第三方依赖"的原…

clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性

环境&#xff1a;vscodeclangdEIDE开发开发单片机&#xff08;C51 keilMDK IAR&#xff09;。 vscode远程clangdarm-linux-gcc(交叉编译工具链)。 &#xff08;1&#xff09;首先clang&#xff08;clangd&#xff09;是兼容gcc的&#xff0c;也就是兼容arm-linux-gcc&#xff…

Docker 部署 Rancher2.4.4

获取2.4.4镜像包docker pull rancher/rancher:v2.4.4创建目录并赋予权限mkdir -p /home/rancher/{data,log} && chmod -R 777 /home/rancher启动容器docker run -d \ --privileged \ --name rancher \ --restartunless-stopped \ -p 80:80 -p 443:443 \ -v /home/ranc…

无root使用adb模式下的scene 用shizuku激活scene教程

本次教程是用shizuku和ShizukuRunner激活scene的adb模式&#xff0c;实现大部分功能&#xff0c;比较简单&#xff0c;如果手机已经root直接使用root模式即可。 工具 scene(点我下载) Shizuku(点我下载) ShizukuRunner(点我下载) 教程 1.首先要有一台支持无线调试的手机(安…

《UE5_C++多人TPS完整教程》学习笔记50 ——《P51 多人游戏中的俯仰角(Pitch in Multiplayer)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P51 多人游戏中的俯仰角&#xff08;Pitch in Multiplayer&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

树莓派 Ubuntu 24.04 开机换源总结

1. 图形界面 (桌面版) 如果你刷的是 Ubuntu Desktop 24.04&#xff1a;打开 Software & Updates&#xff08;软件和更新&#xff09;。在 Ubuntu Software 标签里找到 Download from 下拉菜单。默认只有 Main server 和 Server for China&#xff0c;如果想要更多选择&…

工业显示器在地铁电力监控与运维中的应用

在地铁电力监控与运维中&#xff0c;工业显示器凭借其高可靠性、环境适应性和强大的功能集成&#xff0c;成为保障地铁供电系统安全稳定运行的核心设备。以下从关键应用场景、技术优势及实际案例三个维度展开分析&#xff1a;一、核心应用场景变配电室与环控电控室监控 工业显示…

Docker 快速部署单节点 NiFi 1.27

Docker 快速部署单节点 NiFi 1.27 前言 Apache NiFi 是一款强大的数据集成工具&#xff0c;专注于数据的采集、处理和分发&#xff0c;具有可视化流程设计、强大的容错能力等特点。通过 Docker 部署可以快速搭建环境&#xff0c;省去复杂的配置步骤。本文介绍如何使用官方镜像…

php redis 中文API文档手册

php redis 中文API文档手册 Redis::__construct构造函数 $redis new Redis();connect, open 链接redis服务 参数 host: string&#xff0c;服务地址 port: int,端口号 timeout: float,链接时长 (可选, 默认为 0 &#xff0c;不限链接时间) 注: 在redis.conf中也有时间&#xf…

Windows环境下实现GitLab与Gitee仓库代码提交隔离

1. 背景 在开发工作中&#xff0c;我需要同时使用2个代码托管平台&#xff1a;公司统一使用的GitLab和个人学习用的 Gitee。我希望能够在同一台电脑上方便地管理和提交两个平台的代码&#xff0c;实现账号和提交内容的有效隔离。 前提条件&#xff1a; 已安装Git Bash、Tort…

深度解析:抗辐射电源芯片 ASP4644S2B 在空间环境中的单粒子效应表现

摘要&#xff1a;随着航天技术的飞速发展&#xff0c;空间电子设备面临着日益复杂和严苛的辐射环境挑战。单粒子效应&#xff08;SEE&#xff09;作为辐射环境对半导体器件影响的主要形式之一&#xff0c;极大地影响着航天电子系统的可靠性和稳定性。本文通过系统梳理国科安芯推…

【RabbitMQ】如何在 Ubuntu 安装 RabbitMQ

1. 安装部署 Erlang 环境 RabbitMQ 是一套开源的消息队列服务软件&#xff0c;基于 Erlang 语言编写的&#xff0c;因此&#xff0c;在安装 RabbitMQ 之前&#xff0c;我们需要先部署 Erlang 环境&#xff0c;再安装 RabbitMQ 环境&#xff08;就像运行 Java 程序&#xff0c;…

vue集成高德地图API工具类封装

import axios, { AxiosInstance, AxiosResponse } from axios;// 高德地图 API 响应基础结构 interface AMapResponse {status: string;info: string;infocode: string; }// 逆地理编码响应结构 interface RegeoResponse extends AMapResponse {regeocode: {formatted_address:…

手写 Tomcat

文章目录02 初出茅庐:构造一个极简的 HttpServerRequestResponseHttpServer03 动态 Response : 按照规范构造返回流04 各司其职的 Server : 拆分响应模块与处理模块HttpConnectorHttpProcessor05 Server 性能提升: 设计多个 ProcessorHttpConnectorHttpProcessor06 规范化: 引入…

嵌入式ARM架构学习3——启动代码

一 汇编补充&#xff1a;area reset, code, readonlycode32entry;mov r0, #4 ; r0 4;mov r1, r0 ; r1 r0;mov r2, r1, lsl #1 ;r2 r1 << 1 乘2;mov r3, r1, lsr #1 ;r3 r1 >> 1 除2;mov r4, r1, ror #2;mov r0, #100 ;100是十进制 转为16进制赋值给十进制;mov …

PNPM库离线安装方案

以下是几种可行的方案&#xff0c;推荐优先使用方案一。 方案一&#xff1a;使用离线镜像&#xff08;Offline Mirror&#xff09; - 最优雅、最PNPM的方式 这是 PNPM 官方推荐的处理离线环境的方式。它会在内网电脑上创建一个所有依赖包的压缩文件&#xff08;tarball&#x…

[Wit]CnOCR模型训练全流程简化记录(包括排除BUG)

stepfile:step 00 创建数据集 目录结构 yourproject -data --myset ---images #存放训练图片 ---dev.tsv #测试标签 tsv格式 图片文件名\t内容 ---train.tsv #训练标签 tsv格式 图片文件名\t内容 -train_config.json -train_config_gpu.json -fix_cnocr_encoding.py step 01 创…

Sklearn(机器学习)实战:鸢尾花数据集处理技巧

1.数据集的使用&#xff1a;先使用load导入鸢尾花数据&#xff1a;from sklearn.datasets import load_iris然后定义一个函数来查看鸢尾花数据集&#xff1a;数据集的获取&#xff1a;iris load_iris()print(鸢尾花的数据集&#xff1a;\n,iris)使用iris[DESCR]来查看数据及里…

【企业微信】接口报错:javax.net.ssl.SSLHandshakeException

详细报错信息 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target原因 关于qyapi…

光子芯片驱动的胰腺癌早期检测:基于光学子空间神经网络的高效分割方法

光子芯片驱动的胰腺癌早期检测:基于光学子空间神经网络的高效分割方法 1 论文核心概念 本文提出了一种基于集成光子芯片的光学子空间神经网络(Optical Subspace Neural Network, OSNN),用于胰腺癌的早期检测与图像分割。其核心思想是利用光子芯片的高并行性、低延迟和低能…