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

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

系列文章

  • Nomad 系列文章
  • Traefik 系列文章
  • Tailscale 系列文章

概述

终于到了令人启动的环节了:Nomad+Traefik+Tailscale 集成实现零信任安全。

在这里:

  • Nomad 负责容器调度;(容器编排工具)
  • Traefik 负责入口流量;(Ingress 工具)
  • Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。

Traefik 简介

Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易。

Traefik 可以与现有的多种基础设施组件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS、Nomad…)集成,并自动和动态地配置自己。

Traefik 与 Nomad Native Service 集成

2023 年 5 月初,Hashicorp 发布了 Nomad 1.3 版本。在此版本之前,当与 Nomad 一起使用服务发现时,Traefik Proxy 用户必须同时使用 Hashicorp Consul 和 Nomad,以便从 Traefik Proxy 著名的自动配置中获益。现在,Nomad 有了一种简单直接的方法来使用内置的服务发现。这大大提高了直接可用性!不仅在简单的测试环境中,而且在边缘环境中。

Traefik 与 Tailscale 集成

从 Traefik Proxy 3.0 Beta 1 发布开始,Traefik Proxy 支持 Tailscale。当 Traefik 收到对 *.ts.net 站点的 HTTPS 请求时,它会从机器的本地 Tailscale 守护进程(实际是 Tailscale 的 socket) 获取 HTTPS 证书。并且证书不需要配置。

Traefik 小结

在这次集成中,我们使用 Traefik 作为 Nomad 集群中工作负载的 HTTP 反向代理和负载均衡,并通过 Nomad Native Service 和 Nomad 集成,通过 Traefik Resolver 与 Tailscale 集成。

Tailscale 简介

Tailscale 是一种 V(irtual)P(rivate)N(etwork) 服务,可以让您在世界任何地方安全、轻松地访问您拥有的设备和应用程序。它使用开源 WireGuard 协议实现加密的点对点连接,这意味着只有您的专用网络上的设备才能相互通信。

Tailscale 快速可靠。与传统的 V(irtual)P(rivate)N(etwork) 不同,传统的通过中央网关服务器隧道传输所有网络流量,Tailscale 则是创建了一个对等 full-mesh 网状网络(称为 tailnet).

Tailscale 提供了一系列的额外实用功能,如:

  • MagicDNS: 使用短主机名作为域名直接访问设备。如:http://raspberryhttp://raspberry.west-beta.ts.net
  • HTTPS 证书: 允许用户为其设备提供 TLS 证书。如上面的:raspberry.west-beta.ts.net 提供授信证书。可以通过 https://raspberry.west-beta.ts.net 访问且浏览器显示安全的绿锁🔒标志。

默认情况下,Tailscale 节点之间的 (4 层)连接通过端到端加密来保护。然而,浏览器,Web API 和 Visual Studio Code 等产品并不知道这一点,并且可以根据以下事实警告用户或禁用功能:到您的尾网服务的 HTTP URL 看起来未加密,因为它们没有使用 TLS 证书。

而 Tailscale 在启用了:

  1. tailnet name
  2. MagicDNS
  3. HTTPS 证书

后,便可以为每台 Tailscale 机器自动或手动生成证书。证书对应的域名如下:

Tailscale HTTPS Cert

在这次集成中,我们使用 Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。跨地域联通需要在 Nomad 上进行相关设置;4 层加密为默认提供的;HTTPS 证书则需要分别在 Nomad 以及 Traefik 上进行相关设置。

Nomad+Traefik+Tailscale 集成具体方案

  • Tailscale 在多个相同或不同区域 Linux Node 上通过软件源安装;通过 systemd 启动;
  • Nomad 安装在这些 Linux Node 上,并指定网卡为 Tailscale 对应网卡 - tailscale0
  • Traefik 以 system 类型 job 的方式在 Nomad 上通过 Docker 运行。并与 Tailscale 和 Nomad 集成。

Nomad+Traefik+Tailscale 集成实施步骤

前提

  • 多台(最好在不同区域)的 Linux Node(本例中是 Ubuntu Node)
  • 这些 Linux Node 最好 Hostname 各不相同
  • Nomad 前提:
    • Docker 已安装
    • Nomad 已安装(版本≥1.3, 越新越好)
    • Nomad 集群已创建并运行(至少包括 1 个 Server 和 1 个 Client)
  • Tailscale 前提:
    • 已创建 Tailscale 账号
    • Tailscale 版本大于等于 1.14(越新越好)
    • MagicDNS 功能已启用
    • HTTPS 证书功能已启用
  • Traefik 前提:
    • Traefik Proxy 版本 ≥ 3.0 Beta 1

