当前位置: 首页 > news >正文

阿里云ack的创建与实战应用案例

阿里云ack的创建与应用案例

      • 创建前开通ack相关服务:
      • 开始创建
      • 简单的魔方游戏,熟悉sv与clb自动注册创建
      • 部署一个nginx 服务示例:
      • 走不同域名访问不同svc资源:
          • 为什么需要 Ingress ?
          • 创建第一个域名的 Deployment和Service。
          • 创建第二个域名的 Deployment和Service。
          • 部署Ingress
          • 测试访问情况
      • 灰度发布与蓝绿发布参考:
      • 探针场景
        • 为什么要用探针?
        • **探针案例**
      • 生命周期举例
      • ack云日志如何接入(阿里的Logtail产品)

创建前开通ack相关服务:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/getting-started/quick-start-for-first-time-users/?spm=a2c4g.11186623.help-menu-85222.d_1_1.1b1c15442gwzA8&scm=20140722.H_161387._.OR_help-T_cn#DAS#zh-V_1

开始创建

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-2?spm=a2c4g.11186623.help-menu-85222.d_2_0_2_0.71e34e25vspFLq&scm=20140722.H_95108._.OR_help-T_cn#DAS#zh-V_1

测试环境:选择使用 EIP 暴露 API Server, 才能在远程连接或者通过控制台的cloudshell管理集群

生产环境:找一台内网安装有kebctl客户端机器进行访问(做好访问权限控制)

连接设置:

复制k8s的外网远程连接配置到conf中

记得先备份好本地的config文件

cd $HOME/.kube/
cp config config.local.back
echo > config
vi config

查看nodes节点情况:

lantai@lantaideMacBook-Pro .kube % kubectl get nodes
NAME                       STATUS   ROLES    AGE   VERSION
cn-chengdu.10.194.33.154   Ready    <none>   54m   v1.31.1-aliyun.1
cn-chengdu.10.245.11.206   Ready    <none>   54m   v1.31.1-aliyun.1

注:没有节点信息就不正常,一般原因是余额不足,导致无法创建节点资源。

简单的魔方游戏,熟悉sv与clb自动注册创建

基于clb注册暴露服务端口,会新创建一个clb进行转发到node的暴露端口上,

不太推荐生产,多创建一个clb就多消耗资源(根据业务规模情况吧)

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/getting-started/getting-started-with-ack-using-kubectl?spm=a2c4g.11186623.help-menu-85222.d_1_3.202c1a00AcmOam&scm=20140722.H_309552._.OR_help-T_cn#DAS#zh-V_1

部署前的clb:

部署后的clb:

NAME           TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
ack-cube-svc   LoadBalancer   192.168.31.155   47.108.xx.xx   80:31547/TCP   32s

在浏览器地址栏输入该服务EXTERNAL-IP字段的IP地址,即可开始魔方游戏。

删除练习相关资源:

kubectl delete -f ack-cube-svc.yaml
kubectl delete -f  ack-cube.yaml

slb中的资源会自己删除:

部署一个nginx 服务示例:

基于clb注册暴露服务端口

  1. 先配置deployment
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:name: nginx-test #应用名称。labels:app: nginx-test
spec:replicas: 1 #设置副本数量。selector:matchLabels:app: nginx-test #对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。template:metadata:labels:app: nginx-testspec:containers:- name: nginx-testimage: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 #替换为您实际的镜像地址,格式为:<image_name:tags>。ports:- containerPort: 80 #需要在服务中暴露该端口。

Deployment资源创建与验证:

kubectl apply -f  nginx-test.yaml
kubectl get deployment nginx-test
  1. 配置nginx的 sv
apiVersion: v1
kind: Service
metadata:labels:app: nginx-testname: nginx-test-svcnamespace: default
spec:ports:- port: 8080    #公网暴露的端口,用了clb下面是LoadBalancer会自动开放端口到eip中protocol: TCPtargetPort: 80  selector:app: nginx-test # 需要与Deployment YAML文件中的matchLabels的值一致。type: LoadBalancer # 使用clb自动注册,需要配置为LoadBalancer类型

Service资源创建与验证:

kubectl apply -f nginx-svc.yaml
kubectl get svc nginx-test-svc
lantai@lantaideMacBook-Pro .kube % kubectl get svc nginx-test-svc
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
nginx-test-svc   LoadBalancer   192.168.31.180   47.108.*.*   8080:30456/TCP   18m

