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

在Openshift(K8S)上通过EMQX Operator部署Emqx集群

EMQX Operator 简介

EMQX Broker/Enterprise 是一个云原生的 MQTT 消息中间件。 我们提供了 EMQX Kubernetes Operator 来帮助您在 Kubernetes 的环境上快速创建和管理 EMQX Broker/Enterprise 集群。 它可以大大简化部署和管理 EMQX 集群的流程,对于管理和配置的知识要求也更低。它把部署和管理的工作变成一种低成本的、标准化的、可重复性的能力。

EMQX Operator 包括但不限于以下功能:

简化 EMQX 部署:通过 EMQX 自定义资源声明 EMQX 集群,并快速的部署,更多的内容,请查看快速开始。

管理 EMQX 集群:对 EMQX 进行自动化运维操作,包括集群升级、运行时数据持久化、根据 EMQX 的状态更新 Kubernetes 的资源等,更多的内容,请查看管理 EMQX 集群。

img

EMQX 与 EMQX Operator 的兼容性列表

EMQX 企业版

EMQX 企业版EMQX Operator VersionAPIVersionKind
4.3.x (包含) ~ 4.41.2.1, 1.2.2, 1.2.3apps.emqx.io/v1beta3EmqxEnterprise
4.4.6 (包含) ~ 4.4.81.2.5apps.emqx.io/v1beta3EmqxEnterprise
4.4.8 (包含) ~ 4.4.141.2.6, 1.2.7, 1.2.8, 2.0.0, 2.0.1, 2.0.2, 2.0.3apps.emqx.io/v1beta3EmqxEnterprise
4.4.14 (包含) 或更高 4.4.x2.1.0, 2.1.1apps.emqx.io/v1beta4EmqxEnterprise
5.0.0 (包含) ~ 5.0.232.0.0, 2.0.1, 2.0.2, 2.0.3, 2.1.0, 2.1.1apps.emqx.io/v2alpha1EMQX
5.1.1 或更高2.2.0apps.emqx.io/v2beta1EMQX

EMQX 开源版

EMQX 开源版EMQX Operator VersionAPIVersionKind
4.3.x (包含) ~ 4.41.2.1, 1.2.2, 1.2.3apps.emqx.io/v1beta3EmqxBroker
4.4.6 (包含) ~ 4.4.81.2.5apps.emqx.io/v1beta3EmqxBroker
4.4.8 (包含) ~ 4.4.141.2.6, 1.2.7, 1.2.8, 2.0.0, 2.0.1, 2.0.2, 2.0.3apps.emqx.io/v1beta3EmqxBroker
4.4.14 或更高 4.4.x2.1.0, 2.1.1apps.emqx.io/v1beta4EmqxBroker
5.0.6 (包含) ~ 5.0.82.0.0, 2.0.1, 2.0.3apps.emqx.io/v2alpha1EMQX
5.0.8 (包含) ~ 5.0.142.0.2apps.emqx.io/v2alpha1EMQX
5.0.14 (包含) ~ 5.0.232.1.0, 2.1.1apps.emqx.io/v2alpha1EMQX
5.1.1 或更高2.2.0apps.emqx.io/v2beta1EMQX

如何选择 Kubernetes 版本

EMQX Operator 要求 Kubernetes 集群的版本号 >=1.24

Kubernetes 版本EMQX Operator 兼容性注释
1.24 更高支持所有功能
1.22 ( 包含) ~ 1.23支持,但是不包含 MixedProtocolLBServiceEMQX 集群只能在 LoadBalancer 类型的 Service 中使用一个协议,例如 TCP 或 UDP。
1.21 ( 包含) ~ 1.22支持,但是不包含 Pod 删除开销EMQX Core + Replicant 模式集群时,更新 EMQX 集群无法准确的删除 Pod。
1.20 ( 包含) ~ 1.21支持,但是如果使用 NodePort 类型的 Service,需要手动管理 .spec.ports[].nodePort更多的详情,请查看 Kubernetes changelog.
1.16 ( 包含) ~ 1.20支持,但是不推荐,因为缺乏足够的测试
低于 1.16不支持低于 1.16 版本的 Kubernetes 不支持 apiextensions/v1 APIVersion。