安装并运行 Tailscale

在每台机器上,运行以下命令安装:

curl -fsSL https://tailscale.com/install.sh | sh

更多安装方式,请参见:Traefik Nomad Service Discovery Routing - Traefik

这里不做详细介绍。

sudo tailscale up

并登录 Tailscale.

Nomad Client 配置调整

Nomad Client 需要进行如下配置调整,以方便后续和 Tailscale 及 Traefik 集成:

  1. 配置 Tailscale Socket 作为 Nomad Host Volume(供 Docker 中的 Traefik 和 Tailscale 通信)
  2. 配置网卡为 tailscale0, 使用 Tailscale 网络进行东西向通信。

修改 /etc/nomad.d/nomoad.hclclient 块配置,具体配置如下:

data_dir  = "/opt/nomad/data"
bind_addr = "0.0.0.0"client {enabled = trueservers = ["100.99.99.99"]network_interface = "tailscale0"host_volume "tailscale-socket" {path      = "/run/tailscale/tailscaled.sock"read_only = true}
}

具体说明如下:

  • servers = ["100.99.99.99"]: 指定 servers ip 列表为对应的 Servers 的 Tailscale IP 地址。后续该地址都要根据您的实际情况替换为 Nomad Server 的一个地址或所有地址列表。
  • network_interface = "tailscale0": 指定要强制进行网络指纹识别的接口的名称。在开发模式下运行时,默认为环回接口。不处于开发模式时,将使用连接到默认路由的接口。调度程序在为任务分配端口时从这些指纹 IP 地址中进行选择。这里指定 Nomad 使用 Tailscale 隧道网卡 tailscale0 作为网络指纹识别的接口。
  • host_volume "tailscale-socket" {: 如 前一篇文章 所述,配置 Nomad Host Volume
    • path = "/run/tailscale/tailscaled.sock": Tailscale Socket Host Path.
    • read_only = true: 只读。

运行 Traefik Job

Traefik Job HCL - traefik.hcl 具体如下:

job "traefik" {datacenters = ["dc1"]type        = "system"group "traefik" {network {port  "http"{static = 80}port "https" {static = 443}port  "admin"{static = 8080}}service {name = "traefik-http"provider = "nomad"port = "http"}service {name = "traefik-https"provider = "nomad"port = "https"}volume "tailscale-socket" {type      = "host"read_only = truesource    = "tailscale-socket"}task "server" {driver = "docker"volume_mount {volume           = "tailscale-socket"destination      = "/var/run/tailscale/tailscaled.sock"read_only        = true}config {image = "traefik:v3.0"ports = ["admin", "http", "https"]args = ["--api.dashboard=true","--api.insecure=true", ### For Test only, please do not use that in production"--entrypoints.web.address=:${NOMAD_PORT_http}","--entryPoints.websecure.address=:${NOMAD_PORT_https}",  "--entrypoints.traefik.address=:${NOMAD_PORT_admin}","--providers.nomad=true","--providers.nomad.endpoint.address=http://100.99.99.99:4646", ### Tailscale IP to your nomad server "--certificatesresolvers.tailscaleresolver.tailscale=true"]}}}
}

详细说明如下:

  • type = "system": 数据中心和节点池中的每个客户端都获得分配。类似于 K8s 的 Daemonset.
  • network {} Network 块,这里指定了 3 个静态端口(类似于 K8s 中的 HostSubnet), 即容器内和主机都监听:
    • http 端口 80
    • https 端口 443
    • admin Traefik admin 端口 8080 (因为底层是 Tailscale, 所以其实 HTTP 也是在 4 层透明加密过的)
  • service {} 2 个 Service 块,都是 Nomad Native Service. 分别是:
    • traefik-http 服务:指向 http 端口 - 80
    • traefik-https 服务:指向 https 端口 - 443
  • volume "tailscale-socket" { 通过 Nomad Host Volume 声明 Tailscale Socket
    • type = "host": Volume 类型为 Nomad Host Volume
    • read_only = true: Volume 级别 read_only 配置
    • source: source 指向 Nomad Client 的tailscale-socket, 即:/run/tailscale/tailscaled.sock path
  • driver = "docker": Traefik 实际在 Docker 中运行
  • volume_mount {: volume mount 配置:
    • destination = "/var/run/tailscale/tailscaled.sock": 将 Tailscale Socket 挂载到容器内 /var/run/tailscale/tailscaled.sock path.
  • config { docker 配置块。
    • image = "traefik:v3.0": 指定 traefik 镜像为:traefik:v3.0
    • ports = ["admin", "http", "https"]: 对外暴露的端口为:80, 443, 8080
    • args [: traefik 启动参数
      • "--api.dashboard=true": 启动 Traefik Dashboard
      • "--api.insecure=true": 仅供测试使用,请勿在生产环境中使用
      • "--entrypoints.web.address=:${NOMAD_PORT_http}": 指定 Traefik 的 web 端口为:NOMAD_PORT_http 环境变量,即:80. 地址为::80 (监听全部地址)
      • "--entryPoints.websecure.address=:${NOMAD_PORT_https}": 指定 Traefik 的 websecure 地址为::443
      • "--entrypoints.traefik.address=:${NOMAD_PORT_admin}": 指定 Traefik 的 traefik 地址为::8080
      • "--providers.nomad=true": 启用 Traefik 与 Nomad 集成
      • "--providers.nomad.endpoint.address=http://100.99.99.99:4646": 指定 Nomad Server 地址
      • "--certificatesresolvers.tailscaleresolver.tailscale=true": 启用 Traefik 与 Tailscale 集成。创建一个 Traefik Resolver 名为:tailscaleresolver, 且和 Tailscale 集成。

运行该 Job:

nomad run traefik.hcl

则 Traefik 会部署到 Nomad 所有的 Client 上。

至此,我们完成了 Nomad+Traefik+Tailscale 的集成。🎉🎉🎉

验证 Nomad+Traefik+Tailscale 效果

通过 Traefik Dashboard 验证

首先,打开 Traefik Dashboard - http://100.99.99.99, 效果如下:

Traefik 集成 Nomad

从上图可以看到:

  • Traefik 的版本是 3.0 Beta 1 以上,实际为:3.0.0-beta3
  • Traefik 监听的端口为:80, 443 和 8080
  • Traefik 已经和 Nomad 集成,Providers 显示为 Nomad.

创建 Nomad Service 验证

我们基于 HashiCorp Nomad 官方提供的另一个 Demo 程序:HashiCups 来进行配置调整:

git clone https://github.com/hashicorp/learn-nomad-sd.git
cd learn-nomad-sd
git checkout tags/v0.1 -b nomad-hashicups-sd

修改 hashicups.hcl 的以下内容:(内容有省略)

...
job "hashicups" {type   = "service"...group "nginx" {network {port "nginx" {to = var.nginx_port}}task "nginx" {driver = "docker"service {name = "nginx"provider = "nomad"port = "nginx"tags = ["traefik.http.routers.hashicups.rule=Host(`firefly-sub03.west-beta.ts.net`)","traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver"]}...}}
}

具体说明如下:

  • to = var.nginx_port: 🐾注意,这里要从 static 改为 to, 避免 Host 端口冲突。Host 端口会随机分配一个端口。
  • service {: service 块,这里 provider = "nomad", Traefik 会通过 Nomad Server API 获取 Nomad Native Service, 并通过 tags 获取具体路由配置。
tags = ["traefik.http.routers.hashicups.rule=Host(`firefly-sub03.west-beta.ts.net`)","traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver"
]

这里是 Traefik 的配置风格,Traefik 和 Nomad 集成时,Nomad tags 的配置和 Traefik docker 集成的配置风格是一模一样的。

  • traefik.http.routers.hashicups.rule=Host(...) 创建hashicups router. 并指定域名,这里我指定了我的一台 Nomad Client Node 的 Tailscale 完整域名:firefly-sub03.west-beta.ts.net. 其中 .west-beta.ts.net 是我的专属域,如果您要配置,请根据从 Tailscale Admin Console 获取到的域自行调整。firefly-sub03 是我的一台 Linux Node 的 hostname, 显然,这台 Node 上安装了:nomad client, tailscale, traefik.
  • "traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver" 指定该 router 的 HTTP 证书解析方名称为:tailscaleresolver, 即 tailscale.

效果如下:

在 Traefik Dashboard 上展示如下:

Traefik Dashboard - hashicups router △ 可以看到,通过 http://firefly-sub03.west-beta.ts.net/ 或 https://firefly-sub03.west-beta.ts.net/ 都可以访问到 Nomad 的 nginx service. 并且 TLS 启用,且 Resolver 是tailscaleresolver

Traefik Dashboard - hashicups nginx service △ 可以看到,Nomad 为 nginx service 自动分配的地址是:http://100.74.143.10:25061 端口是一个随机端口 (我这里 Nomad 网络使用 host 模式,而不是 bridge 模式)

直接通过 TS 内网访问 https://firefly-sub03.west-beta.ts.net/ 如下:

HashiCups Demo with https cert

△可以看到,通过域名可以访问到 Hashicups, 并且该域名的 HTTPS 证书也是受信的。

🎉🎉🎉

总结

本文我们通过 Nomad+Traefik+Tailscale 集成实现零信任安全。

在这里:

  • Nomad 负责容器调度;(容器编排工具)
  • Traefik 负责入口流量;(Ingress 工具)
  • Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。

具体来说,在这次集成中:

  • 使用 Traefik 作为 Nomad 集群中工作负载的 HTTP 反向代理和负载均衡,并通过 Nomad Native Service 和 Nomad 集成,通过 Traefik Resolver 与 Tailscale 集成。
  • 使用 Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。
    • 跨地域联通需要在 Nomad 上进行相关设置;
    • 4 层加密为默认提供的;
    • HTTPS 证书则需要分别在 Nomad 以及 Traefik 上进行相关设置。

并且,这套方案也特别适合边缘 Edge 环境:

  • Nomad 为边缘集群提供了简单轻量的(容器)编排服务
  • Traefik 为边缘集群提供了 4 层 和 7 层的 负载均衡以及 7 层的 HTTP 代理服务
  • Tailscale 为边缘集群的"云" "边" "端" 提供了隧道打通,实现网络连接和边缘网络加密。并自动为 HTTPS 提供受信证书。

📚️参考文档

  • Traefik Proxy Integrates with Hashicorp Nomad | Traefik Labs
  • Traefik Nomad Service Discovery Routing - Traefik
  • Load Balancing with Traefik | Nomad | HashiCorp Developer
  • Traefik Proxy Integrates with Hashicorp Nomad | Traefik Labs
  • Traefik Tailscale Documentation - Traefik
  • Download · Tailscale
  • Integrations · Tailscale
  • Traefik certificates on Tailscale · Tailscale
  • Deploy an App with Nomad Service Discovery | Nomad | HashiCorp Developer

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

相关文章:

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

系列文章 Nomad 系列文章Traefik 系列文章Tailscale 系列文章 概述 终于到了令人启动的环节了:NomadTraefikTailscale 集成实现零信任安全。 在这里: Nomad 负责容器调度;(容器编排工具)Traefik 负责入口流量&…...

(二十一)大数据实战——Flume数据采集之复制和多路复用案例实战

前言 本节内容我们完成Flume数据采集的一个多路复用案例,使用三台服务器,一台服务器负责采集本地日志数据,通过使用Replicating ChannelSelector选择器,将采集到的数据分发到另外俩台服务器,一台服务器将数据存储到hd…...

VM安装RedHat7虚机ens33网络不显示IP问题解决

1、今天在VMware中安装RedHat7.4虚拟机,网络连接使用的是 NAT 连接方式,刚开始安装成功之后输入ifconfig 还能看到ens33自动分配的IP地址,但是当虚机关机重启后,再查看IP发现原来的ens33网络已经没有了,只变成了这两个…...

Leetcode 第 362 场周赛题解

Leetcode 第 362 场周赛题解 Leetcode 第 362 场周赛题解题目1:2848. 与车相交的点思路代码复杂度分析 题目2:2849. 判断能否在给定时间到达单元格思路代码复杂度分析 题目3:2850. 将石头分散到网格图的最少移动次数思路代码复杂度分析 题目4…...

蓝桥杯官网练习题(0的个数)

问题描述 给定一个正整数 n ,请问 n 的十进制表示中末尾总共有几个 0 ? 输入格式 输入一行包含一个正整数 n。 输出格式 输出一个整数,表示答案。 样例输入 20220000样例输出 4评测用例规模与约定 对于所有评测用例,1 &l…...

计算线段上距离线段外某一点最近的点

一、问题 已知 p 0 = ( x 0 , y 0 ) p_0=(x_0, y_0) p...

港联证券股票分析:经济拐点显现 积极提升仓位

港联证券指出,商场底部上升的方向不变,当时稳增加和活跃资本商场的活跃方针仍在持续落地,一起也看到了一些经济数据边沿企稳的迹象,跟着方针作用的进一步闪现,商场情绪有望持续好转,上市公司基本面也有望得…...

不同的图像质量评价指标(IQA)

一、NR-IQA 这是一种方法不是指标 “Non-Reference Image Quality Assessment”(NR-IQA)是一种图像质量评价(Image Quality Assessment, IQA)方法,通常用于评估图像的质量,而无需使用参考图像(…...

linux命令-tar 命令

tar 命令 tar 命令一般用来打包文件 ,文件夹 , 方便传输使用. tar命令是在Linux和UNIX系统上用于创建、查看和提取tar归档文件的工具。它通常与gzip一起使用,以便在创建归档文件时进行压缩或解压缩。 -c: 创建归档文件 -x: 提取文件 -z: 告诉 tar 命令使用 gzip …...

selenium元素定位---ElementClickInterceptedException(元素点击交互异常)解决方法

1、异常原因 在编写ui自动化时&#xff0c;执行报错元素无法点击&#xff1a;ElementClickInterceptedException 具体报错&#xff1a;selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <span class"el-c…...

05_css选择器的使用

一、css选择器的类型 1、标签选择器 用法&#xff1a;直接写 写标签名&#xff1a;标签名{} 示例&#xff1a; <!-- <!DOCTYPE html --> <html><head><meta charset"utf-8"><title>标签选择器</title><style type"te…...

跨平台游戏引擎 Axmol-2.0.0 正式发布

下载 https://github.com/axmolengine/axmol/releases/tag/v2.0.0 更新日志 添加实验性的 WebAssembly 构建支持(WebGL 2.0)&#xff0c;由 nowasm 贡献 已知问题 WebGL context lost 尚未处理 部署在 github pages 的 demo 可快速预览&#xff0c;注意&#xff1a;由于 Git…...

面试总结归纳

面试总结 注&#xff1a;循序渐进&#xff0c;由点到面&#xff0c;从技术点的理解到项目中的使用&#xff0c; ​ 要让面试官知道&#xff0c;我所知道的要比面试官更多 一、Mybatis 为ORM半持久层框架&#xff0c;它封装了JDBC&#xff0c;开发时只需要关注sql语句就可以了…...

【刷题篇】贪心算法(一)

文章目录 分割平衡字符串买卖股票的最佳时机Ⅱ跳跃游戏钱币找零 分割平衡字符串 class Solution { public:int balancedStringSplit(string s) {int lens.size();int cnt0;int balance0;for(int i0;i<len;i){if(s[i]R){balance--;}else{balance;}if(balance0){cnt;}}return …...

从维基百科通过关键字爬取指定文本内容

通过输入搜索的关键字&#xff0c;和搜索页数范围&#xff0c;爬出指定文本内内容并存入到txt文档。代码逐行讲解。 使用re、res、BeautifulSoup包读取&#xff0c;代码已测&#xff0c;可以运行。txt文档内容不乱码。 import re import requests from bs4 import BeautifulS…...

pytorch代码实现之SAConv卷积

SAConv卷积 SAConv卷积模块是一种精度更高、速度更快的“即插即用”卷积&#xff0c;目前很多方法被提出用于降低模型冗余、加速模型推理速度&#xff0c;然而这些方法往往关注于消除不重要的滤波器或构建高效计算单元&#xff0c;反而忽略了特征内部的模式冗余。 原文地址&am…...

一文解析-通过实例讲解 Linux 内存泄漏检测方法

一、mtrace分析内存泄露 mtrace&#xff08;memory trace&#xff09;&#xff0c;是 GNU Glibc 自带的内存问题检测工具&#xff0c;它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下&#xff0c;其基本设计原理为设计一个函数 void mtrace ()&#x…...

Spring Boot常用的参数验证技巧和使用方法

简介 Spring Boot是一个使用Java编写的开源框架&#xff0c;用于快速构建基于Spring的应用程序。在实际开发中&#xff0c;经常需要对输入参数进行验证&#xff0c;以确保数据的完整性和准确性。Spring Boot提供了多种方式来进行参数验证&#xff0c;并且可以很方便地集成到应…...

手机+卫星的科技狂想

最近硬件圈最火热的话题之一&#xff0c;应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中&#xff0c;CPU和类5G网速是怎么实现的&#xff0c;是大家特别关注的问题。相比之下&#xff0c;卫星通话这个功能&#xff0c;讨论度就略低一些&#xff08;没有说不火的意思&am…...

便捷查询中通快递,详细物流信息轻松获取

在如今快节奏的生活中&#xff0c;快递已成为人们生活中不可或缺的一部分。然而&#xff0c;快递查询却常常让人头疼&#xff0c;因为需要分别在不同的快递公司官网上进行查询&#xff0c;耗费时间和精力。为了解决这个问题&#xff0c;固乔科技推出了一款便捷的快递查询助手&a…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...