Podinfo:云原生微服务样板间,从部署到集成的完整实践指南

news2026/4/29 3:43:43
1. 项目概述为什么我们需要一个“样板间”微服务在云原生和微服务架构成为主流的今天无论是初创团队还是大型企业启动一个新服务时都面临一个共同问题如何快速搭建一个符合生产环境标准的“样板间”这个样板间需要集成健康检查、优雅关闭、配置管理、监控、日志、安全扫描等一系列最佳实践。从头开始搭建不仅耗时费力而且容易遗漏关键环节导致服务在后期暴露出稳定性、可观测性或安全性问题。stefanprodan/podinfo正是为解决这个问题而生。它不是一个功能复杂的业务应用而是一个用 Go 语言编写的、极简的 Web 应用。它的核心价值在于作为一个“活的”最佳实践示例展示了如何在 Kubernetes 环境中构建和运行一个符合云原生理念的微服务。CNCF 旗下的知名项目如 Flux 和 Flagger 都使用它进行端到端测试和教学这本身就证明了其设计的权威性和实用性。对于开发者而言podinfo 是一个绝佳的学习模板和测试工具。你可以直接部署它观察一个生产就绪的服务应该具备哪些接口、如何配置、如何与周边系统如 Prometheus, Redis交互。对于平台工程师或 SRE它是一个可靠的**“探针”或“测试负载”**用于验证集群的网络策略、Ingress 控制器、服务网格如 Linkerd、Istio或 GitOps 流水线如 Flux是否工作正常。简单来说如果你在学习和实践 Kubernetes、微服务、GitOps 或可观测性podinfo 是一个你绕不开的、高质量的参考实现。接下来我将带你深入拆解这个项目从设计理念到实操部署分享我在使用过程中积累的经验和踩过的坑。2. 核心架构与设计理念拆解podinfo 虽然功能简单但其架构设计却处处体现了云原生应用的“十二要素”原则和工程化思想。理解这些设计比单纯学会部署更有价值。2.1 面向失败的设计健壮性如何构建微服务在分布式环境中运行网络抖动、依赖服务不可用、资源不足等情况是常态。podinfo 通过多种机制来确保服务的健壮性。健康检查探针这是 Kubernetes 管理 Pod 生命周期的基石。podinfo 提供了/healthz存活探针和/readyz就绪探针两个端点。这里有一个关键区别/readyz可以通过POST /readyz/disable手动置为失败状态。这个设计非常巧妙常用于优雅下线场景。在滚动更新或缩容时你可以先调用此接口告知负载均衡器停止向该实例引流等待现有请求处理完毕后再终止容器从而实现零中断部署。优雅关闭当 Pod 收到终止信号如 SIGTERM时podinfo 会启动一个“宽限期”。在此期间它停止接收新请求但会继续处理已接收的请求并完成必要的清理工作如关闭数据库连接、刷新日志。这是避免强制终止导致请求失败和数据不一致的关键。故障注入podinfo 内置了故障注入功能例如GET /delay/{seconds}可以模拟网络延迟GET /panic可以主动让进程崩溃。这在测试服务网格的弹性能力如超时、重试、熔断或监控告警链路时极其有用。你可以通过配置让 podinfo 随机返回错误或增加延迟从而观察上游服务或基础设施的应对表现。2.2 可观测性三板斧日志、指标、追踪一个“黑盒”服务是运维的噩梦。podinfo 在可观测性方面做了完整集成。结构化日志项目使用了 Uber 开源的zap日志库。与传统的文本日志不同结构化日志通常是 JSON 格式包含了明确的字段如时间戳、日志级别、调用链 TraceID、消息体等。这使得日志可以被日志收集系统如 Loki, Elasticsearch高效地索引和查询。例如你可以轻松筛选出所有错误级别的日志或者追踪某个用户请求的完整生命周期。指标暴露podinfo 自动集成了Prometheus客户端库。访问/metrics端点你会看到丰富的指标包括 HTTP 请求的持续时间、状态码计数、Go 协程数量、内存使用情况等。这些指标是构建监控仪表盘和告警规则的基础。通过 Prometheus 抓取这些指标你可以清晰地了解服务的吞吐量、延迟和错误率。分布式追踪项目支持OpenTelemetry这是云原生领域追踪事实上的标准。当服务接收到一个带有特定 TraceID 的请求时它可以将本地的处理过程span上报到追踪后端如 Jaeger。这对于理解跨多个微服务的复杂调用链的性能瓶颈至关重要。虽然 podinfo 自身逻辑简单但它为集成追踪提供了标准的接入点。2.3 配置与密钥管理遵循十二要素“十二要素应用”强调将配置存储在环境中。podinfo 使用Viper库来管理配置它支持从环境变量、配置文件、命令行参数等多种来源读取配置并具有优先级顺序。更值得关注的是它对 KubernetesConfigMap 和 Secret的动态加载支持。当你将 ConfigMap 或 Secret 以卷的形式挂载到 Pod 的/config目录下时podinfo 会启动一个文件监视器。一旦这些文件内容发生变化podinfo 能够热重载新的配置而无需重启容器。这通过GET /configs接口可以验证。这个特性对于需要频繁更新配置如功能开关的场景非常友好。2.4 安全与软件供应链现代软件交付越来越关注供应链安全。podinfo 的 CI/CD 流水线集成了多项前沿的安全实践容器镜像签名与验证使用Sigstore Cosign对发布的容器镜像进行数字签名。这可以确保你拉取的镜像确实来自可信的发布者没有被篡改。在部署敏感应用时集群可以配置策略只允许运行经过签名的镜像。软件物料清单每个 podinfo 镜像都嵌入了SBOM。SBOM 就像一份“成分表”列出了镜像中包含的所有软件包及其版本。当出现新的漏洞时你可以快速扫描 SBOM 来判断自己的服务是否受影响。漏洞扫描在构建阶段使用govulncheck对 Go 模块进行漏洞扫描。这属于“左移”的安全实践将安全问题尽可能在开发早期发现和修复。SLSA 溯源项目提供了构建过程的溯源信息记录了谁、在什么时间、用什么工具和源码生成了这个制品增强了构建流程的透明度和可信度。这些特性使得 podinfo 不仅是一个应用示例也是一个现代、安全的软件交付流程的示范。3. 多维度部署实操全指南podinfo 提供了 Timoni、Helm、Kustomize 和 Docker 四种部署方式覆盖了从简单测试到生产级管理的不同场景。我将逐一详解其用法和适用场景。3.1 使用 Timoni 部署体验新一代的包管理Timoni 是一个新兴的、基于 CUE 语言的 Kubernetes 应用打包和部署工具。它强调类型安全、可复用性和声明式配置。如果你对 Helm 的模板复杂性感到头疼Timoni 提供了一个更优雅的选择。安装 Timoni CLI# 通过 Homebrew (macOS/Linux) brew tap timoni.sh/timoni brew install timoni # 或通过脚本安装 curl -sSL https://timoni.sh/install.sh | bash部署 podinfo 部署命令极其简洁体现了 Timoni 的“模块”思想。# 在 default 命名空间中部署 podinfo 模块 timoni -n default apply podinfo oci://ghcr.io/stefanprodan/modules/podinfo这条命令做了以下几件事从 OCI 仓库ghcr.io拉取名为podinfo的模块。在default命名空间中创建所有必要的 Kubernetes 资源Deployment, Service 等。apply命令是声明式的如果资源已存在则会进行更新。Timoni 的核心优势类型安全CUE 语言能在部署前验证配置值的类型和有效性避免因拼写错误或类型不匹配导致的运行时错误。无模板化不同于 Helm 的 Go TemplateCUE 通过定义和约束来生成最终配置逻辑更清晰。可组合性模块可以轻松组合和覆盖值非常适合管理多环境配置。实操心得Timoni 目前生态还在成长中但对于追求配置优雅和类型安全的团队来说它是一个非常值得关注的方向。用它来部署像 podinfo 这样的标准化应用能让你快速感受到其魅力。对于复杂的、有大量自定义需求的老项目迁移成本可能较高。3.2 使用 Helm 部署生产环境的主流选择Helm 是 Kubernetes 的“包管理器”拥有最庞大的图表生态。podinfo 的 Helm Chart 功能非常完善。添加仓库并部署# 添加 podinfo 的 Helm 仓库 helm repo add podinfo https://stefanprodan.github.io/podinfo helm repo update # 部署一个名为 frontend 的 release并连接到一个后端服务 helm upgrade --install --wait frontend \ --namespace test \ --set replicaCount2 \ --set backendhttp://backend-podinfo:9898/echo \ podinfo/podinfo这个例子部署了一个前端实例它通过backend参数配置了后端服务的地址演示了服务间通信。测试部署Helm Chart 甚至包含了测试钩子helm test用于验证部署是否成功。helm test frontend --namespace test如果测试通过你会看到 Pod 执行了预定义的测试命令并成功退出。使用 OCI 仓库除了传统的 Chart 仓库Helm 也支持直接从 OCI 仓库拉取。helm upgrade --install --wait podinfo --namespace default \ oci://ghcr.io/stefanprodan/charts/podinfoOCI 正逐渐成为云原生制品的标准存储格式。高级配置示例创建一个values.yaml文件进行复杂配置。# custom-values.yaml replicaCount: 3 image: repository: ghcr.io/stefanprodan/podinfo tag: 6.3.0 # 指定特定版本 pullPolicy: IfNotPresent service: type: LoadBalancer # 如果云提供商支持可以创建外部负载均衡器 port: 9898 resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi redis: enabled: true # 启用内置的 Redis用于 /cache 接口 architecture: standalone hpa: enabled: true # 启用水平自动扩缩容 minReplicas: 2 maxReplicas: 10 targetCPUUtilizationPercentage: 80使用自定义配置安装helm upgrade --install podinfo -n default -f custom-values.yaml podinfo/podinfo注意事项使用--set参数虽然方便但在管理多个或复杂配置时容易出错且难以版本化。强烈建议将生产环境的配置保存在values.yaml文件中并纳入版本控制系统如 Git。--set仅用于临时覆盖或简单测试。3.3 使用 Kustomize 部署声明式与纯 YAML 的拥护者Kustomize 通过“叠加”的方式管理 Kubernetes YAML 文件无需模板引擎是 GitOps 工作流中的常客。一键部署kubectl apply -k github.com/stefanprodan/podinfo//kustomize这条命令会应用项目kustomize目录下的基础配置。理解 Kustomize 结构查看项目中的kustomize/目录你会发现它通常包含base/定义所有通用的资源如 Deployment, Service。overlays/包含针对不同环境如 dev, staging, prod的差异化配置。dev/可能使用低资源限制。prod/可能增加副本数、资源限制和网络策略。创建自己的 Overlay 如果你想自定义可以本地初始化一个 Kustomization# 1. 获取基础配置 mkdir -p my-podinfo/base cd my-podinfo kustomize create --autodetect --recursive github.com/stefanprodan/podinfo//kustomize/base # 2. 创建生产环境覆盖层 mkdir -p overlays/prod cd overlays/prod # 3. 创建 kustomization.yaml cat kustomization.yaml EOF apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: prod resources: - ../../base patchesStrategicMerge: - deployment-patch.yaml images: - name: ghcr.io/stefanprodan/podinfo newTag: 6.3.0 EOF # 4. 创建修改副本数的补丁文件 cat deployment-patch.yaml EOF apiVersion: apps/v1 kind: Deployment metadata: name: podinfo spec: replicas: 3 EOF # 5. 应用生产配置 kubectl apply -k .这种方式保持了 YAML 的纯粹性所有修改都通过声明式的补丁完成非常适合与 Git 集成。3.4 使用 Docker 快速运行本地开发与测试对于快速验证或本地开发直接使用 Docker 是最简单的。docker run -dp 9898:9898 stefanprodan/podinfo访问http://localhost:9898即可看到 podinfo 的 Web 界面。你可以用它来快速测试 API或者作为其他服务如 API 网关、服务网格的测试上游。四种方式对比与选型建议工具核心思想优点缺点适用场景Timoni类型安全的模块化部署配置安全无模板声明式强生态较新学习曲线陡追求配置优雅和安全的新项目技术探索Helm包管理与模板化生态极其丰富社区支持好功能强大模板复杂调试困难tpl函数可能引入安全风险生产环境主流选择需要利用丰富社区图表Kustomize纯 YAML 叠加简单直观无需学习新模板语言原生集成于kubectl跨项目复用配置较麻烦处理复杂变量能力弱GitOps 流水线偏好声明式、讨厌模板的团队Docker容器运行时极其简单快速零依赖无法管理 Kubernetes 资源关系本地快速测试、功能验证4. 深入 API 与集成测试实战podinfo 的 Web 和 gRPC API 设计精巧几乎涵盖了微服务测试的各个方面。让我们将其作为一个真实的测试工具来使用。4.1 Web API 功能测试与场景模拟部署好 podinfo 后我们可以通过其 API 模拟各种测试场景。基础服务发现与状态检查# 获取服务基本信息 curl http://podinfo-service:9898/ # 获取版本信息常用于滚动更新后验证 curl http://podinfo-service:9898/version # 手动触发就绪探针失败模拟服务下线 curl -X POST http://podinfo-service:9898/readyz/disable # 此时检查就绪探针应返回非200状态 curl -I http://podinfo-service:9898/readyz # 重新启用 curl -X POST http://podinfo-service:9898/readyz/enable故障注入测试# 模拟网络延迟测试上游服务的超时和重试策略 # 这个请求会等待5秒才返回 curl http://podinfo-service:9898/delay/5 # 模拟服务内部错误返回500状态码 curl http://podinfo-service:9898/status/500 # 模拟服务崩溃谨慎使用会导致Pod重启 curl http://podinfo-service:9898/panic有状态操作测试需启用Redis 如果部署时启用了 Redis--set redis.enabledtrue可以测试缓存接口。# 写入缓存 curl -X POST -d Hello, Redis! http://podinfo-service:9898/cache/mykey # 读取缓存 curl http://podinfo-service:9898/cache/mykey # 删除缓存 curl -X DELETE http://podinfo-service:9898/cache/mykeyJWT令牌颁发与验证# 颁发一个有效期为1分钟的JWT令牌 TOKEN$(curl -sd anon http://podinfo-service:9898/token | jq -r .token) echo $TOKEN # 使用该令牌访问受保护的端点示例 curl -H Authorization: Bearer $TOKEN http://podinfo-service:9898/token/validate # 成功会返回 {status:valid}4.2 gRPC API 测试podinfo 同样提供了 gRPC 服务这对于测试服务网格的 gRPC 流量管理能力非常重要。首先需要获取 gRPC 服务的端口。通常 Service 会暴露两个端口一个用于 HTTP9898一个用于 gRPC9999。可以使用grpcurl工具进行测试。# 安装 grpcurl go install github.com/fullstorydev/grpcurl/cmd/grpcurllatest # 列出服务 grpcurl -plaintext podinfo-service:9999 list # 调用 Echo 服务 grpcurl -plaintext -d {message: Hello gRPC} podinfo-service:9999 grpc.EchoService/Echo # 调用健康检查服务 grpcurl -plaintext podinfo-service:9999 grpc.health.v1.Health/Check4.3 作为端到端测试的负载这是 podinfo 被 Flux/Flagger 项目使用的核心场景。在 CI/CD 流水线中你可以这样使用它部署测试应用在测试集群中部署 podinfo。配置测试工具让你的测试工具如 Postman 集合、JUnit 测试套件指向 podinfo 的 Service。模拟用户流量通过脚本循环调用 podinfo 的各种 API生成模拟流量。验证基础设施监控系统检查 Prometheus 是否成功抓取到/metrics的数据。日志系统检查 Fluentd 或 Loki 是否收集到了结构化日志。追踪系统发起一个带头的请求检查 Jaeger 中是否生成了追踪链路。服务网格配置 Istio/Linkerd 的流量规则观察 podinfo 的流量是否按预期路由。集成到 GitOps 流程使用 Flux 部署 podinfo修改其配置如镜像版本观察 Flux 是否能自动同步并完成滚动更新同时监控整个更新过程是否平滑。实操心得将 podinfo 作为端到端测试的固定负载其价值在于稳定性。它的行为是确定性的排除了业务逻辑复杂性带来的干扰让你能专注于测试平台层和基础设施本身的能力。在搭建新的 Kubernetes 集群或验证新的服务网格功能时我总会先部署一个 podinfo 来“探路”。5. 进阶与 GitOps 工具 Flux 的深度集成podinfo 的官方文档重点介绍了与 Flux 的集成这为我们提供了一个完整的 GitOps 实战范例。GitOps 的核心是以 Git 作为声明式基础设施和应用的唯一事实来源。5.1 搭建完整的 GitOps 交付流水线假设我们有一个 Git 仓库gitgithub.com:myorg/infrastructure.git用来管理集群配置。1. 在集群中安装 Fluxbrew install fluxcd/tap/flux flux install --componentssource-controller,kustomize-controller,helm-controller,notification-controller这条命令会在集群的flux-system命名空间下安装 Flux 的核心控制器。2. 引导配置到 Git 这是最关键的一步将当前集群的管理权“交给”Git。flux bootstrap github \ --ownermyorg \ --repositoryinfrastructure \ --branchmain \ --path./clusters/my-cluster \ --personal执行后Flux 会在你的仓库clusters/my-cluster目录下生成一套初始配置并自动在集群中应用它们实现自我管理。3. 添加 podinfo 的 Helm 仓库源 在 Git 仓库中创建文件clusters/my-cluster/apps/podinfo/source.yamlapiVersion: source.toolkit.fluxcd.io/v1beta2 kind: HelmRepository metadata: name: podinfo namespace: flux-system spec: interval: 10m # 每10分钟同步一次 url: https://stefanprodan.github.io/podinfo提交并推送后Flux 会监控这个 Helm 仓库的更新。4. 定义 podinfo 的 HelmRelease 创建文件clusters/my-cluster/apps/podinfo/release.yamlapiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: podinfo namespace: default spec: interval: 5m # 每5分钟协调一次Release状态 chart: spec: chart: podinfo version: 6.x # 使用6.x系列的最新版本 sourceRef: kind: HelmRepository name: podinfo namespace: flux-system values: replicaCount: 2 resources: requests: cpu: 100m memory: 64Mi limits: memory: 256Mi hpa: enabled: true minReplicas: 2 maxReplicas: 5 targetCPUUtilizationPercentage: 80这个HelmRelease资源告诉 Flux请在default命名空间使用podinfo仓库中podinfo图表6.x版本的最新版并用我提供的values进行部署每5分钟检查一次是否与期望状态一致。5. 让 Flux 接管 提交这些 YAML 文件到 Git 仓库的main分支。Flux 会检测到变化并自动在集群中创建或更新对应的资源。你可以通过以下命令观察状态flux get sources helm # 查看仓库同步状态 flux get helmreleases # 查看发布状态 kubectl get pods -n default -l apppodinfo # 查看Pod运行状态5.2 GitOps 工作流的威力一旦上述流水线建立日常的应用升级就变得非常简单和安全升级版本只需修改release.yaml中的spec.chart.spec.version字段例如从6.2.0改为6.3.0。提交代码将修改提交并推送到 Git 仓库。自动同步Flux 在下一个同步周期我们设为5分钟会检测到 Git 仓库中HelmRelease的期望状态发生了变化。执行升级Flux 的 Helm Controller 会执行helm upgrade操作在集群中滚动更新 podinfo 到新版本。状态回馈你可以在 Git 仓库中看到 Flux 的合规状态也可以在集群中通过flux get helmreleases查看升级进度。回滚同样简单使用git revert回退到上一个提交然后推送Flux 会自动执行回滚操作。注意事项在 GitOps 实践中切勿直接使用kubectl edit或helm upgrade命令修改集群状态。所有变更都应通过 Git 提交发起。这保证了集群状态始终与版本化的 Git 记录保持一致提供了完整的审计追踪能力。如果因为紧急故障需要手动干预事后也务必记得将修正后的配置提交回 Git。6. 常见问题排查与性能调优实录在实际使用和集成 podinfo 的过程中你可能会遇到一些典型问题。以下是我总结的排查清单和经验。6.1 部署与启动问题问题1Pod 处于CrashLoopBackOff状态。可能原因1资源不足。podinfo 默认资源请求很低但在资源紧张的集群中可能无法调度。排查kubectl describe pod pod-name查看事件是否有FailedScheduling事件。解决适当调高resources.requests或为节点增加资源。可能原因2镜像拉取失败。排查kubectl describe pod查看事件是否有ErrImagePull或ImagePullBackOff。解决检查网络连通性或确认镜像地址和标签是否正确。对于私有仓库需配置正确的imagePullSecrets。可能原因3就绪/存活探针失败。排查kubectl logs pod-name查看应用日志。手动curl探针端点:9898/healthz和:9898/readyz。解决检查应用是否正常启动。如果使用了redis.enabledtrue确保 Redis 容器也成功启动因为就绪探针可能依赖 Redis 连接。问题2Service 无法访问。可能原因1Service 类型或端口错误。排查kubectl get svc查看 Service 的CLUSTER-IP和PORT(S)。在集群内使用curl cluster-ip:port测试。解决确保 Service 的selector与 Pod 的labels匹配端口定义正确。对于外部访问可能需要将type改为NodePort或LoadBalancer。可能原因2网络策略限制。排查检查命名空间内是否有 NetworkPolicy 阻止了流量。解决调整或创建允许流量的 NetworkPolicy。6.2 功能接口问题问题/cache相关接口返回错误。排查确保部署时设置了redis.enabledtrue。检查 Redis Pod 是否运行正常 (kubectl get pods -l appredis)。解决查看 podinfo 的日志确认其是否成功连接到 Redis。检查 Redis 的密码配置如果设置了密码需要在 podinfo 的 values 中配置redis.auth。问题Prometheus 抓取不到/metrics数据。排查确认 podinfo 的 Service 或 Pod 有正确的prometheus.io/scrape: true等注解。在 Prometheus 的 Web UI 的Targets页面查看抓取目标状态。进入 podinfo 的 Pod 内部手动curl localhost:9898/metrics看是否有数据输出。解决根据 Prometheus 的日志和抓取目标的状态信息进行修复。常见问题是服务发现配置或网络连通性问题。6.3 性能与资源调优建议podinfo 本身非常轻量但在高并发测试或作为长期运行的探针时可以考虑以下调优资源限制始终为生产环境的工作负载设置resources.limits和resources.requests。对于 podinfo一个合理的生产配置可能是resources: requests: cpu: 50m memory: 64Mi limits: cpu: 200m memory: 128Mi这可以防止单个 Pod 异常占用过多资源影响节点上其他应用。水平自动扩缩容启用 HPA 让 podinfo 能够应对流量波动。hpa: enabled: true minReplicas: 2 maxReplicas: 10 targetCPUUtilizationPercentage: 70 # 基于CPU使用率扩容 # 也可以基于自定义指标如QPS设置minReplicas: 2提供了基本的冗余和高可用性。调整 Go 运行时参数对于 Go 应用可以通过环境变量调整垃圾回收等行为以优化性能但 podinfo 作为演示应用通常不需要。如果遇到特定性能问题可以考虑调整GOGC垃圾回收目标百分比和GOMAXPROCS最大CPU数。连接池与超时如果 podinfo 作为客户端调用其他服务通过backend配置确保在代码或配置中设置了合理的 HTTP 连接池大小和超时时间避免连接泄漏或慢请求堆积。虽然 podinfo 本身不复杂但这个最佳实践适用于所有微服务。通过系统性地实践上述部署、集成和排查流程你不仅能掌握 podinfo 这个工具更能深入理解一个现代化、生产可用的云原生微服务所应具备的全部特质。它就像一位沉默的导师通过自身的设计和实现向我们展示着云原生时代的工程最佳实践。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…