快速开始

在本文中,我们将指导您完成高效设置 EMQX Operator 环境、安装 EMQX Operator,然后使用它部署 EMQX 所需的步骤。通过遵循本节中概述的指南,您将能够使用 EMQX Operator 有效地安装和管理 EMQX。

准备环境

在部署 EMQX Operator 之前,请确认以下组件已经准备就绪:

  • 一个正在运行的 Kubernetes 集群,关于 Kubernetes 的版本,请查看如何选择 Kubernetes 版本
  • 一个可以访问 Kubernetes 集群的 kubectl 工具。您可以使用 kubectl cluster-info 命令检查 Kubernetes 集群的状态。
  • Helm 3 或更高

安装 EMQX Operator

  1. 安装 cert-manger

    TIP

    需要 cert-manager 版本 1.1.6 或更高。如果 cert-manager 已经安装并启动,请跳过此步骤。

    你可以使用 Helm 来安装 cert-manager

$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ helm upgrade --install cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--set installCRDs=true
  1. 或者按照 cert-manager 安装指南来安装它。

    WARNING

    如果您在 Google Kubernetes Engine(GKE) 上安装它。那么通过默认配置安装可能会导致 bootstraping 问题。所以通过增加 --set global.leaderElection.namespace=cert-manager 这个配置为 leader 选举使用不同的命名空间。查看 cert-manager 兼容性

  2. 运行以下命令来安装 EMQX Operator。

    bash

    $ helm repo add emqx https://repos.emqx.io/charts
    $ helm repo update
    $ helm upgrade --install emqx-operator emqx/emqx-operator \--namespace emqx-operator-system \--create-namespace
    
  3. 等待 EMQX Operator 就绪。

$ kubectl wait --for=condition=Ready pods -l "control-plane=controller-manager" -n emqx-operator-systempod/emqx-operator-controller-manager-57bd7b8bd4-h2mcr condition met

现在你已经成功的安装 EMQX Operator,你可以继续下一步了。在部署 EMQX 部分中,您将学习如何使用 EMQX Operator 来部署 EMQX。

部署 EMQX

  • EMQX Enterprise 5
apiVersion: apps.emqx.io/v2beta1
kind: EMQX
metadata:name: emqx-ee
spec:image: emqx/emqx-enterprise:5.6
  • EMQX Open Source 5

    apiVersion: apps.emqx.io/v2beta1
    kind: EMQX
    metadata:name: emqx
    spec:image: emqx:5
    
  • EMQX Enterprise 4

    apiVersion: apps.emqx.io/v1beta4
    kind: EmqxEnterprise
    metadata:name: emqx-ee
    spec:template:spec:emqxContainer:image:repository: emqx/emqx-eeversion: 4.4.19
    
  • EMQX Open Source 4

apiVersion: apps.emqx.io/v1beta4
kind: EmqxBroker
metadata:name: emqx
spec:template:spec:emqxContainer:image:repository: emqxversion: 4.4.19
  1. 将下面的 YAML 配置文件保存为 emqx.yaml
apiVersion: apps.emqx.io/v2beta1
kind: EMQX
metadata:name: emqx-ee
spec:image: emqx/emqx-enterprise:5.6

并使用 kubectl apply 命令来部署 EMQX。

$ kubectl apply -f emqx.yaml

关于 EMQX 自定义资源的更多信息,请查看 API 参考

  1. 检查 EMQX 集群状态,请确保 STATUS 为 Running,这可能需要一些时间等待 EMQX 集群准备就绪。
$ kubectl get emqxNAME      IMAGE                        STATUS    AGE
emqx-ee   emqx/emqx-enterprise:5.1.0   Running   2m55s

在OCP上部署EMQX

