第 7 篇 Helm 部署 Nacos【详细步骤】

news2024/9/21 17:58:22

文章目录

  • 安装 Chart
    • 准备工作
    • 单机 + MySQL 模式
      • 第 1 步:自定义配置
      • 第 2 步:安装 chart
      • 第 3 步:查看状态
        • 查看 Pod 运行状态
        • 查看 Pod 信息
      • 第 4 步:访问 Nacos
        • 集群外访问
        • 集群内访问
    • 集群 + MySQL 模式
      • 第 1 步:自定义配置文件
      • 第 2 步:安装 chart
      • 第 3 步:查看 Pod 状态
      • 第 4 步:访问 Nacos
      • 第 5 步:集群扩容/缩容
        • 方法 1:helm upgrade
        • 方法 2:kubectl scale
  • chart 配置参数
  • 入坑指南
    • 坑 1:service.nodePort 映射的是不是 HTTP 端口?
      • 查看 Service 信息
      • 排查 templates/service.yaml
    • 坑 2:resources 内存配置,不会改变 JVM 启动参数
  • 参考
  • 相关博文

🚀 本文内容:使用 Helm 部署 Nacos。


Nacos:动态服务发现、服务配置、服务元数据和流量管理。

Nacos Chart:Nacos Server 官方 Helm Chart,基于 nacos-k8s 项目

  • Artifact HUB:https://artifacthub.io/packages/helm/kubegemsapp/nacos
  • GitHub:https://github.com/nacos-group/nacos-k8s/

安装 Chart

前提条件:

  • Kubernetes 1.10+
  • Helm v3
  • 提供 PV provisioner:‼️务必提供存储制备器,否则没有持久化存储,那么重启后数据就没啦!

模式选择:

  • 默认配置下,是单机+内嵌数据库+无持久化存储,仅能用于快速体验!重启后数据丢失!
  • 单机+MySQL+持久化存储:靠谱的单机版
  • 集群+MySQL+持久化存储:高可用集群版

准备工作

Helm Chart 是基于 nacos-k8s 项目的,需要把整个 Chart 相关内容克隆下来。

# 安装 git
yum install git -y

# 克隆 nacos-k8s 项目
git clone https://github.com/nacos-group/nacos-k8s.git

# 跳转到 helm 目录(这里都是 chart 相关文件,比如 Chart.yaml、values.yaml、templates 等)
cd nacos-k8s/helm/

单机 + MySQL 模式

第 1 步:自定义配置

基于 nacos-k8s/helm/ 目录下的 values.yaml,我们可以定制自己的配置,从而实现覆盖掉 values.yaml 中的默认配置。

新增 nacos_values.yaml:

  • 重点 1:在 nacos.image 属性下面,指定 nacos 镜像版本【这里选择和 Java 代码配套的 2.2.0 版本】
  • 重点 2:配置 MySQL 连接,使用 MySQL 作为外置存储【MySQL 配置请根据实际情况修改】
  • 重点 3:开启持久化存储,并指定 StorageClass【StorageClass 请根据实际情况修改】
  • 重点 4:service 类型使用 NodePort,即在集群外暴露服务
global:
  # 单机版
  mode: standalone

nacos:
  # nacos 镜像配置
  image:
    repository: nacos/nacos-server
    tag: v2.2.0
    pullPolicy: IfNotPresent
  # nacos 插件配置
  plugin:
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin
      tag: 1.1
  # 启用健康检测
  health:
    enabled: true
  # nacos 存储
  storage:
    type: mysql
    db:
      host: 172.20.134.48
      port: 32000
      name: nacos
      username: root
      password: Yumc@ru123
      param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

# 持久化存储
persistence:
  enabled: true
  data:
    accessModes:
      - ReadWriteOnce
    # 指定 StorageClass
    storageClassName: managed-nfs-storage
    resources:
      requests:
        storage: 4Gi

# service 配置
service:
  type: NodePort
  port: 8848
  # !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!
  nodePort: 30000

# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:
  requests:
    cpu: 500m
    memory: 2Gi
  limits:
    cpu: 1000m
    memory: 2Gi

第 2 步:安装 chart

# 跳转到 helm 目录
cd nacos-k8s/helm/

# 安装 nacos:必须在 nacos-k8s/helm/,得有 Chart.yaml
helm install my-nacos ./ --values nacos_values.yaml
# NAME: my-nacos
# LAST DEPLOYED: Thu May 23 13:45:45 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3

第 3 步:查看状态

查看 Pod 运行状态

容器从创建、运行、Ready,耗时 4m11s。

# 查看 Pod 状态
kubectl get pods -w
# NAME                                      READY   STATUS              RESTARTS   AGE
# my-nacos-0                                0/1     ContainerCreating   0          2s
# my-nacos-0                                0/1     Running             0          6s
# my-nacos-0                                1/1     Running             0          4m11s

😂 容器一直 CrashLoopBackOff ?说明有错误,此时必须人工看一下。

  • 思路 1:kubectl logs -f my-nacos-0 查看日志,并进行分析。
  • 思路 2: 找到对应的 PV 存储,进入目录查看 nacos.log,并进行分析。
    • 示例:default-data-my-nacos-0-pvc-23eac20f-3f2c-4c22-bf95-f58ac2b4f154/logs/nacos.log
    • my-nacos 是 release name
查看 Pod 信息

从 Pod 信息中可以看到很多有用的信息:比如容器镜像、容器 ID 等等

kubectl describe pod my-nacos-0
# Name:         my-nacos-0
# Namespace:    default
# Priority:     0
# Node:         k8s-master/172.24.4.246
# Start Time:   Thu, 23 May 2024 14:24:43 +0800
# Labels:       app.kubernetes.io/instance=my-nacos
#               app.kubernetes.io/name=nacos
#               controller-revision-hash=my-nacos-f59994b89
#               statefulset.kubernetes.io/pod-name=my-nacos-0
# Annotations:  cni.projectcalico.org/podIP: 192.168.102.198/32
#               cni.projectcalico.org/podIPs: 192.168.102.198/32
# Status:       Running
# IP:           192.168.102.198
# IPs:
#   IP:           192.168.102.198
# Controlled By:  StatefulSet/my-nacos
# Containers:
#   nacos:
#     Container ID:   docker://7ca87c84aeba62442b4357feef83c4922f730f94ed126a8f5712ffd1fad3238c
#     Image:          nacos/nacos-server:v2.2.0
#     Image ID:       docker-pullable://nacos/nacos-server@sha256:be794368c96f90e42a6dd9f288d3fb12d69608cebd782eb091a489ccb48cfd28
#     Ports:          8848/TCP, 9848/TCP, 9849/TCP, 7848/TCP
#     Host Ports:     0/TCP, 0/TCP, 0/TCP, 0/TCP
#     State:          Running
#       Started:      Thu, 23 May 2024 14:24:48 +0800
#     Ready:          True
#     Restart Count:  0
#     Limits:
#       cpu:     1
#       memory:  2Gi
#     Requests:
#       cpu:     500m
#       memory:  2Gi
#     Liveness:  http-get http://:8848/nacos/v1/console/health/liveness delay=10s timeout=10s period=5s #success=1 #failure=3
#     Startup:   http-get http://:8848/nacos/v1/console/health/readiness delay=180s timeout=10s period=5s #success=1 #failure=3
#     Environment:
#       NACOS_SERVER_PORT:           8848
#       NACOS_APPLICATION_PORT:      8848
#       PREFER_HOST_MODE:            hostname
#       MODE:                        standalone
#       SPRING_DATASOURCE_PLATFORM:  mysql
#       MYSQL_SERVICE_HOST:          <set to the key 'mysql.db.host' of config map 'nacos-cm'>   Optional: false
#       MYSQL_SERVICE_DB_NAME:       <set to the key 'mysql.db.name' of config map 'nacos-cm'>   Optional: false
#       MYSQL_SERVICE_PORT:          <set to the key 'mysql.port' of config map 'nacos-cm'>      Optional: false
#       MYSQL_SERVICE_USER:          <set to the key 'mysql.user' of config map 'nacos-cm'>      Optional: false
#       MYSQL_SERVICE_PASSWORD:      <set to the key 'mysql.password' of config map 'nacos-cm'>  Optional: false
#       MYSQL_SERVICE_DB_PARAM:      <set to the key 'mysql.param' of config map 'nacos-cm'>     Optional: false
#     Mounts:
#       /home/nacos/data from data (rw,path="data")
#       /home/nacos/logs from data (rw,path="logs")
#       /home/nacos/plugins/peer-finder from data (rw,path="peer-finder")
#       /var/run/secrets/kubernetes.io/serviceaccount from default-token-8b52b (ro)
# Conditions:
#   Type              Status
#   Initialized       True 
#   Ready             True 
#   ContainersReady   True 
#   PodScheduled      True 
# Volumes:
#   data:
#     Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
#     ClaimName:  data-my-nacos-0
#     ReadOnly:   false
# #   default-token-8b52b:
#     Type:        Secret (a volume populated by a Secret)
#     SecretName:  default-token-8b52b
#     Optional:    false
# QoS Class:       Burstable
# Node-Selectors:  <none>
# Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
#                  node.kubernetes.io/unreachable:NoExecute for 300s
# Events:
#   Type    Reason     Age    From               Message
#   ----    ------     ----   ----               -------
#  Normal  Scheduled  5m20s  default-scheduler  Successfully assigned default/my-nacos-0 to k8s-master
#  Normal  Pulled     5m17s  kubelet            Container image "nacos/nacos-server:v2.2.0" already present on machine
#  Normal  Created    5m15s  kubelet            Created container nacos
#  Normal  Started    5m15s  kubelet            Started container nacos