浏览器中访问: EXTERNAL-IP:8080

EXTERNAL-IP : 外部可访问的公网ip地址

删除资源:

kubectl delete -f nginx-svc.yaml
kubectl delete -f  nginx-test.yaml

走不同域名访问不同svc资源:

为什么需要 Ingress ?
  • Service 可以使用 NodePort 暴露集群外访问端口,但是性能低、不安全并且端口的范围有限。
  • Service 缺少七层(OSI 网络模型)的统一访问入口,负载均衡能力很低,不能做限流、验证非法用户、链路追踪等等。
  • Ingress 公开了从集群外部到集群内 服务 的 HTTP 和 HTTPS 路由,流量路由由 Ingress 资源上定义的规则控制。
  • 我们使用 Ingress 作为整个集群统一的入口,配置 Ingress 规则转发到对应的 Service 。

基于ack中的ingress进行域名的转发规则实验:

ack的ingress配置参考:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-nginx-ingress-1?spm=a2c4g.11186623.0.0.1b1c4d29tyipum

ack ingress的副本数量控制:

https://help.aliyun.com/zh/ack/deploy-ingresses-in-a-high-reliability-architecture?spm=a2c4g.11186623.0.0.17ffae7bmNEj0W#task-1339886

k8s的ingress参考:

https://kubernetes.io/docs/concepts/services-networking/ingress/

生产环境的svc的type类型建议如下

type: ClusterIP
创建第一个域名的 Deployment和Service。
 创建一个old-nginx.yaml 资源清单
apiVersion: apps/v1
kind: Deployment
metadata:name: old-nginx
spec:replicas: 1selector:matchLabels:run: old-nginx  # 标签和service资源定义的对应好template:metadata:labels:run: old-nginxspec:containers:- image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx # 用的阿里封装过的镜像,生产根据实际情况配置镜像仓库地址imagePullPolicy: Alwaysname: old-nginxports:- containerPort: 80protocol: TCPrestartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: old-nginx
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: old-nginxsessionAffinity: Nonetype: NodePort

b. 执行以下命令,创建Deployment和Service。

kubectl apply -f old-nginx.yaml


创建第二个域名的 Deployment和Service。

创建new-nginx.yaml。

apiVersion: apps/v1
kind: Deployment
metadata:name: new-nginx
spec:replicas: 1selector:matchLabels:run: new-nginxtemplate:metadata:labels:run: new-nginxspec:containers:- image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginximagePullPolicy: Alwaysname: new-nginxports:- containerPort: 80protocol: TCPrestartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: new-nginx
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: new-nginxsessionAffinity: Nonetype: NodePort

b. 执行以下命令,创建Deployment和Service。

kubectl apply -f new-nginx.yaml
部署Ingress

创建ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-http
spec:rules: # 规则,这里配置的域名规则,类似nginx# 第一个svc域名- host: www.example.comhttp:paths:# 老版本nginx服务。- path: /backend:service: name: old-nginxport:number: 80  # 后端svc的端口号pathType: ImplementationSpecific# 第二个svc域名- host: www.test.comhttp:paths:# 新版本nginx服务。- path: /backend:  # 指定路由到后端服务的service 相关配置service: name: new-nginxport:number: 80  # 后端svc的端口号pathType: ImplementationSpecific # ImplementationSpecific 匹配方法取决于 IngressClass

执行以下命令,部署Ingress。

kubectl apply -f ingress.yaml
测试访问情况

查看ingress, 获取外部访问IP:

lantai@lantaideMacBook-Pro .kube % kubectl get ingress
NAME           CLASS   HOSTS                           ADDRESS          PORTS   AGE
ingress-http   nginx   www.example.com,www.test.com    47.108.*.184     80      18s

查看clb控制面板并没有增加条目,因为这次不是LoadBalancer类型的svc, 是NodePort类型的svc,不会向clb注册条目,这次依靠ack内部的ingress组件进行域名转发:

本地电脑主机编辑/etc/hosts进行测试:

47.108.*.184 www.test.com
47.108.*.184 www.example.com

然后,通过浏览器访问不同的域名进行测试,测试效果如下:

测试完清空资源:

kubectl delete -f ingress.yaml
kubectl delete -f old-nginx.yaml
kubectl delete -f new-nginx.yaml

