【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik

news2024/11/27 11:35:37

目录

引言

一、Traefik基本概念

(一)什么是Ingress

(二)什么是Traefik

(三)Traefik和Nginx的区别

1.设计目标

2.配置语言

3.容器支持

4.功能特性

二、安装部署Traefik

(一)获取文件

(二)创建管理用户

1.查看文件

2.启用RBAC

(三)创建Daemonset

1.查看文件

2.创建资源

(四)创建UI界面

1.查看文件

2.创建资源

三、创建访问资源

(一)创建deployment

(二)创建service

(三)创建ingress规则


引言

在今天的云原生和微服务架构中,反向代理和负载均衡器扮演着至关重要的角色。它们不仅负责处理外部请求并将其路由到正确的服务,而且还提供了诸如SSL终止、负载均衡、请求重写和身份验证等关键功能。在这篇文章中,我们将深入探索Traefik,一个功能强大且轻量级的现代HTTP反向代理和负载均衡器

一、Traefik基本概念

(一)什么是Ingress

Ingress其实就是从 kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,有的人可能觉得我们直接使用 nginx 就实现了,但是只使用nginx这种方式有很大缺陷,每次有新服务加入的时候怎么改 Nginx 配置?不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧?那我们再加上一个服务发现的工具比如 consul如何?貌似是可以,对吧?而且在之前单独使用 docker 的时候,这种方式已经使用得很普遍了,Ingress 实际上就是这样实现的,只是服务发现的功能自己实现了,不需要使用第三方的服务了,然后再加上一个域名规则定义,路由信息的刷新需要一个靠Ingress controller 来提供。
Ingress controller 可以理解为一个监听器,通过不断地与 kube-apiserver 打交道,实时的感知后端 service、pod 的变化,当得到这些变化信息后,Ingress controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用。其实这点和服务发现工具 consul consul-template 非常类似。

现在可以供大家使用的 Ingress controller 有很多,比如 traefik、nginx-controller、KubernetesIngress Controller for Kong、HAProxy,Ingress controller,当然你也可以自己实现一个 IngressController,现在普遍用得较多的是 traefik 和 nginx-controller

traefik 的性能较 nginx-controller差,但是配置使用要简单许多,如果你的环境主要是容器化的,且需要自动服务发现、动态路由和自动SSL证书管理等特性,Traefik可能更适合。如果你更注重性能、稳定性,或者在传统的Web服务器场景下使用,Nginx可能是更好的选择。

(二)什么是Traefik

Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持Docker、Swarm、Mesos/Marathon、Mesos、Kubernetes、Consu、Etcd、Zookeeper、BoltDB、Rest API等等后端模型。

1.在NodePort模式下,客户端通过主机名、URL等方式,访问宿主机绑定的随机端口

2.根据随机端口确定访问的是HTTP还是HTTPS

3.Traefik组件会匹配ingress规则,然后代理到后端服务

(三)Traefik和Nginx的区别

Traefik和Nginx都是常见的反向代理服务器,用于在网络中路由和负载均衡请求。它们在设计和功能上有一些区别,下面是它们之间的对比:

1.设计目标

- Traefik的设计目标是为容器化环境提供动态路由和负载均衡。它在支持Docker、Kubernetes等容器编排平台方面表现出色,并且具有自动发现和配置的能力。
- Nginx的设计目标是作为通用的高性能Web服务器和反向代理。它在传统的服务器环境中广泛使用,可以处理静态和动态内容,并提供丰富的功能和模块化的架构。

2.配置语言

- Traefik使用声明性的配置文件格式,支持多种后端和路由规则的定义。它还提供了REST API和动态配置的能力,可以与现代的容器编排工具集成。
- Nginx使用基于文件的配置语言,具有灵活的配置选项和强大的模块化系统。它的配置通常需要手动编辑配置文件,并在需要时重新加载。

3.容器支持

- Traefik是为容器化环境而设计的,可以自动检测和配置与容器相关的路由和负载均衡规则。它可以与Docker、Kubernetes等容器编排平台紧密集成,并提供简化的配置和部署体验。
- Nginx也可以在容器环境中使用,但需要手动配置并与容器编排工具进行集成。它通常被用作独立的反向代理服务器,而不是与容器平台紧密集成。

4.功能特性

- Traefik在容器环境中具有自动服务发现和负载均衡的能力。它支持HTTP/2、WebSocket、Let's Encrypt等功能,并提供了丰富的插件生态系统。
- Nginx具有强大的性能和灵活的配置选项。它支持高并发、反向代理、负载均衡、缓存、SSL/TLS等功能,并具有丰富的第三方模块和社区支持。