第 4 步:访问 Nacos

集群外访问

查看 Nacos IP 及端口:

# 获取 IP 地址
kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}"
# 172.24.4.246

# 获取节点端口
kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nacos-cs
# 32566

直接使用上面的 IP+Port 访问:

集群内访问

集群内,使用服务名称访问。

  • 格式:http://{service_name}.{namespace}.svc.cluster.local
  • 实例:http://nacos-cs.default.svc.cluster.local

集群 + MySQL 模式

此模式建立在《单机+MySQL 模式》的基础上,上面的务必了解清楚,再开始下面的操作。

第 1 步:自定义配置文件

在单机 + MySQL 的基础上,基于 nacos_values.yaml 配置文件,创建集群版配置文件 nacos_cluster_values.yaml:

  • 修改点 1:global.mode 改成 cluster
  • 修改点 2:添加 nacos.replicaCount 为 3
global:
  # 集群版
  mode: cluster

nacos:
  replicaCount: 3
  # nacos 镜像配置
  image:
    repository: nacos/nacos-server
    tag: v2.2.0
    pullPolicy: IfNotPresent
  # nacos 插件配置
  plugin:
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin
      tag: 1.1
  # 启用健康检测
  health:
    enabled: true
  # nacos 存储
  storage:
    type: mysql
    db:
      host: 172.20.134.48
      port: 32000
      name: nacos
      username: root
      password: Yumc@ru123
      param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false

# 持久化存储
persistence:
  enabled: true
  data:
    accessModes:
      - ReadWriteOnce
    # 指定 StorageClass
    storageClassName: managed-nfs-storage
    resources:
      requests:
        storage: 4Gi

# service 配置
service:
  type: NodePort
  port: 8848
  # !!! 这里并不是 8848 对应 30000 端口,实际上是 7748 对应的 30000 端口,所以此端口对于外部访问来说没有用!
  nodePort: 30000

# 资源限制(调大内存的同时,必须同时修改环境变量 JVM_XMS、JVM_XMX、JVM_XMN,否则还是使用 1g 堆内存!!!)
resources:
  requests:
    cpu: 500m
    memory: 2Gi
  limits:
    cpu: 1000m
    memory: 2Gi