1.安装 cert-manger

cert-manager Operator for Red Hat OpenShift

安装完

namespace : cert-manager-operator下效果如下
在这里插入图片描述

namespace : cert-manager下效果如下

在这里插入图片描述

2.安装EMQX Operator

版本选择:

EMQX 开源版 :4.4.14

EMQX Operator Version : 2.2.22

$ helm search repo emqx/emqx-operator --versions
$ helm pull emqx/emqx-operator --version 2.2.22
# 解压后安装
$ helm install emqx-operator -f values.yaml .
$ oc wait --for=condition=Ready pods -l "control-plane=controller-manager" -n emqx-operator-system
pod/emqx-operator-controller-manager condition met

3.安装EMQX

storageClassName 填写为自己的。

apiVersion: apps.emqx.io/v1beta4
kind: EmqxBroker
metadata:name: emqx
spec:replicas: 1persistent:metadata:name: emqxspec:accessModes:- ReadWriteOnceresources:requests:storage: 200MistorageClassName: xxxxtemplate:spec:emqxContainer:resources:limits:cpu: '1'memory: 4Giimage:repository: emqxversion: 4.4.14volumeMounts:- mountPath: /opt/emqx/etc/emqx.confname: emqx-config-volumesubPath: emqx.confvolumes:- configMap:name: emqx-configname: emqx-config-volume

声明emqx-config,可以根据需求自己修改。