二、安装部署Traefik

(一)获取文件

官方下载地址
wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-deployment.yaml
wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml
wget  https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/ui.yaml

国内的 gitee下载地址
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml

[root@master01 traefik]#ls
traefik-deployment.yaml  traefik-ds.yaml  traefik-rbac.yaml  ui.yaml
-------------------------------------------------------------------------
#traefik-deployment.yaml:以deployment的方式创建traefik的yaml文件
#traefik-ds.yaml:以daemonset的方式创建traefik的yaml文件
#traefik-rbac.yaml:用于创建用户及授权绑定的yaml文件
#ui.yaml:用于创建提供web ui访问的页面的yaml文件

(二)创建管理用户

将traefik-deployment.yaml文件中的创建ServiceAccount字段的信息,删除并复制到traefik-rbac.yaml文件当中

[root@master01 traefik]#cat traefik-deployment.yaml 
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
......

由于该字段是属于创建用户、创建权限,及绑定阶段的操作,为便于区分,给大家梳理一下,当然也可以不用移动,按照官方规定的格式执行文件,以下列顺序执行

//启用RBAC认证
kubectl apply -f traefik-rbac.yaml

//部署 Traefik 到 Kubernetes 集群,为外部访问创建 NodePorts
kubectl apply -f traefik-deployment.yaml

//部署 Traefik Web UI
kubectl apply -f ui.yaml

1.查看文件

[root@master01 traefik]#vim traefik-rbac.yaml 
[root@master01 traefik]#cat traefik-rbac.yaml 
#创建用户
apiVersion: v1
kind: ServiceAccount                 #指定创建资源类型为用户
metadata:
  name: traefik-ingress-controller  #用户名称
  namespace: kube-system            #指定命名空间
---
kind: ClusterRole                   #定义一个集群级别的角色
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller  #ClusterRole的名称
rules:
  - apiGroups:                      #定义第一个规则组
      - ""                          #表示核心API组,如Pods、Services、Endpoints等核心资源
    resources:                      #指定对哪些资源设置权限
      - services                    #service资源
      - endpoints                   #endpoint信息
      - secrets                     #secrets资源
    verbs:
      - get                         #添加获取权限
      - list                        #添加获取列表权限
      - watch                       #添加监听权限
  - apiGroups:                      #定义第二个规则组
      - extensions                  #extensions组包含了如Ingresses、Deployments等扩展资源
    resources:                      #指定对哪些资源设置权限
      - ingresses                   #ingress资源
    verbs: 
      - get                         #添加获取权限
      - list                        #添加获取列表权限
      - watch                       #添加监听权限
  - apiGroups:                      #定义第三个规则组
    - extensions                    #
    resources:                      #指定对哪些资源设置权限
    - ingresses/status              #ingress的状态资源
    verbs:                          #
    - update                        #更新Ingress资源的status字段
---
#用户与集群角色绑定
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io #指定绑定
  kind: ClusterRole                   #指定绑定的类型为集群角色
  name: traefik-ingress-controller    #指定集群角色名称
subjects:
- kind: ServiceAccount                #指定绑定类型为用户
  name: traefik-ingress-controller    #指定绑定的用户名称
  namespace: kube-system              #指定所在命名空间
#一个ClusterRole可以与多个ServiceAccount绑定

2.启用RBAC

(三)创建Daemonset

1.查看文件

[root@master01 traefik]#cat traefik-ds.yaml
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb          #设置标签
spec:
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
      name: traefik-ingress-lb
#用于匹配与这个DaemonSet关联的 Pods。只有当Pods的标签与这里定义的matchLabels匹配时,才会被视为这个DaemonSet的一部分。
  template:
    metadata:
      labels:                            #定义pod标签
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
#指定了Pods运行时要使用的ServiceAccount的名称,为上一步创建并已经授权的用户账户
      terminationGracePeriodSeconds: 60  #定义了Pod终止前等待的时间
      containers:
      - image: traefik:v1.7              #定义版本为1.7,也可以自定义版本
        name: traefik-ingress-lb
        ports:                           #定义了容器监听的端口以及是否映射到宿主机的端口
        - name: http                     #端口的名称。
          containerPort: 80              #定义监听端口80,用于提供web服务
          hostPort: 80                   #宿主机上监听的端口号
        - name: admin                    #端口的名称。
          containerPort: 8080            #监听8080端口,用于提供UI界面
          hostPort: 8080                 #宿主机上监听的端口号
        securityContext:                 #定义容器的安全策略
          capabilities:                  #定义了容器可以使用的 Linux 能力
            drop:                        #列出了要从容器中删除的能力
            - ALL                        #ALL表示所有
            add:                         #列出了要添加到容器中的能力
            - NET_BIND_SERVICE           #网卡绑定到service的能力
        args:                            #传递给容器的命令行参数
        - --api                          #启用其 API
        - --kubernetes                   #启用 Kubernetes 支持
        - --logLevel=INFO                #将日志级别设置为INFO