第 2 步:安装 chart

helm install my-nacos-cluster ./ --values nacos_cluster_values.yaml
# NAME: my-nacos-cluster
# LAST DEPLOYED: Thu May 23 15:44:10 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3

第 3 步:查看 Pod 状态

容器从创建、运行、Ready,耗时 4m15s。

[root@k8s-master helm]# kubectl get pods -w
NAME                                      READY   STATUS    RESTARTS   AGE
my-nacos-cluster-0                        0/1     Running   0          64s
my-nacos-cluster-1                        0/1     Running   0          64s
my-nacos-cluster-2                        0/1     Running   0          64s
my-nacos-cluster-0                        1/1     Running   0          3m43s
my-nacos-cluster-1                        1/1     Running   0          3m56s
my-nacos-cluster-2                        1/1     Running   0          4m15s

第 4 步:访问 Nacos

查看 Service,找到 8848 对应的外部端口:

kubectl get services | grep nacos
# nacos-cs            NodePort    192.168.103.166   <none>        8848:31329/TCP,9848:32624/TCP,9849:30424/TCP,7848:31122/TCP      10m
# nacos-hs            ClusterIP   None              <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP                              10m

使用如下命令,获取 IP 地址:

# 获取 IP 地址
kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}"
# 172.24.4.246

集群外访问 Nacos:能看到节点有 3 个。

集群内,使用服务名称访问。

  • 格式:http://{service_name}.{namespace}.svc.cluster.local
  • 实例:http://nacos-cs.default.svc.cluster.local

第 5 步:集群扩容/缩容

方法 1:helm upgrade

修改 nacos_cluster_values.yaml,将 nacos.replicaCount 从 3 改为 4,然后直接 helm upgrade

helm upgrade my-nacos-cluster ./ --values nacos_cluster_values.yaml
# Release "my-nacos-cluster" has been upgraded. Happy Helming!
# NAME: my-nacos-cluster
# LAST DEPLOYED: Thu May 23 15:57:59 2024
# NAMESPACE: default
# STATUS: deployed
# REVISION: 2
# TEST SUITE: None
# NOTES:
# 1. Get the application URL by running these commands:
#   export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services  nacos-cs)
#   export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#   echo http://$NODE_IP:$NODE_PORT/nacos
# 2. MODE:
#    standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
#    cluster: kubectl scale sts default-nacos --replicas=3

几分钟,变成 4 个节点啦!

方法 2:kubectl scale

使用 kubectl sacle sts 指定副本数量也可实现伸缩。

kubectl scale sts my-nacos-cluster --replicas=5
# statefulset.apps/my-nacos-cluster scaled

坐等一小会,变成 5 个节点啦!

缩容,也是一样的做法哦。😊

chart 配置参数

Nacos Chart 配置参数如下:

ParameterDescriptionDefault
global.modeRun Mode (quickstart, standalone, cluster; )standalone
resourcesThe [resources] to allocate for nacos container{}
nodeSelectorNacos labels for pod assignment{}
affinityNacos affinity policy{}
tolerationsNacos tolerations{}
resources.requests.cpunacos requests cpu resource500m
resources.requests.memorynacos requests memory resource2G
nacos.replicaCountNumber of desired nacos pods, the number should be 1 as run standalone mode1
nacos.image.repositoryNacos container image namenacos/nacos-server
nacos.image.tagNacos container image taglatest
nacos.image.pullPolicyNacos container image pull policyIfNotPresent
nacos.plugin.enableNacos cluster plugin that is auto scaletrue
nacos.plugin.image.repositoryNacos cluster plugin image namenacos/nacos-peer-finder-plugin
nacos.plugin.image.tagNacos cluster plugin image tag1.1
nacos.health.enabledEnable health check or notfalse
nacos.env.preferhostmodeEnable Nacos cluster node domain name supporthostname
nacos.env.serverPortNacos port8848
nacos.storage.typeNacos data storage method mysql or embedded. The embedded supports either standalone or cluster modeembedded
nacos.storage.db.hostmysql host
nacos.storage.db.namemysql database name
nacos.storage.db.portmysql port3306
nacos.storage.db.usernameusername of database
nacos.storage.db.passwordpassword of database
nacos.storage.db.paramDatabase url parametercharacterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
persistence.enabledEnable the nacos data persistence or notfalse
persistence.data.accessModesNacos data pvc access modeReadWriteOnce
persistence.data.storageClassNameNacos data pvc storage class namemanual
persistence.data.resources.requests.storageNacos data pvc requests storage5G
service.typehttp service typeNodePort
service.porthttp service port8848
service.nodePorthttp service nodeport30000
ingress.enabledEnable ingress or notfalse
ingress.annotationsThe annotations used in ingress{}
ingress.hostsThe host of nacos service in ingress rulenacos.example.com