##不允许匿名登录
allow_anonymous = false
TCP协议透传 [需要nginx负载均衡, 无则不开启]
listener.tcp.external.proxy_protocol = on
## WS协议路径
listener.ws.external.mqtt_path = /ws
## WSS协议路径
listener.wss.external.mqtt_path = /ws
kind: ConfigMap
apiVersion: v1
metadata:name: emqx-config
data:emqx.conf: |-cluster.name = emqxclcluster.proto_dist = inet_tcpcluster.discovery = manualcluster.autoheal = oncluster.autoclean = 5mnode.name = emqx@127.0.0.1node.cookie = emqxsecretcookienode.data_dir = datanode.global_gc_interval = 15mnode.crash_dump = log/crash.dumpnode.dist_use_interface = 0.0.0.0node.dist_listen_min = 6369node.dist_listen_max = 6369node.backtrace_depth = 16rpc.mode = asyncrpc.async_batch_size = 256rpc.port_discovery = statelessrpc.connect_timeout = 5srpc.send_timeout = 5srpc.authentication_timeout = 5srpc.call_receive_timeout = 15srpc.socket_keepalive_idle = 900srpc.socket_keepalive_interval = 75srpc.socket_keepalive_count = 9rpc.socket_sndbuf = 1MBrpc.socket_recbuf = 1MBrpc.socket_buffer = 1MBlog.to = filelog.level = warninglog.dir = loglog.file = emqx.loglog.formatter = textlog.rotation = onlog.rotation.size = 10MBlog.rotation.count = 5listener.tcp.external.proxy_protocol = onallow_anonymous = trueacl_nomatch = allowacl_file = etc/acl.confenable_acl_cache = onacl_cache_max_size = 32acl_cache_ttl = 1macl_deny_action = ignoreflapping_detect_policy = 30, 1m, 5mauth_order = noneacl_order = nonemqtt.max_packet_size = 1MBmqtt.max_clientid_len = 65535mqtt.max_topic_levels = 128mqtt.max_qos_allowed = 2mqtt.max_topic_alias = 65535mqtt.retain_available = truemqtt.wildcard_subscription = truemqtt.shared_subscription = truemqtt.exclusive_subscription = falsemqtt.ignore_loop_deliver = falsemqtt.strict_mode = falsezone.external.idle_timeout = 15szone.external.enable_acl = onzone.external.enable_ban = onzone.external.enable_stats = onzone.external.acl_deny_action = ignorezone.external.force_gc_policy = 16000|16MBzone.external.keepalive_backoff = 0.75zone.external.max_subscriptions = 0zone.external.upgrade_qos = offzone.external.max_inflight = 32zone.external.retry_interval = 30szone.external.max_awaiting_rel = 100zone.external.await_rel_timeout = 300szone.external.session_expiry_interval = 2hzone.external.max_mqueue_len = 1000zone.external.mqueue_priorities = nonezone.external.mqueue_default_priority = highestzone.external.mqueue_store_qos0 = truezone.external.enable_flapping_detect = offzone.external.use_username_as_clientid = falsezone.external.ignore_loop_deliver = falsezone.external.strict_mode = falsezone.internal.allow_anonymous = truezone.internal.enable_stats = onzone.internal.enable_acl = offzone.internal.acl_deny_action = ignorezone.internal.max_subscriptions = 0zone.internal.max_inflight = 128zone.internal.max_awaiting_rel = 1000zone.internal.max_mqueue_len = 10000zone.internal.mqueue_store_qos0 = truezone.internal.enable_flapping_detect = offzone.internal.ignore_loop_deliver = falsezone.internal.strict_mode = falsezone.internal.bypass_auth_plugins = truelistener.tcp.external = 0.0.0.0:1883listener.tcp.external.acceptors = 8listener.tcp.external.max_connections = 1024000listener.tcp.external.max_conn_rate = 1000listener.tcp.external.active_n = 100listener.tcp.external.zone = externallistener.tcp.external.access.1 = allow alllistener.tcp.external.backlog = 1024listener.tcp.external.send_timeout = 15slistener.tcp.external.send_timeout_close = onlistener.tcp.external.nodelay = truelistener.tcp.external.reuseaddr = truelistener.tcp.internal = 127.0.0.1:11883listener.tcp.internal.acceptors = 4listener.tcp.internal.max_connections = 1024000listener.tcp.internal.max_conn_rate = 1000listener.tcp.internal.active_n = 1000listener.tcp.internal.zone = internallistener.tcp.internal.backlog = 512listener.tcp.internal.send_timeout = 5slistener.tcp.internal.send_timeout_close = onlistener.tcp.internal.recbuf = 64KBlistener.tcp.internal.sndbuf = 64KBlistener.tcp.internal.nodelay = falselistener.tcp.internal.reuseaddr = truelistener.ssl.external = 8883listener.ssl.external.acceptors = 16listener.ssl.external.max_connections = 102400listener.ssl.external.max_conn_rate = 500listener.ssl.external.active_n = 100listener.ssl.external.zone = externallistener.ssl.external.access.1 = allow alllistener.ssl.external.handshake_timeout = 15slistener.ssl.external.keyfile = etc/certs/key.pemlistener.ssl.external.certfile = etc/certs/cert.pemlistener.ssl.external.cacertfile = etc/certs/cacert.pemcrl_cache_http_timeout = 15scrl_cache_refresh_interval = 15mlistener.ssl.external.ciphers = TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHAlistener.ssl.external.recbuf = 4KBlistener.ssl.external.sndbuf = 4KBlistener.ssl.external.reuseaddr = truelistener.ws.external = 8083listener.ws.external.mqtt_path = /wslistener.ws.external.acceptors = 4listener.ws.external.max_connections = 102400listener.ws.external.max_conn_rate = 1000listener.ws.external.active_n = 100listener.ws.external.zone = externallistener.ws.external.access.1 = allow alllistener.ws.external.backlog = 1024listener.ws.external.send_timeout = 15slistener.ws.external.send_timeout_close = onlistener.ws.external.nodelay = truelistener.ws.external.mqtt_piggyback = multiplelistener.ws.external.check_origin_enable = falselistener.ws.external.allow_origin_absence = truelistener.ws.external.check_origins = http://localhost:18083, http://127.0.0.1:18083listener.wss.external = 8084listener.wss.external.mqtt_path = /wslistener.wss.external.acceptors = 4listener.wss.external.max_connections = 102400listener.wss.external.max_conn_rate = 1000listener.wss.external.active_n = 100listener.wss.external.zone = externallistener.wss.external.access.1 = allow alllistener.wss.external.keyfile = etc/certs/key.pemlistener.wss.external.certfile = etc/certs/cert.pemlistener.wss.external.ciphers = TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHAlistener.wss.external.backlog = 1024listener.wss.external.send_timeout = 15slistener.wss.external.send_timeout_close = onlistener.wss.external.mqtt_piggyback = multiplelistener.wss.external.check_origin_enable = falselistener.wss.external.allow_origin_absence = truelistener.wss.external.check_origins = https://localhost:8084, https://127.0.0.1:8084modules.loaded_file = data/loaded_modulesmodule.presence.qos = 1plugins.etc_dir = etc/plugins/plugins.loaded_file = data/loaded_pluginsplugins.expand_plugins_dir = etc/plugins/broker.sys_interval = 1mbroker.sys_heartbeat = 30sbroker.session_locking_strategy = quorumbroker.shared_subscription_strategy = randombroker.shared_dispatch_ack_enabled = falsebroker.route_batch_clean = offsysmon.long_gc = 0sysmon.long_schedule = 240mssysmon.large_heap = 8MBsysmon.busy_port = falsesysmon.busy_dist_port = trueos_mon.cpu_check_interval = 60sos_mon.cpu_high_watermark = 80%os_mon.cpu_low_watermark = 60%os_mon.mem_check_interval = 60sos_mon.sysmem_high_watermark = 70%os_mon.procmem_high_watermark = 5%vm_mon.check_interval = 30svm_mon.process_high_watermark = 80%vm_mon.process_low_watermark = 60%alarm.actions = log,publishalarm.size_limit = 1000alarm.validity_period = 24h