---
kind: Service                            #创建service资源
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:                                  #定义提供web界面与UI界面的端口
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

2.创建资源

[root@master01 traefik]#kubectl apply -f traefik-ds.yaml 
daemonset.apps/traefik-ingress-controller created
service/traefik-ingress-service created
[root@master01 traefik]#kubectl get daemonsets.apps traefik-ingress-controller -n kube-system 
NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
traefik-ingress-controller   2         2         2       2            2           <none>          4m16s
[root@master01 traefik]#kubectl get svc traefik-ingress-service -n kube-system 
NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
traefik-ingress-service   ClusterIP   10.96.194.37   <none>        80/TCP,8080/TCP   4m44s
[root@master01 traefik]#kubectl get pod -n kube-system 
NAME                               READY   STATUS    RESTARTS   AGE
coredns-74ff55c5b-dwzdp            1/1     Running   9          19d
coredns-74ff55c5b-ws8c8            1/1     Running   9          19d
etcd-master01                      1/1     Running   9          19d
kube-apiserver-master01            1/1     Running   4          5d11h
kube-controller-manager-master01   1/1     Running   41         19d
kube-proxy-psdnv                   1/1     Running   9          19d
kube-proxy-zmh82                   1/1     Running   11         19d
kube-proxy-zwnx2                   1/1     Running   9          19d
kube-scheduler-master01            1/1     Running   44         19d
traefik-ingress-controller-qgs7z   1/1     Running   0          5m15s
traefik-ingress-controller-td99z   1/1     Running   0          5m15s
#在所有节点上创建一个traefik-ingress-controller

(四)创建UI界面

1.查看文件

[root@master01 traefik]#cat ui.yaml 
---
apiVersion: v1
kind: Service                           #创建service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress                            #创建ingress规则
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: traefik-ui.minikube            #触发规则的主机名
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui    #Daemonset中创建的service资源
          servicePort: web               #Daemonset中创建的service资源

2.创建资源

[root@master01 traefik]#kubectl apply -f ui.yaml 
service/traefik-web-ui created
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions/traefik-web-ui created
[root@master01 traefik]#kubectl get svc traefik-web-ui -n kube-system 
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
traefik-web-ui   ClusterIP   10.96.214.175   <none>        80/TCP    43s
[root@master01 traefik]#kubectl get ingress traefik-web-ui -n kube-system 
NAME             CLASS    HOSTS                 ADDRESS   PORTS   AGE
traefik-web-ui   <none>   traefik-ui.minikube             80      56s

此时可以通过NodeIP地址,直接访问8080端口

三、创建访问资源

(一)创建deployment

[root@master01 traefik]#cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik-ingress01
  labels:
    traefik: ingress 
spec:
  replicas: 2
  selector:
    matchLabels:
     traefik: ingress
  template:
    metadata:
      labels:
        traefik: ingress
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        ports:
        - containerPort: 80

创建资源,并自定义访问界面

[root@master01 traefik]#kubectl apply -f deployment.yaml 
deployment.apps/traefik-ingress01 created
[root@master01 traefik]#kubectl get deployments.apps traefik-ingress01 
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
traefik-ingress01   2/2     2            2           14s
[root@master01 traefik]#kubectl get pod -owide
NAME                                 READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
traefik-ingress01-7c6d58b95c-mqth2   1/1     Running   0          30s   10.244.1.221   node01   <none>           <none>
traefik-ingress01-7c6d58b95c-wkl4s   1/1     Running   0          30s   10.244.2.12    node02   <none>           <none>
//自定义web界面
[root@master01 traefik]#kubectl exec -it traefik-ingress01-7c6d58b95c-mqth2 bash
root@traefik-ingress01-7c6d58b95c-mqth2:/# echo "this is traefik01" >/usr/share/nginx/html/index.html 
root@traefik-ingress01-7c6d58b95c-mqth2:/# exit
exit
[root@master01 traefik]#kubectl exec -it traefik-ingress01-7c6d58b95c-wkl4s bash
root@traefik-ingress01-7c6d58b95c-wkl4s:/# echo "this is traefik02" >/usr/share/nginx/html/index.html
root@traefik-ingress01-7c6d58b95c-wkl4s:/# exit
exit
[root@master01 traefik]#curl 10.244.1.221
this is traefik01
[root@master01 traefik]#curl 10.244.2.12
this is traefik02