入坑指南

坑 1:service.nodePort 映射的是不是 HTTP 端口?

上面配置参数:service.nodePort 的解释是 http service nodeport,那么 http 端口只有 8848。但实际真的是这样吗?不懂就查 😊

查看 Service 信息

从 service 上看,端口映射如下:

  • http 8848/TCP -》http 32566/TCP
  • client-rpc 9848/TCP -》client-rpc 32724/TCP
  • raft-rpc 9849/TCP -》raft-rpc 32656/TCP
  • old-raft-rpc 7848/TCP -》old-raft-rpc 30000/TCP

所以,service.nodePort 对应的是 old-raft-rpc 端口,并不是 8848 http 端口。

另外一个坑,这里 8848 和 9848 应该按照偏移量(offset)来生成,但实际是随机值,会导致集群外 Nacos 客户端无法正常连接到 Nacos。

kubectl describe service nacos-cs
# Name:                     nacos-cs
# Namespace:                default
# Labels:                   app.kubernetes.io/managed-by=Helm
# Annotations:              meta.helm.sh/release-name: my-nacos
#                           meta.helm.sh/release-namespace: default
# Selector:                 app.kubernetes.io/instance=my-nacos,app.kubernetes.io/name=nacos
# Type:                     NodePort
# IP:                       192.168.103.146
# Port:                     http  8848/TCP
# TargetPort:               8848/TCP
# NodePort:                 http  32566/TCP
# Endpoints:                192.168.102.217:8848
# Port:                     client-rpc  9848/TCP
# TargetPort:               9848/TCP
# NodePort:                 client-rpc  32724/TCP
# Endpoints:                192.168.102.217:9848
# Port:                     raft-rpc  9849/TCP
# TargetPort:               9849/TCP
# NodePort:                 raft-rpc  32656/TCP
# Endpoints:                192.168.102.217:9849
# Port:                     old-raft-rpc  7848/TCP
# TargetPort:               7848/TCP
# NodePort:                 old-raft-rpc  30000/TCP
# Endpoints:                192.168.102.217:7848
# Session Affinity:         None
# External Traffic Policy:  Cluster
# Events:                   <none>

排查 templates/service.yaml

查看 templates/service.yaml,发现确实把 7848 指向了 30000 端口(service.nodePort)…

  • 8848 HTTP 端口
  • 9848 客户端 RPC 端口
  • 9849 Raft RPC 端口
  • 7848 兼容 1.4.x Raft RPC 端口

至此,真相大白!!!🚀🚀🚀

坑 2:resources 内存配置,不会改变 JVM 启动参数

需要注意的是,即便 resources 的内存调整为 10Gi,但是容器也只会使用 1g 作为堆内存大小。

因为容器使用环境变量 JVM_XMX、JVM_XMS、JVM_XMN 指定堆内存最大、最小、新生代大小。

查看 Nacos Chart 模板,发现没有地方可以配置环境变量。😂