灰度发布与蓝绿发布参考:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/implement-gray-scale-and-blue-green-publishing-through-nginx-ingress?spm=a2c4g.11186623.help-menu-85222.d_2_3_5_2_7.7d9fae7beFROdE&scm=20140722.H_200941._.OR_help-T_cn~zh-V_1#38348104fea19

可基于请求头、cookie 、请求参数,流量权重等控制。

探针场景

为什么要用探针?

主要做 健康检查

  • 在 Kubernetes 中,探针不是默认配置的,需要手动添加到 Pod 的定义中。
    • 如果没有添加livenessProbereadinessProbe,Kubernetes 不会自动进行基于应用层协议(如 HTTP)的健康检查,只会检查容器是否成功启动(即容器的主进程是否运行)。
  1. 容器启动状态检查

    • 默认情况下,Kubernetes主要关注容器是否成功启动并进入Running状态。当Kubernetes调度一个Pod到节点上后,它会等待容器的主进程启动。如果主进程能够正常启动,容器就会被标记为Running
  2. 容器运行后的健康监测缺失(默认情况)

    • 然而,仅容器启动成功并不意味着应用在整个生命周期内都能正常提供服务。例如,应用可能会出现死锁、进入无限循环、耗尽资源等情况,导致虽然容器仍在运行,但服务已经不可用。默认情况下,Kubernetes没有内置对这些应用层问题的检查机制,这就需要通过手动添加探针(如livenessProbereadinessProbe)来实现更细致的健康监测。
  3. 与Pod生命周期的关系

    • 在Pod的生命周期管理中,默认的Running状态判断相对比较基础。从创建Pending到进入Running,Kubernetes确保了容器能够启动,但对于后续可能出现的各种应用故障场景,没有默认的主动监测。添加探针后,可以更好地管理Pod在Running状态下的健康状况,例如通过livenessProbe来决定是否重启故障容器,通过readinessProbe来确定容器是否可以接收流量,这些操作有助于维护应用的高可用性和稳定性。
  4. Pod生命周期概述

    • 创建阶段(Pending:当创建一个Pod时,它首先进入Pending状态。此时,Kubernetes正在为Pod分配节点资源,包括下载镜像等操作。例如,若Pod请求的资源(如CPU、内存)在集群中暂时无法满足,或者镜像拉取出现问题,Pod就会一直处于Pending状态。
    • 运行阶段(Running:当Pod成功被调度到节点并且容器启动后,进入Running状态。此时,容器内的应用程序开始运行,提供相应的服务。但这并不意味着应用完全健康,可能还需要进一步的健康检查(通过探针)来确保服务的质量。
    • 终止阶段(SucceededFailed:当容器内的主进程正常退出时,Pod状态变为Succeeded;如果容器内主进程异常退出或者容器无法启动,Pod状态变为Failed
  5. kubernetes提供了两种探针来实现容器探测,分别是:

    • 存活探针(livenessProbe
      • 用于判断容器是否还在“存活”状态。
      • 如果存活探针检测失败,Kubernetes会根据配置的策略(如重启容器)来尝试恢复服务。
      • 例如,对于一个Web应用,可以设置一个HTTP存活探针,定期发送HTTP请求到应用的某个端点,如果连续多次无法得到正确响应(如返回状态码不是200-299),就认为容器可能出现问题,需要重启。
      • 在 Kubernetes 中,当livenessProbe(存活探针)检测失败达到一定次数(failureThreshold)时,默认行为是重启容器。
        • 对于httpGet类型的存活探针,Kubernetes 会按照periodSeconds设置的时间间隔(这里是 5 秒)来检查容器内应用的健康状况。如果连续多次检查(默认failureThreshold为 3 次)都无法通过(例如,返回的 HTTP 状态码不是 200 - 399 范围内),Kubernetes 就会判定容器不健康,并采取重启操作,以尝试恢复应用的正常运行。
      • kubernetes就会对容器所在的Pod进行重启,其实这是由Pod的重启策略决定的,Pod的重启策略有3种,分别如下:
        - Always:容器失效时,自动重启该容器,默认值。
        - OnFailure:容器终止运行且退出码不为0时重启。
        - Never:不论状态如何,都不重启该容器。
      restartPolicy: Never # 重启策略设置格式
    • 就绪探针(readinessProbe):
      • 用于判断容器是否已经“准备好”接收流量。
      • 只有当就绪探针检测成功时,Service才会将流量转发到该容器对应的Pod。
      • 例如,一个应用可能在启动后需要一些时间来加载配置文件或者初始化数据库连接,在这个过程中,虽然容器已经运行(存活),但还没有准备好接收流量。通过就绪探针可以确保只有在应用真正准备好后,才会让流量进入。
探针案例
  • 将带有探针的Pod纳入Service管理
    • 在Pod配置中添加探针(以Deployment为例)
      假设要部署一个nginx应用的Pod,并且添加探针。
    • 创建一个DeploymentYAML文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment-with-probes
spec:replicas: 3selector:matchLabels:app: nginx-probestemplate:metadata:labels:app: nginx-probesspec:containers:- name: nginx-container-with-probesimage: nginx:latestports:- containerPort: 80livenessProbe:httpGet:   # 表示通过发送 HTTP GET 请求的方式来检测容器内应用的状态path: /port: 80initialDelaySeconds: 15  # 在容器启动后,延迟多少秒才开始第一次进行存活探针检测periodSeconds: 5  #它定义了每隔多长时间进行一次存活探针检测,这里设置为 5 秒readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 10  #表示容器启动后,延迟 10 秒才开始第一次进行就绪探针检测periodSeconds: 3
注:在这个配置中,livenessProbe和readinessProbe都是基于httpGet(还有其它方式)方式,即发送HTTP请求来检查容器的状态。path: /表示发送请求到容器内应用的根路径(对于nginx来说就是首页),port: 80表示通过80端口发送请求。initialDelaySeconds是容器启动后延迟多久开始第一次探测,periodSeconds是每次探测的间隔时间。

创建Service来管理带有探针的Pod

apiVersion: v1
kind: Service
metadata:name: nginx-service-for-probes
spec:selector:app: nginx-probesports:- port: 80targetPort: 80type: ClusterIP
  • 当Pod配置好探针后,创建Service来管理这些Pod。例如:
  • Servicespec部分,selector字段通过app: nginx-probes来选择带有这个标签的Pod,这些Pod正是之前在Deployment中配置了探针的nginx Pod。
  • ports部分定义了Service本身的端口(port: 80)和转发到Pod的目标端口(targetPort: 80)。
  • 这样,Service就会根据Pod的就绪状态(通过就绪探针来判断)将外部流量转发到合适的Pod上。当Pod的存活探针检测到容器出现问题时,Kubernetes会按照配置(如重启容器)来处理,而Service会自动更新其流量转发的目标Pod列表,确保流量始终导向健康的Pod

生命周期举例

  1. lifecycle配置可以添加到Deployment
    • 在Kubernetes的Deployment资源中,可以为容器定义生命周期钩子(lifecycle hooks),用于在容器启动后(postStart)和容器停止前(preStop)执行特定的操作。
    • 这对于需要在容器生命周期的关键阶段进行自定义操作(如初始化配置、清理资源等)非常有用。
  2. 示例
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment-with-lifecyclelabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestlifecycle:postStart: # 启动后exec:command: ["/bin/sh","-c","echo postStart... > /usr/share/nginx/html/index.html"]preStop:  # 停止前exec:command: ["/usr/sbin/nginx","-s","quit"]
  • 以下是一个包含lifecycle配置的Deployment示例,用于部署一个简单的Nginx应用:
    - 在这个示例中:
    • apiVersion、kind和metadata部分:
      • apiVersion指定了使用的Kubernetes API版本(apps/v1用于Deployment资源)。
      • kind定义资源类型为Deployment
      • metadata包含了Deployment的名称(nginx-deployment-with-lifecycle)和标签(app: nginx),用于标识和组织资源。
    • spec部分
      • replicas字段设置为1,表示希望运行的Pod副本数量为1个。
      • selector定义了如何选择这个Deployment管理的Pod,通过匹配标签app: nginx来确定。
      • template部分定义了Pod的模板。
        • metadata中的标签(app: nginx)用于Pod的识别。
        • spec中的containers字段定义了容器相关信息。
          • 容器名称为nginx,使用nginx:latest镜像。
          • lifecycle配置包含了postStartpreStop钩子。
            • postStart钩子在容器创建后执行,通过exec方式运行一条命令,将postStart...写入Nginx容器的/usr/share/nginx/html/index.html文件,从而修改了Nginx的首页内容。
            • preStop钩子在容器停止前执行,通过exec方式运行命令/usr/sbin/nginx - s quit来优雅地停止Nginx服务,确保在容器完全停止之前,Nginx能够正常关闭,避免数据丢失或服务异常。
  1. 应用和验证
kubectl apply -f nginx-deployment-with-lifecycle.yaml
  • 可以使用kubectl命令来应用这个Deployment配置:
  • 之后,可以通过以下方式验证lifecycle钩子的执行情况:
    • 验证postStart
      • 可以通过访问Nginx服务(如果已经配置了服务暴露),查看Nginx的首页内容是否被修改为postStart...
        • 例如,如果使用NodePort服务类型暴露Nginx服务,可以通过http://<node-ip>:<node-port>访问,查看返回的页面内容。
    • 验证preStop
      • 可以通过手动删除Deployment
      • kubectl delete deployment nginx-deployment-with-lifecycle
      • 然后查看容器日志
        • kubectl logs <pod-name>)来确认preStop命令是否被执行。
        • 在日志中,应该可以看到Nginx服务被优雅地停止的相关信息。

ack云日志如何接入(阿里的Logtail产品)

配置参考:https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/collect-log-data-from-containers-by-using-log-service?spm=a2c4g.11186623.help-menu-85222.d_2_9_1_1.341a455bvxC9TP

相关文章:

阿里云ack的创建与实战应用案例

阿里云ack的创建与应用案例 创建前开通ack相关服务&#xff1a;开始创建简单的魔方游戏&#xff0c;熟悉sv与clb自动注册创建部署一个nginx 服务示例&#xff1a;走不同域名访问不同svc资源&#xff1a;为什么需要 Ingress &#xff1f;创建第一个域名的 Deployment和Service。…...

制造业数字化实践案例丨国内某大型物联网企业数字化项目管理系统,赋能品牌和生态战略落地

30秒快读 该大型物联网企业在规模化和业务扩展过程中&#xff0c;面临项目管理模式单一、供应链与客户端协同不足、项目过程数据透明度低、软硬件项目管理分离等痛点&#xff0c;数字化项目管理系统建设旨在构建以项目制为核心的流程型组织&#xff0c;建立内外部高效协同的项…...

当AI重构认知:技术狂潮下的教育沉思录

备注&#xff1a;文章未Deepseek R1模型辅助生成&#xff0c;如有不妥请谅解。 以下使原文&#xff1a; 我有三个娃&#xff0c;各间隔4到5岁&#xff0c;经历过搜索引擎&#xff0c;短视频&#xff0c;短剧&#xff0c;本身曾经也是教育专业出生&#xff0c;任何事务都有两面性…...

Game Maker 0.11更新:构建社交竞速游戏并增强玩家互动

在这三部分系列中&#xff0c;我们将介绍如何实现Game Maker 0.11中一些最激动人心的新功能。 欢迎来到我们系列文章的第一篇&#xff0c;重点介绍了The Sandbox Game Maker 0.11更新中的新特性。 The Sandbox Game Maker 0.11是一个多功能工具&#xff0c;帮助创作者通过游戏…...

ubuntu配置jmeter

1.前提准备 系统 ubuntu server 22.04 前提条件&#xff1a;服务器更新apt与安装lrzsz&#xff1a;更新apt&#xff1a; sudo apt update安装lrzsz: 命令行下的上传下载文件工具 sudo apt install lrzszsudo apt install zip2.安装jemeter 2.1.下载jdk17 输入命令&#xf…...

计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

字段对比清洗

import pandas as pd import psycopg2 from psycopg2 import sql# 数据库连接配置 DB_CONFIG {"host": "","user": "","password": "","dbname": "","port": , }def get_excel_fi…...

过滤器 二、过滤器详解

过滤器生命周期&#xff1a; init(FilterConfig)&#xff1a;在服务器启动时会创建Filter实例&#xff0c;并且每个类型的Filter只创建一个实例&#xff0c;从此不再创建&#xff01;在创建完Filter实例后&#xff0c;会马上调用init()方法完成初始化工作&#xff0c;这个方法…...

七、Three.jsPBR材质与纹理贴图

1、PBR材质金属度和粗糙度 1、金属度metalness 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 threejs的PBR材质&#xff0c;.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观 new THREE.MeshStandardMaterial({met…...

分布式主键生成服务

目录 一、使用线程安全的类——AtomicInteger或者AtomicLong 二、主键生成最简单写法(不推荐) 三、主键生成方法一&#xff1a;Long型id生成——雪花算法 四、主键生成方法二&#xff1a;流水号 (一)流水号概述 (二)添加配置 1.pom.xml 2.application.properties 3.创…...

【Day50 LeetCode】图论问题 Ⅷ

一、图论问题 Ⅷ 1、dijkstra算法 堆优化 采用堆来优化&#xff0c;适合节点多的稀疏图。代码如下&#xff1a; # include<iostream> # include<vector> # include<list> # include<queue> # include<climits>using namespace std;class myco…...

人大金仓KCA | 用户与角色

人大金仓KCA | 用户与角色 一、知识预备1. 用户和角色 二、具体实施1. 用户管理-命令行1.1 创建和修改用户1.2 修改用户密码1.3 修改用户的并发连接数1.4 修改用户的密码有效期 2.用户管理-EasyKStudio2.1 创建和修改用户2.2 修改用户密码2.3 修改用户的并发连接数2.4 修改用户…...

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…...

【AI学习从零至壹】Numpy基础知识

PyTorch基础知识 Numpy基础NumPy 基本数据类型Numpy数组 NumPy 基础数组创建Numpy特殊数组创建Numpy数组的访问NumPy数组的遍历Numpy数组的常用属性比较常用的属性有&#xff1a; Numpy数组的基本操作Numpy数组的数学操作加减乘除 Numpy线性代数Numpy广播机制 Numpy基础 NumPy…...

Day11,Hot100(贪心算法)

贪心 &#xff08;1&#xff09;121. 买卖股票的最佳时机 第 i 天卖出的最大利润&#xff0c;即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…...

Transformer 代码剖析1 - 数据处理 (pytorch实现)

引言 Transformer 架构自《Attention Is All You Need》论文发表以来&#xff0c;在自然语言处理领域引起了巨大的变革。它摒弃了传统的循环结构&#xff0c;完全基于注意力机制&#xff0c;显著提高了处理序列数据的效率和性能。本文将通过对一个具体的项目代码结构进行详细分…...

Python--模块(下)

3. 内置模块 3.1 os模块 常用功能&#xff1a; os.mkdir("new_dir") # 创建目录 os.listdir(".") # 列出当前目录文件 os.path.join("dir", "file.txt") # 路径拼接 os.path.abspath(__file…...

Android Studio超级详细讲解下载、安装配置教程(建议收藏)

博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有…...

PS画笔工具

画笔工具&#xff1a; 画笔工具&#xff08;B&#xff09;&#xff08;原理&#xff1a;单位笔刷的连续填充&#xff0c;文件格式.abr&#xff09;&#xff1a;圆形矢量笔刷、动态矢量画笔&#xff08;旧版画笔里有 与压感笔有关&#xff09;、图案填充画笔 shift画笔&#xff…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型&#xff1f;3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗&#xff1f;6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...

1.68M 免安装多格式图片批量转 webp 无广告软件推荐

软件介绍 今天要给大家分享一款超实用的图片处理工具&#xff0c;它能实现多格式图片向 webp 格式的转换&#xff0c;无论是 jpg、png、tif、gif 还是 webp 格式自身的图片&#xff0c;都能批量且借助多线程技术进行转换。 直接打开就能用&#xff0c;体积小巧&#xff0c;仅 …...

LeetCode 1472.设计浏览器历史记录:一个数组完成模拟,单次操作均O(1)

【LetMeFly】1472.设计浏览器历史记录&#xff1a;一个数组完成模拟&#xff0c;单次操作均O(1) 力扣题目链接&#xff1a;https://leetcode.cn/problems/design-browser-history/ 你有一个只支持单个标签页的 浏览器 &#xff0c;最开始你浏览的网页是 homepage &#xff0c…...

[笔记.AI]AI知识科普提纲

仅供参考 1.AI基础认知 1.1什么是什么AI 1.2核心概念 1.2.1机器学习、深度学习、神经网络 1.2.2模型&#xff1a;模型、大模型、模型参数 1.2.3多模态 1.2.4生成式AI & 判别式AI 1.3发展与现状 2.大模型 2.1主流大模型 2.1.1分类 2.1.2各…...

学习知识的心理和方法杂记-01

前言&#xff1a; 1 学习新知识要讲究方法&#xff0c;“知识未学 方法先行”&#xff0c;写本系列文章是为了给自己加深大脑“条件反射”的&#xff0c;因为我自己学习新知识的过程中老会被不科学的“杂念”干扰&#xff0c;导致学习效率低下。 2 关于天才和普通人&#xff…...

网页制作10-html,css,javascript初认识の适用XHTML

一、简介&#xff1a; Xhtml是extensible hypertext markup language的缩写。它是由国际W3C组织制定并公布发行的。是一个过渡技术&#xff0c;结合了部分xml的强大功能及大多数html的简单特性。 Advantage. Xhtml提倡更简洁规范的代码。 Xhtml.文档在旧的基于的浏览器中&…...

C++ 中 cin 和 cout 教程

一、概述 在 C 里&#xff0c;cin 和 cout 是标准库 <iostream> 中用于输入输出操作的重要对象&#xff0c;它们基于流的概念&#xff0c;为开发者提供了方便且类型安全的输入输出方式。cin 是标准输入流对象&#xff0c;主要用于从标准输入设备&#xff08;一般是键盘&…...

Qt for Android下QMessageBox背景黑色、文字点击闪烁

最近在基于Qt开发安卓应用的时候,在红米平板上默认QMessageBox出现之后,背景黑色,并且点击提示文字会出现闪烁,影响用户体验。 问题分析 1、设置QMessageBox样式,设置背景色、文字颜色,如下所示: QMessageBox {background: white;color: white; } 尝试之后,问题仍存…...

C++20的指定初始化器(Designated Initializers)

文章目录 指定初始化器的使用条件语法嵌套结构体的初始化数组的指定初始化注意事项优势 C20引入了**指定初始化器&#xff08;Designated Initializers&#xff09;**这一特性&#xff0c;允许在初始化结构体、联合体或类的对象时&#xff0c;明确指定成员变量的初始化值&#…...

Windows 11【1001问】删除Win11左下角小组件的6种方法

在Windows 11中&#xff0c;左下角的小组件功能虽然提供了天气、新闻等实用信息&#xff0c;但对于一些用户来说可能显得多余或干扰视线。因此&#xff0c;微软提供了多种方式让用户能够自定义是否显示这些小组件。以下是 6 种常见的设置方法来隐藏或关闭Windows 11左下角的小组…...

kotlin的函数标准库使用

摘要说明 函数标准库常用的有&#xff1a; 1、apply&#xff1a; apply函数作为一个配置函数&#xff0c;可以传入一个接收者&#xff0c;然后调用一系列函数来配置它以方便使用&#xff0c;如果提供lambda给apply函数执行&#xff0c;它会返回配置好的接收者 使用介绍&#x…...

深入剖析:自定义实现C语言中的atoi函数

在C语言的标准库中&#xff0c; atoi 函数是一个非常实用的工具&#xff0c;它能够将字符串形式的数字转换为对应的整数。然而&#xff0c;当我们深入探究其实现原理时&#xff0c;会发现其中蕴含着许多有趣的编程技巧和细节。本文将详细讲解如何自定义实现一个类似 atoi 功能的…...

Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制

Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...

springboot做接口限流

目录 1. 依赖全局配置2. 注解配置 1. 依赖全局配置 引入依赖 <dependency><groupId>com.github.taptap</groupId><artifactId>ratelimiter-spring-boot-starter</artifactId><version>1.2</version></dependency>appl…...

Visual Studio Code 跨平台安装与配置指南(附官方下载链接)

一、软件定位与核心功能 Visual Studio Code&#xff08;简称VS Code&#xff09;是微软开发的开源跨平台代码编辑器&#xff0c;支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块&#xff0c;可自动生成单元测试代码和API文档注释。 二、下载…...

TaskBuilder设置排序条件

在整个向导的最后一步&#xff0c;可以设置是否按指定字段的值对查询结果进行排序&#xff0c;支持正序和倒序两种排序方式。如果没有设置任何排序字段&#xff0c;则默认按数据库里现有数据记录的实际存储的先后顺序排序。如果设置了多个排序条件&#xff0c;则按这些条件从上…...

挖src实用脚本开发(二)

文章目录 技术原理代码实现一代码实现二总结 这篇文章记录cms识别脚本。 技术原理 1.使用在线平台识别&#xff0c;比如whatcms&#xff0c;fofa等 2.自己写脚本识别&#xff0c;但是指纹库麻烦&#xff0c;需要耗费大量精力 代码实现一 这里我使用的是whatcms接口&#xff0…...

[ISP] AE 自动曝光

相机通过不同曝光参数&#xff08;档位快门时间 x 感光度 x 光圈大小&#xff09;控制进光量来完成恰当的曝光。 自动曝光流程大概分为三部分&#xff1a; 1. 测光&#xff1a;点测光、中心测光、全局测光等&#xff1b;通过调整曝光档位使sensor曝光在合理的阈值内&#xff0…...

DeepSeek-R1:通过强化学习激发大语言模型的推理能力

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列三DeepSeek大模型技术系列三》DeepSeek-…...

002 docker安装rocketmq

docker search rocketmq#拉取镜像 docker pull foxiswho/rocketmq:server-4.3.2 docker pull foxiswho/rocketmq:broker-4.3.2 #创建nameserver容器 docker create -p 9876:9876 --name rmqserver \ -e "JAVA_OPT_EXT-server -Xms128m -Xmx128m -Xmn128m" \ -e "…...

算法训练(leetcode)二刷第三十七天 | *300. 最长递增子序列、674. 最长连续递增序列、*718. 最长重复子数组

刷题记录 *300. 最长递增子序列674. 最长连续递增序列基础解法&#xff08;非动规&#xff09;动态规划 718. 最长重复子数组滚动数组 *300. 最长递增子序列 leetcode题目地址 dp数组含义&#xff1a; dp[i]表示以nums[i]结尾的最长递增子序列长度&#xff0c;即以nums[i]结尾…...

LSTM长短期记忆网络-原理分析

1 简介 概念 LSTM&#xff08;Long Short-Term Memory&#xff09;也称为长短期记忆网络&#xff0c;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用于解决传统RNN的梯度消失问题和长程依赖问题。LSTM通过引入门机制和细胞状态&#xff0c;能够更…...

Java 面试题 20250227

Java 中序列化与反序列化是什么&#xff1f; 序列化&#xff1a;将 Java 对象转化成可传输的字节序列格式&#xff08;字节流、JSON、XML&#xff09;&#xff0c;以便于传输和存储。 反序列化&#xff1a;将字节序列格式数据转化成 Java 对象的过程。 1、为什么需要序列化和…...

Spring事务失效六大场景

引言 Spring事务一般我们采用注解实现&#xff0c;但是我们构造事务实现的时候常常没察觉失效的情况&#xff0c;本篇文章总结事务失效的六大情况&#xff0c;帮助我们深刻理解事务失效的边界概念 1. 方法自调用 这个主要是针对声明式事务的&#xff0c;经过前面的介绍&…...

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…...

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…...

Vxe UI 根据vxe-tabs 绑定不同的值,渲染生成不同的 tabls(页签)内容

VxeUI tabs控件&#xff0c;根据绑定不同的内容&#xff0c;动态渲染不同的表格数据放置在不同的 tab 页 效果图如下&#xff1a; 代码实现 <template><vxe-tabs :options"detailTabList"><vxe-tab-pane v-for"(item, index) in detailTabList&…...

Element Plus中el-select选择器的下拉选项列表的样式设置

el-select选择器&#xff0c;默认样式效果&#xff1a; 通过 * { margin: 0; padding: 0; } 去掉内外边距后的样式效果&#xff08;样式变丑了&#xff09;&#xff1a; 通过 popper-class 自定义类名修改下拉选项列表样式 el-select 标签设置 popper-class"custom-se…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-train.py

train.py ultralytics\models\yolo\detect\train.py 目录 train.py 1.所需的库和模块 2.class DetectionTrainer(BaseTrainer): 1.所需的库和模块 # Ultralytics &#x1f680; AGPL-3.0 License - https://ultralytics.com/licenseimport math import random from copy…...

PR 安装包 2018-2024(Win,Mac)文中为使用技巧和教程

下载链接&#xff1a;https://pan.baidu.com/s/1LLv1tSXJxUcv6iOlcAHJEg?pwd1234 导语&#xff1a;Adobe Premiere Pro以98%的行业覆盖率和跨平台协作能力&#xff0c;稳居2025年视频剪辑工具榜首。本文涵盖基础配置、核心剪辑、高级调色、效率革命、企业级实战五大模块&…...

请求Geoserver的WTMS服务返回200不返回图片问题-跨域导致

今天碰到个奇怪问题&#xff0c;改了个页面标题再打包布署GeoServer发现调用WTMS服务失败&#xff0c;请求返回状态码200&#xff0c;返回包大小0&#xff0c;使用postman模拟请求是可以正常返回图片的。 跟之前版本对比如下&#xff1a; 正常Response请求: HTTP/1.1 200X-Fr…...