默认的Operator不会安装dashborad,所以下一步我们需要安装

service.yaml

kind: Service
apiVersion: v1
metadata:name: emqx
spec:ports:- name: http-management-8081protocol: TCPport: 8081targetPort: 8081- name: http-dashboard-18083protocol: TCPport: 18083targetPort: 18083- name: ws-8083protocol: TCPport: 8083targetPort: 8083type: ClusterIPselector:apps.emqx.io/instance: emqxapps.emqx.io/managed-by: emqx-operator

route.yaml
host字段需要修改

kind: Route
apiVersion: route.openshift.io/v1
metadata:name: emqx-dashborad
spec:host: xxxxxxto:kind: Servicename: emqxweight: 100port:targetPort: http-dashboard-18083wildcardPolicy: Nonetls: null

登入验证:

http://${host}

用户名:admin

密码:public

相关文章:

在Openshift(K8S)上通过EMQX Operator部署Emqx集群

EMQX Operator 简介 EMQX Broker/Enterprise 是一个云原生的 MQTT 消息中间件。 我们提供了 EMQX Kubernetes Operator 来帮助您在 Kubernetes 的环境上快速创建和管理 EMQX Broker/Enterprise 集群。 它可以大大简化部署和管理 EMQX 集群的流程,对于管理和配置的知…...

Python酷玩之旅_数据分析入门(matplotlib)

导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历,今年的日子已划到了2024年10月19日,今天…...

uiautomatorviewer安卓9以上正常使用及问题处理

一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…...

Go语言gRPC快速入门

文章目录 前言gRPC是什么Go语言的gRPC技术栈准备工作接口定义代码生成服务端代码编写客户端代码编写效果演示完整代码链接最后 前言 你好,我是醉墨居士,这篇博客想帮助初学者能够快速入门gRPC,希望能够为你节省宝贵的时间,让时间…...

Golang | Leetcode Golang题解之第479题最大回文数乘积