(二)创建service

[root@master01 traefik]#cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: traefik-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    traefik: ingress
[root@master01 traefik]#kubectl apply -f service.yaml 
service/traefik-svc created
[root@master01 traefik]#kubectl get svc traefik-svc 
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
traefik-svc   ClusterIP   10.96.31.72   <none>        80/TCP    9s

(三)创建ingress规则

[root@master01 traefik]#cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-test
spec:
  rules:
    - host: www.traefik01.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: traefik-svc
              port:
                number: 80
[root@master01 traefik]#kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/traefik-test created
[root@master01 traefik]#kubectl get ingress traefik-test 
NAME           CLASS    HOSTS               ADDRESS   PORTS   AGE
traefik-test   <none>   www.traefik01.com             80      11s

(四)客户端访问

[root@nfs ~]#grep www.traefik01.com /etc/hosts
192.168.83.40 node01 www.traefik01.com
[root@nfs ~]#curl www.traefik01.com
this is traefik01
[root@nfs ~]#curl www.traefik01.com
this is traefik02
[root@nfs ~]#curl www.traefik01.com
this is traefik01
[root@nfs ~]#curl www.traefik01.com
this is traefik02

web界面监控

Total Response Time

总响应时间指的是从客户端发送请求开始,直到接收到完整响应所花费的总时间。它包括了请求在网络中的传输时间、服务器处理请求的时间以及响应数据的传输时间。在高负载或网络延迟高的情况下,Total Response Time 可能会显著增加。

Total Code Count

代码总量是指在某个软件项目或代码库中源代码的总行数。它可以用来衡量项目的规模或复杂度。在软件工程中,代码行数(LOC, Lines Of Code)有时被用作项目进度或开发工作量的粗略指标,尽管它并不是衡量软件质量的可靠标准。

Uptime Since

自上次启动以来的运行时间,通常显示为“Uptime Since”后面跟一个日期和时间。这是指系统或服务自从上一次重启后持续运行的时间长度。长时间的运行时间通常意味着系统稳定,没有经历频繁的重启或故障。

2024-06-05 09:54:41 +08:00

这是一个具体的时间戳,采用 ISO 8601 格式。这里的时间是2024年6月5日的9点54分41秒,处于东八区的时区(中国标准时间)。这个时间戳可以用于日志记录、事件追踪或系统状态的时间标记。

Average Response Time

平均响应时间是所有请求响应时间的平均值,通常用于衡量服务器或服务的性能。较低的平均响应时间表明系统响应迅速,处理能力强。它是性能监控和调优的关键指标之一。

Code Count

代码计数通常指的是单个文件或模块中的源代码行数。与 Total Code Count 不同,它关注的是特定部分的代码量,而不是整个项目。

PID

PID,即进程标识符(Process Identifier),是操作系统分配给每个运行进程的唯一数字标识。PID 用于跟踪和管理进程,如发送信号、终止进程或查询进程状态。在系统管理和调试中,PID 是一个重要的标识符。

在更高的版本中,Traefik会提供更友好的UI界面,部署的方式也会多样化,后续会给大家介绍更高版本的Traefik组件

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

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

相关文章

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

NGINX之location和rewrite

一.NGINX常用的正则表达式 二.Location location作用:对访问的路径做访问控制或者代理转发 1.location 常用的匹配规则&#xff1a; 进行普通字符精确匹配&#xff0c;也就是完全匹配^~ / 表示普通字符匹配。使用前缀匹配。如果匹配成功&#xff0c;则不再匹配其它 …

QGraphicsView实现简易地图20『鹰眼视图-全图显示』

前文链接&#xff1a;QGraphicsView实现简易地图19『迁徙图』 鹰眼视图-全图显示 能够显示所有已加载的瓦片地图&#xff0c;支持当前视口的范围显示器。鼠标在鹰眼视图上移动时&#xff0c;支持是否干预主视图地图加载两种模式&#xff0c;即移动时是否让主视图加载空白处的瓦…

无头+单向+非循环链表的实现

这里写目录标题 1. 链表1.1 链表的概念及结构1.2 链表的分类 2. 接口实现3. 链表的实现3.1 打印链表3.2 头插3.3 尾插3.4 头删3.5 尾删3.6 单链表查找3.7 在pos之前插入3.8 在pos之后插入3.9 删除pos位置的值3.10 删除pos位置之后的值3.11 链表的释放3.12 动态申请一个节点 4. …

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…