那怎么改才能实现呢?😊

  • 添加新参数,将新参数放入 ConfigMap,最后在 StatefulSet 中配置环境变量并引用 ConfigMap。
  • 涉及 templates 下的 configmap.yaml 和 statefulset.yaml 模板文件。

参考

1.https://artifacthub.io/packages/helm/kubegemsapp/nacos
2.https://github.com/nacos-group/nacos-k8s/

相关博文

1.第 1 篇 Helm 简介及安装
2.第 2 篇 Helm 部署 MySQL【入门案例】
3.第 3 篇 Helm 命令、环境变量、相关目录
4.第 4 篇 Chart 仓库详解
5.第 5 篇 Chart 文件结构详解
6.第 6 篇 自定义 Helm Chart
7.第 7 篇 Helm 部署 Nacos【详细步骤】
8.第 8 篇 Chart 修改入门示例:Nacos
9.第 9 篇 Helm 部署 Seata Server
10.第 10 篇 Chart 修改完美示例:Seata Server
11.第 11篇 Helm 部署 RabbitMQ
12.第 12 篇 Helm 部署 Redis
13.第13 篇 Helm 部署 ElasticSearch

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

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

相关文章

Java 入门指南:Java 并发编程 —— 同步工具类 Phaser(相位器)

文章目录 同步工具类Phaser主要特点核心方法使用步骤适用场景使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之间进行协调和通信&#xff0c;特别…

Ton链历险记(一)

系列文章目录 文章目录 系列文章目录前言第一天、FunC环境安装总结 前言 欢迎来到神秘的web3小镇&#xff0c;这里是充满未知和魔法的土地&#xff0c;神兽出没&#xff0c;超能力攻击&#xff0c;卡牌收集。。。 穷困却又励志的无天赋法师木森。因为没有交够保护费&#xff…

Spring和Spring FrameWork有什么关系?两者是同一个东西吗?

Spring和Spring Framework之间的关系可以归结为以下几点&#xff1a; 广义与狭义的理解 广义上的Spring&#xff1a; 广义上的Spring泛指以Spring Framework为基础的整个Spring技术栈。Spring已经发展成为一个由多个不同子项目&#xff08;模块&#xff09;组成的成熟技术体系…

R语言统计分析——功效分析2(t检验,ANOVA)

参考资料&#xff1a;R语言实战【第2版】 1、t检验 对于t检验&#xff0c;pwr.t.test()函数提供了许多有用的功效分析选项&#xff0c;如下&#xff1a; pwr.t.test(n,d,sig.level,power,type,alternative) 其中&#xff0c;n为样本大小&#xff1b; d为效应值&#xff0c;即…

【每日一题】LeetCode 98.验证二叉搜索树(树、深度优先搜索、二叉搜索树、二叉树)

【每日一题】LeetCode 98.验证二叉搜索树&#xff08;树、深度优先搜索、二叉搜索树、二叉树&#xff09; 题目描述 给定一个二叉树的根节点 root&#xff0c;判断该二叉树是否是一个有效的二叉搜索树&#xff08;BST&#xff09;。有效的二叉搜索树需要满足以下条件&#xf…

R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例

偶然间读到一篇文章&#xff0c;分享06年《书摘》的内容&#xff0c;今天来看都不过时&#xff0c;所以起了找下这本老杂志合集的心思。 傅佩荣先生《哲学与人生》选段 “如果有人觉得活着很辛苦&#xff0c;面对自己又感觉无聊乏味&#xff0c;那么他应该多接触自然界。我有个…