题目: 题解: func largestPalindrome(n int) int {if n 1 {return 9}upper : int(math.Pow10(n)) - 1for left : upper; ; left-- { // 枚举回文数的左半部分p : leftfor x : left; x > 0; x / 10 {p p*10 x%10 // 翻转左半部分到其自身末尾&…...

UDP协议讲解

预备知识: 端口号port: 我们在正常网络通信时,实际上是进程在互相通信。 我们所有的网络通信的行为,本质上都是进程间通信。 对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…...

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...

CSDN Markdown 编辑器语法大全

Markdown 是一种轻量级标记语言,它以简洁、易读易写的特点,被广泛应用于技术文档、博客文章、笔记等领域。CSDN 的 Markdown 编辑器为用户提供了丰富的功能,让用户能够轻松地创建格式规范、内容丰富的文档。以下是一份详细的 CSDN Markdown 编…...

TCP/IP 协议【四次挥手】简要说明

四次挥手是为了确保数据的完整性和可靠性,解决的主要问题是双方在断开连接时,可能还有未完成传输的数据或者未被接收的数据。 具体来说,四次挥手解决的问题是: 第一次挥手(发送方向接收方发送FIN包)&#…...

第11篇:网络安全协议

目录 引言 11.1 安全套接字层(SSL)和传输层安全(TLS)协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网(VPN)和 IP 安全协议(IPSec) 11.2.1 VPN 的工…...

ES-入门-javaApi-文档-新增-删除

新增指定索引的文档数据的代码如下: package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…...

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…...

【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例

在前面的文档中,介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3(二)在Unity中配置Pico SDK 本文将介绍如何运行一个简单…...

C#中委托的应用与示例

委托 委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。 可以委托将看作一个包含有序方法列表…...

算法: 模拟题目练习

文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…...

软考中级科目怎么选?软考中级证书有什么用?

❇有计算机背景&#xff1a; 建议选择软件设计师或网络工程师。软件设计师更适合软件工程专业的同学报考&#xff0c;而网络工程师更适合网络工程专业的朋友&#xff08;仅供参考&#xff09;。 ❇没有计算机背景&#xff1a; 建议选择系统集成项目管理工程师作为入门科目。…...

HTTP 请求的请求体是什么

HTTP 请求的请求体(request body)是指在 HTTP 请求中除了请求行(request line)、请求头(headers)之外的实际数据部分。请求体通常包含用于向服务器发送数据的信息,这些信息可以是表单数据、JSON 对象、XML 文档或其他任何形式的数据。 http请求一般包含的内容 HTTP(超…...

助力语音技术发展,景联文科技提供语音数据采集服务

语音数据采集是语音识别技术、语音合成技术以及其他语音相关应用的重要基础。采集高质量的语音数据有助于提高语音识别的准确性&#xff0c;同时也能够促进语音技术的发展。 景联文科技作为专业的数据采集标注公司&#xff0c;支持语音数据采集。可通过手机、专业麦克风阵列、专…...

PyTorch搭建神经网络入门教程

PyTorch搭建神经网络入门教程 在机器学习和深度学习中&#xff0c;神经网络是最常用的模型之一&#xff0c;而 PyTorch 是一个强大的深度学习框架&#xff0c;适合快速开发与研究。在这篇文章中&#xff0c;我们将带你一步步搭建一个简单的神经网络&#xff0c;并介绍 PyTorch…...

你的电脑能不能安装windows 11,用这个软件检测下就知道了

为了应对Windows 11的推出&#xff0c;一款名为WhyNotWin11的创新型诊断软件应运而生。这个强大的工具不仅仅是一个简单的兼容性检测器&#xff0c;它更像是一位细心的数字医生&#xff0c;全方位评估您的计算机是否准备好迎接微软最新操作系统的挑战。 WhyNotWin11的功能远超…...

StructBERT中文句子匹配效果展示:AI客服对话中用户多轮提问语义连贯性分析

StructBERT中文句子匹配效果展示&#xff1a;AI客服对话中用户多轮提问语义连贯性分析 1. 项目背景与工具介绍 StructBERT中文句子相似度分析工具是基于阿里达摩院开源的先进预训练模型开发的本地化语义匹配解决方案。这个工具专门针对中文语言特点进行了深度优化&#xff0c…...

Qwen3-14B-Int4-AWQ辅助系统设计:从需求到UML类图与序列图的自动生成

Qwen3-14B-Int4-AWQ辅助系统设计&#xff1a;从需求到UML类图与序列图的自动生成 1. 系统设计的新助手 想象一下这样的场景&#xff1a;你刚开完需求讨论会&#xff0c;脑子里装满了各种功能模块和交互流程的构想。现在需要把这些想法转化为规范的UML设计文档&#xff0c;但手…...

SDMatte助力电商应用:批量生成商品透明背景主图实战

SDMatte助力电商应用&#xff1a;批量生成商品透明背景主图实战 1. 电商行业的商品图处理痛点 电商商家每天都要处理大量商品图片&#xff0c;其中最常见也最耗时的任务之一就是抠图。无论是上新商品还是优化现有商品展示&#xff0c;都需要将商品从原始背景中分离出来&#…...

labelme安装在D盘【详细教程】

github地址 https://github.com/Wkentaro/labelme 一、安装步骤&#xff08;CMD 直接复制执行&#xff09; 以管理员身份打开 CMD&#xff08;WinR 输入 cmd 回车&#xff0c;右键以管理员运行&#xff09;依次执行下面的命令&#xff0c;每一行输完按回车&#xff1a; # 1. 进…...

别再死记硬背了!用LL(1)预测分析法图解编译原理语法分析,5分钟搞懂First和Follow集

用派对邀请链和拆礼物理解LL(1)语法分析&#xff1a;First集与Follow集的趣味图解 想象你正在策划一场派对&#xff0c;需要根据客人的喜好安排座位。First集就像拆开礼物盒时最先看到的物品&#xff0c;而Follow集则是始终跟在某位客人身后的"小跟班"。这种生活化的…...

2025年大模型年度复盘:RL、Agent与Omni的技术趋势解读

一、项目介绍准备 项目 1&#xff1a;基于 RAG 的大语言模型关系抽取 1、为什么不用传统语义相似度检索&#xff0c;改用关系原型检索&#xff1f; 传统相似度检索易召回伪近邻样本&#xff08;语义相近、头尾实体不同→关系不同&#xff09;&#xff0c;干扰模型判断。 我先把…...

namespace使用

可以&#xff0c;我给你把这张图里这三种写法彻底捋清楚。你现在主要容易混的点其实是&#xff1a;namespace 到底是干嘛的N::a、using N::b、using namespace N 这三种到底差在哪所谓“冲突”到底是什么冲突1. namespace 到底是什么命名空间本质上就是&#xff1a;给名字分组&…...

别让ChatGPT变成你的安全漏洞:OWASP LLM Top 10(2024)实战避坑指南

别让ChatGPT变成你的安全漏洞&#xff1a;OWASP LLM Top 10&#xff08;2024&#xff09;实战避坑指南 当大型语言模型&#xff08;LLM&#xff09;从实验室走向企业级应用时&#xff0c;安全风险正以指数级速度增长。2023年某金融科技公司因提示词注入导致百万用户数据泄露的案…...

程序员十年职场经验:技术成长与生存法则

1. 程序员十年成长的血泪经验谈作为一个在代码堆里摸爬滚打十多年的老程序员&#xff0c;今天想和各位同行特别是刚入行的年轻开发者们聊聊那些只有时间才能教会你的事。这十年来我换过5家公司&#xff0c;辗转3个城市&#xff0c;从月薪3000到年薪百万&#xff0c;从单身汉到两…...

正点原子lwIP实战解析——PHY芯片LAN8720A与YT8512C的配置与应用

1. 认识PHY芯片&#xff1a;网络通信的"翻译官" 当你用网线连接开发板时&#xff0c;数据究竟是如何从物理信号变成单片机可处理的数字信号的&#xff1f;这个关键角色就是PHY芯片。简单来说&#xff0c;PHY就像个精通多国语言的翻译官——它把网线里的模拟信号&…...