【Java 百“练”成钢】Java 基础:带参数的方法

Java 基础&#xff1a;带参数的方法 01.求和02.字符串输出03.寻找最大值04.寻找最小值05.字符串拼接06.求平均值07.数组排序08.累乘09.存在的字符串10.长整型求和11.寻找字符串索引12.字符串拼接&#xff08;StringBuilder&#xff09; 01.求和 public class SumCalculator {s…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机&#xff08;PMDC&#xff09;、永磁同步电机&#xff08;PMSM&#xff09;、无刷直流电机&#xff08;BLDC&#xff09;以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动&#xff08;如二合一、三合一驱动芯片&#xff09;的原因主要…

python 多任务之多线程

多线程 线程是程序执行的最小单位&#xff0c;实际上进程只负责分配资源&#xff0c;而利用这些资源执行程序的是线程&#xff0c;也就是说进程是线程的容器&#xff0c;一个进程中最少有一个线程来负责执行程序&#xff0c;它可以与同属一个进程的其它线程共享进程所拥有的全…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

openai 前员工释放出关于AGI的前世今生和未来发展趋势的详细报告

目录 1.引言2.AGI的临近3.投资与工业动员4.国家安全与AI竞赛5.技术挑战与机遇6.项目与政策7.结语8.原文PDF链接PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 2024年&#xff0c;我们站在了一个全新的科技前沿。在这篇文…

LabVIEW电机槽楔松动声测系统

LabVIEW电机槽楔松动声测系统 开发了一种利用LabVIEW软件和硬件平台&#xff0c;为大型电机设计的槽楔松动声测系统。该系统通过声波检测技术&#xff0c;实现了对电机槽楔是否松动的快速准确判断&#xff0c;极大地提高了检测效率和安全性。 项目背景 大型电机在运行过程中…

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…

字符串形成树形

字符串形成树形 有的时候我们形成树形不是以ID的关系进行匹配的而是以字符串进行形成 数据 CREATE TABLE `contract_main_org_info` (`id` bigint(20) NOT NULL COMMENT 组织单位id,`parent_id` int(11) NULL DEFAULT NULL COMMENT 父组织单位id,`org_name` varchar(255) CHA…

什么是pump?pump跟单机器人是什么?

区块链pump&#xff08;拉盘&#xff09;是一种市场操纵策略&#xff0c;通常指在短时间内人为抬高某种加密货币的价格&#xff0c;从而吸引其他投资者购买&#xff0c;随后通过快速出售&#xff08;dump&#xff09;获利。这种策略通常由一群协调好的投资者或交易团体执行&…

学习使用 Frida 过程中出现的问题

一、adb shell命令报错&#xff1a;error: no devices found 目前该问题解决方法仅供参考&#xff0c;可先看看再选择试试&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 查看此电脑也会发现没有出现手机型号文件夹。 第一步&#xff1a; 检查一下手机开了u…

适用于电脑的 5 大嗨格式数据恢复替代方案

嗨格式数据恢复是有一定知名度的 Windows 和 Mac 恢复程序&#xff0c;旨在恢复格式化、删除和丢失的图片、视频和音频。该应用程序支持多种文件格式以及相机 RAW 图像。最好的部分&#xff1f;它的预览功能可以在恢复照片和其他媒体文件之前检查和验证它​​们——这可以节省大…

Golang | Leetcode Golang题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…

简单的基于threejs和BVH第一人称视角和第三人称视角控制器

渲染框架是基于THREE,碰撞检测是基于BVH。本来用的是three自带的octree结构做碰撞发现性能不太好 核心代码&#xff1a; import * as THREE from three import { RoundedBoxGeometry } from three/examples/jsm/geometries/RoundedBoxGeometry.js; import { MeshBVH, MeshBVHHe…

C++做题

我们可以将0——9看成一个一维数组&#xff1a;a[11] #include<cstdio> int a[11],n; int x,p; int main(){scanf("%d",&n);for(int i1;i<n;i){pi;while(p!0){xp%10;a[x];//让下标x每次出现时增加1(描述不清楚)p/10;}}for(int i0;i<9;i){printf(&qu…

Linux—小小内核升级

本篇主要是讲述下关于内核的一些基本常识&#xff0c;并记录下内核升级和编译的过程&#xff0c;若有遗漏/有误之处&#xff0c;望各位大佬们指出。 Ⅰ 基本内核常识 常见内核安装包 内核(kernel)&#xff1a;这是Linux操作系统的核心部分&#xff0c;它负责管理系统的硬件和…