9.11.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) {//设置时钟ui->setupUi(this);startTimer(1000);//文本框label居中对齐ui->label_2->setAlignment(Qt::AlignCenter);connect(this,&Widget::my_sign…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…

国产视频转换HDMI1.4转单/双MIPI DSI/CSI LT6911C芯片方案,带音频输出,QFN64封装 Lontium

LT6911C:HDMI 1.4 TO MIPI DSI/CSI 芯片简介&#xff1a; LT6911C是一款高性能的HDMI1.4转换器MIPI DSI/CSI芯片用于VR/智能手机/显示应用。对于MIPI DSI/CSI输出&#xff0c;LT6911C功能可配置单端口或双端口MIPIDSI/CSI 1高速时钟通道和1~4个高速数据通道最大1.5Gb/s/lane&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…

【算法思想·二叉搜索树】特性篇

本文参考labuladong算法笔记[二叉搜索树心法&#xff08;特性篇&#xff09; | labuladong 的算法笔记] 1、概述 首先&#xff0c;BST&#xff08;binary search tree&#xff09; 的特性大家应该都很熟悉了&#xff08;详见基础知识章节的 二叉树基础&#xff09;&#xff1a…

【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动

把QGroundControl地面站添加到Ubuntu侧边菜单栏启动 简介准备工作步骤 1: 创建 Desktop Entry 文件步骤 2: 编辑 Desktop Entry 文件步骤 3: 刷新应用程序菜单步骤 4: 将 QGroundControl 固定到侧边栏 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS 简介 QGroundControl 是…

[综述笔记]Federated learning for medical image analysis: A survey

论文网址&#xff1a;Federated learning for medical image analysis: A survey - ScienceDirect 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&…

C++ Primer Plus(速记版)-基本语言

序章 快速入门 初窥输入/输出 C 并没有直接定义进行输入或输出(I/O)的任何语句&#xff0c;这种功能是由标准库提供的。 本书的大多数例子都使用了处理格式化输入和输出的 iostream 库。 iostream 库的基础是两种命名为 istream 和 ostream 的类型&#xff0c;分别表示输入流和…

卷积神经网络-经典分类网络结构(LetNet-5,AlexNet)

目录 一&#xff1a;LeNet-5解析 1.网络结构 输入层&#xff1a; 1.conv1&#xff1a; 2.pool1层&#xff1a; 3.conv2&#xff1a; 4.pool2&#xff1a; 5.fc3&#xff0c;fc4&#xff1a; 6.output层: 2.参数形状 二&#xff1a;AlexNet 1层&#xff1a; 2层&am…

招生管理|基于Java+vue的招生管理系统(源码+数据库+文档)

招生管理|学生管理系统|高校招生管理 目录 基于Javavue的招生管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|…

什么是OAuth 2.0?OAuth 2.0的工作流程是什么?与OAuth 1.0有哪些区别?

在浏览网页时&#xff0c;你肯定会遇到允许你使用社交媒体账户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。OAuth 2.0是对OAuth 1.0的彻底重写&#xff0c;OAuth 2.0与OAuth 1.0或1.1不向后兼容。 1. OAuth产生背景 为了更好的理解OAuth&#xff0c;我们假设有如…

CAN总线-STM32上CAN外设

1.STM32 CAN外设简介 2.CAN网拓扑结构 3.CAN收发器电路 4.CAN框图 5.CAN基本结构 6.发送过程 7.接收过程 8.发送和接收配置位 9.标识过滤器&#xff08;重点&#xff09; 这里的FBMX模式设置的列表模式&#xff1a;你在列表中输入你想要的报文ID&#xff0c;不在你列表中的ID屏…

css grid布局属性详解

Grid布局 前言一、认识Grid1.1容器和项目1.2行和列1.3单元格和网格线 二、容器属性2.1.grid-template-columns与grid-template-rows属性2.1.1 直接使用长度单位比如px2.1.2 使用百分比 %2.1.3 使用repeat函数2.1.4 按比例划分 fr 关键字2.1.5 自动填充 auto 关键字2.1.6 最大值…

c4d的重命名工具(支持模型和材质) 及 python窗口定义

不是我牛逼&#xff0c;是豆包牛逼&#xff01; 一个简化版的窗口 import c4d from c4d import guiclass MyDialog(gui.GeDialog):def __init__(self):super().__init__()self.SetTitle("My Dialog")def CreateLayout(self):# 设置对话框布局return Truemy_dialog …