分类 后端 下的文章 - CorePlayers
首页
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
搜 索
1
2026技术架构新趋势:从微服务回调到AI原生架构设计
45 阅读
2
DDD领域驱动设计:从底层原理到生产级全链路落地实战
41 阅读
3
Go + 云原生2026:从微服务到AI Infra的实战架构
35 阅读
4
事件驱动架构(EDA):从理论到项目落地的完整实践
34 阅读
5
2026 AI编程范式演进:从Vibe Coding到Spec-Driven Development再到Harness Engineering
31 阅读
ALL
(78)
AI
(20)
前端
(24)
后端
(23)
Dify/Coze
(7)
架构设计
(6)
登录
/
注册
搜 索
标签搜索
AI Agent
边缘计算
RSC
虚拟线程
Java
Spring Boot 4
Vibe Coding
AI原生
SDD
全栈开发
高并发
Project Loom
性能优化
2026趋势
协议标准
工具调用
MCP协议
多Agent协作
CrewAI
Spring AI
EthanCcc
累计撰写
78
篇文章
累计收到
1
条评论
首页
栏目
ALL
AI
前端
后端
Dify/Coze
架构设计
页面
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
用户登录
登录
注册
后端
2025-08-15
Prometheus + Grafana 全链路监控:从网关到数据库的可观测性体系
可观测性(Observability)是现代分布式系统的"眼睛"。没有它,你就像在黑暗中开飞机——只有当坠毁时才知道出了问题。本文将构建一个从网关到数据库的完整可观测性体系。可观测性的三大支柱 支柱核心问题工具 Metrics系统是否健康?QPS 是多少?Prometheus + Grafana Tracing一个请求经过了哪些服务?哪里慢了?Micrometer Tracing + Zipkin/ARMS Logging具体发生了什么错误?SLS / ELK Spring Boot 3 Micrometer 集成management: endpoints: web: exposure: include: health,info,prometheus,metrics metrics: tags: application: $ export: prometheus: enabled: true tracing: sampling: probability: 1.0 # 开发 100%,生产 0.1 propagation: type: w3c自定义业务指标@RestController public class OrderController { private final Counter orderCounter; private final Timer orderTimer; public OrderController(MeterRegistry meterRegistry) { this.orderCounter = Counter.builder("orders.created.total") .description("Total orders created") .register(meterRegistry); this.orderTimer = Timer.builder("orders.create.duration") .description("Order creation duration") .register(meterRegistry); } @PostMapping("/orders") public Result createOrder(@RequestBody OrderDTO dto) { return orderTimer.record(() -> { Order order = orderService.create(dto); orderCounter.increment(); return Result.success(order); }); } }Prometheus 配置# prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: 'spring-boot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['backend:8080'] - job_name: 'mysql' static_configs: - targets: ['mysql-exporter:9104'] - job_name: 'redis' static_configs: - targets: ['redis-exporter:9121']Grafana 告警规则# alerts.yml groups: - name: spring-boot-alerts rules: - alert: HighErrorRate expr: rate(http_server_requests_seconds_count[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "错误率超过 5%" - alert: JvmHeapUsage expr: sum(jvm_memory_used_bytes) / sum(jvm_memory_max_bytes) > 0.85 for: 5m labels: severity: warning annotations: summary: "JVM 堆内存使用超过 85%"JVM 诊断大盘关键指标需要重点监控:堆内存使用率(超过 85% 需排查内存泄漏)、GC 暂停时间(P99 应 < 100ms)、线程数(突增可能是线程泄漏)、类加载数(持续增长提示动态代理滥用)。GC 调优决策树低延迟(< 10ms):ZGC。吞吐量优先:Parallel GC。内存受限:Serial GC。通用场景:G1 GC(JDK 9+ 默认)。# 生产 JVM 参数推荐 -XX:+UseZGC -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof阿里云 ARMS 集成ARMS 优势:开箱即用的应用拓扑图、基于历史基线的智能告警、代码级诊断直接定位到慢调用行。Spring Boot 只需添加一个 starter,ARMS Agent 自动完成探针注入。总结可观测性不是一套工具,而是一种能力。构建这个能力的关键是"三个一":一个 Metrics 仪表盘看到全局健康、一个 Tracing ID 串联整个调用链、一个日志平台搜索所有上下文。
2025年08月15日
11
0
1
2025-07-28
GraphQL vs REST vs gRPC:2025 API 设计选型终极指南
API 设计风格的选择直接影响着系统的可维护性、性能和开发效率。在 2025 年,GraphQL、REST 和 gRPC 三足鼎立,每种风格都有其不可替代的场景。本文将基于真实项目的对比数据,给出科学的选型建议。三者的核心差异维度RESTGraphQLgRPC数据获取多端点,可能过度获取单端点,精确获取所需字段单服务,Protobuf 定义精确性能HTTP/1.1 为主,支持 HTTP/2通常通过 HTTP 传输HTTP/2 多路复用,性能最优类型安全需额外工具(OpenAPI)内建强类型 SchemaProtobuf 强制强类型缓存HTTP 缓存天然支持需额外配置(Persisted Queries)客户端缓存为主学习成本低中等较高选型决策矩阵选择 REST 的场景:公共 API、需要 HTTP 缓存(CDN)、团队对 HTTP 规范熟悉、后端资源导向的数据模型。REST 永远不会过时,它在简单性和成熟度上的优势无可替代。选择 GraphQL 的场景:前端驱动的开发模式、需要聚合多个数据源、移动端需要精确控制传输数据量、复杂嵌套数据查询。GraphQL 的"按需获取"能力在移动端尤其有价值。选择 gRPC 的场景:微服务间的高频通信、实时数据流(双向流)、多语言异构系统、对延迟要求极高的场景。在我们的基准测试中,gRPC 的吞吐量是 REST(JSON)的 7 倍,是 GraphQL 的 11 倍。混合架构实践许多现代系统采用"外部 REST/GraphQL + 内部 gRPC"的混合架构。例如,使用 GraphQL 作为 BFF(Backend for Frontend)层对外暴露,而 BFF 层通过 gRPC 与内部微服务通信。这种架构兼顾了前端的灵活性和内部通信的高性能。
2025年07月28日
11
0
1
2025-07-20
现代化部署实战:Docker 容器化、Nginx 反向代理与 Serverless 快速上线
从写好代码到上线运行,中间隔着一道"部署"的鸿沟。本文将串联 Docker 容器化、Nginx 反向代理和 Serverless 平台部署,形成一条完整的现代化部署链路。Dockerfile 最佳实践:多阶段构建# 阶段 1:构建阶段 FROM maven:3.9-eclipse-temurin-21 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline -B # 利用 Docker 缓存层 COPY src ./src RUN mvn package -DskipTests -B # 阶段 2:运行阶段(更小的镜像) FROM eclipse-temurin:21-jre-alpine RUN apk add --no-cache curl # 健康检查工具 WORKDIR /app COPY --from=builder /app/target/*.jar app.jar RUN addgroup -S app && adduser -S app -G app USER app EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1 ENTRYPOINT ["java", "-jar", "app.jar"]多阶段构建的好处:最终镜像只包含 JRE 和 JAR(约 200MB),而非带 Maven 和源码的构建环境(1GB+)。分层缓存——pom.xml 单独 COPY,依赖下载被缓存,代码改动时无需重新下载依赖。Docker Compose 本地编排# docker-compose.yml services: nginx: image: nginx:alpine ports: ["80:80", "443:443"] volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: [backend] backend: build: . environment: - SPRING_PROFILES_ACTIVE=docker depends_on: [mysql, redis] mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: myblog volumes: [mysql_data:/var/lib/mysql] redis: image: redis:7-alpine volumes: [redis_data:/data] volumes: mysql_data: redis_data:Nginx 反向代理:核心配置# nginx.conf upstream backend { server backend1:8080 weight=3; server backend2:8080 weight=1; keepalive 32; } server { listen 80; server_name blog.example.com; return 301 https://$host$request_uri; # HTTP 强制跳转 HTTPS } server { listen 443 ssl http2; server_name blog.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 安全头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; # API 代理 location /api/ { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态资源(Nginx 直接处理,不经过后端) location /static/ { root /var/www/html; expires 30d; add_header Cache-Control "public, immutable"; } }Serverless 平台快速上线# 阿里云 Serverless 应用引擎(SAE)配置 edition: 3.0.0 name: my-app resources: backend: component: aliyun_sae props: namespace_id: cn-hangzhou:prod app_name: my-backend cpu: 2 memory: 4 replicas: 3 package: type: image image: registry.cn-hangzhou.aliyuncs.com/myapp/backend:latest sls_conf: enable: true auto_config: trueServerless vs 传统部署:消除服务器运维、按需付费、弹性伸缩秒级扩容。总结Docker 解决了"环境一致性"问题,Nginx 解决了"流量入口"问题,Serverless 解决了"运维效率"问题。三者结合:Dockerfile 定义环境 → Docker Compose 本地编排 → CI/CD 自动构建镜像 → Serverless 平台一键部署。
2025年07月20日
10
0
1
2025-07-05
RESTful API 设计规范与 Token 认证授权体系实战
一个好的 API 设计能让前后端协作事半功倍,而一个糟糕的 API 设计则会让整个团队陷入无尽的沟通和返工中。本文将系统梳理 RESTful API 的设计规范、版本管理策略和 Token 认证授权体系。RESTful API 的核心原则1. 用名词而非动词表示资源// 正确:资源导向\nGET /api/users # 获取用户列表\nGET /api/users/123 # 获取单个用户\nPOST /api/users # 创建用户\nPUT /api/users/123 # 完整更新用户\nPATCH /api/users/123 # 部分更新用户\nDELETE /api/users/123 # 删除用户\n\n// 错误:动作导向(RPC 风格)\nGET /api/getUsers\nPOST /api/createUser\nPOST /api/deleteUser2. 利用 HTTP 方法表达操作语义方法语义幂等性安全性GET获取资源是是POST创建资源否否PUT完整替换是否PATCH部分更新否否DELETE删除资源是否3. 子资源嵌套GET /api/users/123/orders # 用户 123 的订单列表\nGET /api/users/123/orders/456 # 用户 123 的订单 456\nPOST /api/users/123/orders # 为用户 123 创建订单4. 查询参数:过滤、排序、分页GET /api/users?status=active&page=2&size=20&sort=createdAt,desc&search=john统一响应格式设计// 成功响应\n,\n "timestamp": 1751700000000\n}\n\n// 分页响应\n\n}\n\n// 错误响应\nHTTP 状态码的语义化使用200 OK # GET/PUT 成功\n201 Created # POST 创建成功(配合 Location 头返回新资源 URL)\n204 No Content # DELETE 成功,无返回内容\n400 Bad Request # 请求参数错误\n401 Unauthorized # 未认证(未登录或 Token 无效)\n403 Forbidden # 已认证但无权限\n404 Not Found # 资源不存在\n409 Conflict # 资源冲突(如用户名已存在)\n422 Unprocessable # 请求格式正确但语义错误\n429 Too Many # 频率限制\n500 Internal Error # 服务器内部错误API 版本管理策略方案对比方案示例优点缺点URL 路径/api/v1/users直观、易缓存URL 变化请求头Accept: vnd.example.v1+jsonURL 不变不直观、难调试查询参数/api/users?version=1容易切换污染 URL推荐:URL 路径版本——最直观,对前端最友好。Token 认证授权体系OAuth 2.0 的四种授权模式授权码模式(Authorization Code):最安全,适合有后端的 Web 应用。用户重定向到认证服务器 → 获取授权码 → 用授权码换取 Token。密码模式(Resource Owner Password):用户直接提供用户名密码换取 Token。仅适用于高度信任的第一方应用。客户端凭证模式(Client Credentials):服务间调用。用 client_id + client_secret 换取 Token。隐式模式(Implicit):已废弃,不再推荐。RBAC(基于角色的访问控制)实践// SpringBoot 方法级权限控制\n@RestController\n@RequestMapping("/api/admin")\npublic class AdminController \n\n @PreAuthorize("hasAnyRole('ADMIN', 'MANAGER')")\n @PutMapping("/users/")\n public Result updateUser(@PathVariable Long id) \n\n @PreAuthorize("@permissionService.canDeleteUser(#id)")\n @DeleteMapping("/users/")\n public Result deleteUser(@PathVariable Long id) \n}Token 刷新策略(生产环境关键)// 双 Token 机制\nPOST /api/auth/login\n// 返回:\n\n\n// 无感刷新\nPOST /api/auth/refresh\nBody: \n// 返回新的 accessToken(refreshToken 可以同时轮换)API 安全最佳实践HTTPS 强制:所有 API 通信必须走 HTTPS,防止中间人攻击。请求频率限制(Rate Limiting):防止暴力破解和 DDoS 攻击。输入校验:永远不信任客户端输入,服务端必须进行严格的参数校验。敏感数据脱敏:密码、身份证号等敏感数据在日志和响应中脱敏。CORS 白名单:只允许可信域名的跨域请求。SQL 注入防护:使用参数化查询(MyBatis # 而非 $)。总结RESTful API 设计的核心不在于是否严格遵循了所有规范,而在于一致性——整个项目的 API 应该有统一的命名风格、统一的响应格式、统一的错误处理。一个"不那么 RESTful 但完全一致"的 API 远比一个"部分 RESTful 部分混乱"的 API 更好维护。
2025年07月05日
11
0
1
2025-06-10
Redis 7.4 新数据结构与高并发缓存策略深度优化
Redis 7.4 作为 2025 年的主力版本,带来了多项对企业级缓存架构有深远影响的新特性。本文将从新数据结构入手,探讨在高并发场景下的缓存策略优化方案。Redis 7.4 新数据结构1. JSON 类型正式版:RedisJSON 从模块进化为内置数据类型。支持 JSONPath 查询和原子级部分更新,性能比存储序列化的 JSON 字符串提升 3-8 倍,尤其在只修改 JSON 对象的一个字段时优势巨大。JSON.SET user:1001 $.name "张三" JSON.GET user:1001 $.address.city JSON.ARRAPPEND user:1001 $.tags '\"redis\"'2. 改进的 Stream 消费者组:支持消费者组间的消息广播模式,一个消息可以被多个组独立消费,适合多系统联动场景。3. 向量搜索(预览):内置的向量相似度搜索支持 ITEM、L2、COSINE 三种距离度量,为 AI 应用的轻量级语义缓存提供了新的可能。高并发缓存策略优化缓存穿透:使用 Redis 7.4 的 SET 命令新增的 NX 和 EXAT 组合,结合布隆过滤器实现零穿透缓存。对于不存在的数据,缓存空值 60 秒,防止数据库被击穿。缓存雪崩:采用随机过期时间(TTL ± 20% 随机偏移),避免大量 key 同时过期。Redis 7.4 的 EXPIRE 命令支持批量设置和随机偏移,一改之前只能逐个设置的限制。热点缓存:对于那些 QPS 极高的热点 key,使用 Redis Cluster 的哈希标签(Hash Tag)确保热点数据分散在多个节点上,配合客户端本地缓存(如 Caffeine)形成两级缓存架构。
2025年06月10日
11
0
1
1
2
3
4
5