服务安全认证概述与基础认证方式
文章目录
- 1. 引言
- 1.1 认证与授权的区别
- 1.2 认证方式的演进
- 2. 基础认证方式
- 2.1 HTTP Basic Authentication
- 2.2 API Key 认证
- 2.3 HMAC-SHA256 签名认证
- 2.4 JWT(JSON Web Token)
- 3. 认证方式对比与总结
- 3.1 认证方式对比
- 3.2 如何选择合适的认证方式?
- 3.3 认证方式的关联与组合
- 3.4 最佳实践建议
- 3.5 认证流程示意图
- 4. 未来趋势:认证技术的发展方向
- 4.1 零信任架构(Zero Trust)
- 4.2 FIDO2 无密码认证
- 4.3 去中心化身份(Decentralized Identity, DID)
- 5. 总结与展望
最近,我在开发一个 支付服务,涉及到应用、用户以及多个 API 之间的交互。支付系统对 安全性要求极高,稍有疏忽,就可能带来 伪造支付请求、数据泄露、接口滥用等安全风险。因此,如何设计 安全可靠的服务认证机制,成为了我首先要解决的问题。
在调研了各种服务安全认证方案后,我决定将学习和实践的内容系统化,拆分成三篇文章,分别介绍不同的认证方式,帮助自己理解并应用适合自己业务场景的方案。
本系列文章结构
第一篇:《服务安全认证概述与基础认证方式》
介绍服务安全认证的基本概念,并分析几种常见的认证方式,包括 Basic Auth、API Key 和 JWT,结合 Go 语言代码示例,探讨它们的适用场景和安全性。
第二篇:《OAuth 2.0 认证》
OAuth 2.0 是现代 Web 和移动应用中广泛使用的认证标准,尤其适用于第三方授权、单点登录(SSO)等场景。由于 OAuth 2.0 的授权流程复杂,涉及 Access Token、Refresh Token、授权码等概念,因此单独撰写一篇文章深入解析 OAuth 2.0,并结合 Go 语言代码实现。
第三篇:《复合认证策略》
在支付和金融系统中,单一的认证方式往往无法满足高安全性的需求。如何结合 API Key + HMAC-SHA256 签名,实现防篡改、防重放攻击的 API 认证? 本篇文章将探讨多种认证方式的组合,并提供 Go 语言完整实现,确保 API 既安全又高效。
现在开始第一篇文章的内容。
1. 引言
1.1 认证与授权的区别
认证(Authentication) 和 授权(Authorization) 常被混淆,但它们本质上是不同的概念:
- 认证(AuthN):验证用户或服务的身份。例如,“你是谁?”
- 授权(AuthZ):在认证通过后,决定其访问权限。例如,“你能访问哪些资源?”
下图展示了认证和授权的区别:

1.2 认证方式的演进
随着安全需求的提升,认证方式经历了多个阶段的演进:
- 基础认证(Basic Auth):最早的 HTTP 认证方式,使用用户名密码进行身份验证。
- API Key 认证:使用一个固定的密钥作为身份标识,适用于服务间通信。
- HMAC 签名认证:基于哈希算法生成签名,增加数据完整性和安全性。
- JWT(JSON Web Token):无状态认证方式,广泛用于微服务和前后端分离架构。
- OAuth 2.0:第三方认证标准,适用于社交登录、API 访问授权。
- 零信任认证(Zero Trust):基于动态身份验证的现代安全架构。
接下来,我们将从基础认证方式开始,逐步深入剖析每种方案的工作原理、Go 代码示例、优缺点及最佳实践。
2. 基础认证方式
2.1 HTTP Basic Authentication
原理:
HTTP 基本认证(Basic Auth)是最简单的认证方式,它使用 Base64 编码的用户名和密码,随 Authorization 头发送给服务器进行身份验证。
请求示例:
GET /protected HTTP/1.1
Host: example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
其中 dXNlcm5hbWU6cGFzc3dvcmQ= 是 username:password 的 Base64 编码。
Go 代码示例:
在 Go 语言中,我们可以通过 net/http 库实现 Basic Auth 认证:
package mainimport ("encoding/base64""fmt""net/http""strings"
)func basicAuthMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {auth := r.Header.Get("Authorization")if auth == "" {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}parts := strings.SplitN(auth, " ", 2)if len(parts) != 2 || parts[0] != "Basic" {http.Error(w, "Invalid Authorization Header", http.StatusUnauthorized)return}payload, _ := base64.StdEncoding.DecodeString(parts[1])pair := strings.SplitN(string(payload), ":", 2)if len(pair) != 2 || pair[0] != "admin" || pair[1] != "password" {http.Error(w, "Invalid Credentials", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})
}func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Hello, authenticated user!")
}func main() {mux := http.NewServeMux()mux.Handle("/", basicAuthMiddleware(http.HandlerFunc(helloHandler)))http.ListenAndServe(":8080", mux)
}
优缺点分析:
| 优点 | 缺点 |
|---|---|
| 简单易实现 | 明文传输,需配合 HTTPS |
| 兼容所有 HTTP 客户端 | 认证信息每次请求都发送,容易被窃听 |
| 适用于低安全需求场景 | 无状态,无法实现登出机制 |
适用场景:
- 内部 API,不对外暴露
- 开发调试阶段
- 低安全性需求的管理系统
最佳实践:
- 必须使用 HTTPS,防止明文密码被窃取
- 结合 IP 白名单,限制访问范围
- 定期轮换密码,避免凭据泄露
常见攻击及防御:
- 中间人攻击(MITM):
- 解决方案:强制 HTTPS
- 凭据泄露:
- 解决方案:定期更换密码,使用更安全的认证方式(如 Token)
2.2 API Key 认证
原理:
API Key 是一种轻量级认证方式,客户端通过在请求头或 URL 参数中附加密钥(API Key),服务器根据密钥来识别身份。
请求示例:
GET /data HTTP/1.1
Host: example.com
X-API-Key: my-secret-key
Go 代码示例:
package mainimport ("fmt""net/http"
)const apiKey = "my-secret-key"func apiKeyMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {key := r.Header.Get("X-API-Key")if key != apiKey {http.Error(w, "Forbidden", http.StatusForbidden)return}next.ServeHTTP(w, r)})
}func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Access granted with API Key!")
}func main() {mux := http.NewServeMux()mux.Handle("/", apiKeyMiddleware(http.HandlerFunc(handler)))http.ListenAndServe(":8080", mux)
}
优缺点分析:
| 优点 | 缺点 |
|---|---|
| 易于管理和分发 | API Key 泄露风险高 |
| 适用于服务间通信 | 无请求完整性验证,易受重放攻击 |
| 可用于限制访问频率 | 需要配合其他安全措施 |
适用场景:
- 服务端到服务端通信
- 第三方 API 访问控制
- 低复杂度的认证需求
最佳实践:
- 存储在安全环境(如 Vault、环境变量)
- 结合 IP 限制,防止滥用
- 增加过期机制,定期轮换 API Key
常见攻击及防御:
- 密钥泄露:
- 解决方案:使用环境变量存储密钥,定期轮换
- 重放攻击:
- 解决方案:增加时间戳和签名验证
2.3 HMAC-SHA256 签名认证
原理
HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码,常用于请求完整性校验和身份验证。相比 API Key 直接暴露密钥,HMAC 通过 密钥+哈希算法 生成签名,有效防止请求被篡改。
HMAC 认证的基本流程如下:
-
客户端 计算请求的 HMAC 签名:
- 将请求内容和密钥进行 HMAC-SHA256 计算
- 生成
Signature - 发送请求时,附带
Timestamp和Signature
-
服务器 校验签名:
- 重新计算 HMAC-SHA256 签名
- 对比客户端传递的签名是否一致
- 校验时间戳,防止重放攻击
HMAC 签名请求示例:
GET /api/secure-data HTTP/1.1
Host: example.com
X-API-Key: my-api-key
X-Timestamp: 1710556800
X-Signature: f3d2e8756e63c19a2f3bb3c1e7c6...
Go 代码示例
HMAC 生成签名
package mainimport ("crypto/hmac""crypto/sha256""encoding/hex""fmt""time"
)// 计算 HMAC-SHA256 签名
func computeHMAC(message, secret string) string {h := hmac.New(sha256.New, []byte(secret))h.Write([]byte(message))return hex.EncodeToString(h.Sum(nil))
}func main() {secretKey := "my-secret-key"timestamp := fmt.Sprintf("%d", time.Now().Unix())message := "GET:/api/secure-data:" + timestampsignature := computeHMAC(message, secretKey)fmt.Println("Timestamp:", timestamp)fmt.Println("Signature:", signature)
}
服务器端验证
package mainimport ("fmt""net/http""time"
)const secretKey = "my-secret-key"
const allowedTimeDiff = 60 // 允许最大时间偏移 60sfunc hmacMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {apiKey := r.Header.Get("X-API-Key")timestamp := r.Header.Get("X-Timestamp")signature := r.Header.Get("X-Signature")if apiKey != "my-api-key" || timestamp == "" || signature == "" {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}// 检查时间戳reqTime, err := time.Parse("2006-01-02T15:04:05Z07:00", timestamp)if err != nil || time.Since(reqTime).Seconds() > allowedTimeDiff {http.Error(w, "Request expired", http.StatusUnauthorized)return}// 计算服务器端签名message := "GET:/api/secure-data:" + timestampexpectedSignature := computeHMAC(message, secretKey)if signature != expectedSignature {http.Error(w, "Invalid signature", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})
}func main() {http.Handle("/", hmacMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Authenticated request!")})))http.ListenAndServe(":8080", nil)
}
优缺点分析
| 优点 | 缺点 |
|---|---|
| 请求不可篡改,防止中间人攻击 | 需要客户端和服务器端时间同步 |
| 签名基于密钥,不会直接暴露 | 计算开销比 API Key 略高 |
| 可以防止重放攻击 | 需管理密钥的安全性 |
适用场景
- 支付、交易类 API
- 高安全性 API(例如金融系统)
- 服务器间通信(Server-to-Server)
最佳实践
- 确保请求时效性,设置请求有效期(例如 60s)
- 密钥存储在安全环境(如 HashiCorp Vault)
- 签名应覆盖所有关键字段,防止数据篡改
常见攻击及防御
- 哈希碰撞攻击:
- 解决方案:使用安全哈希算法(SHA-256 或 SHA-512)
- 重放攻击:
- 解决方案:使用
Timestamp+Nonce机制
- 解决方案:使用
2.4 JWT(JSON Web Token)
原理
JWT(JSON Web Token)是一种 无状态认证 机制,服务端生成 Token 颁发给客户端,客户端在后续请求中携带 Token 进行身份验证。JWT 主要由三部分组成:
- Header(头部):包含加密算法,如
{"alg": "HS256", "typ": "JWT"} - Payload(负载):包含用户信息,如
{"sub": "123456", "role": "admin"} - Signature(签名):使用密钥对 Header + Payload 进行签名,保证数据完整性
JWT 示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoiYWRtaW4ifQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
认证流程:

Go 代码示例
package mainimport ("fmt""log""net/http""time""github.com/golang-jwt/jwt/v5"
)var jwtSecret = []byte("my-secret-key")// 生成 JWT
func generateJWT() (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"sub": "123456","role": "admin","exp": time.Now().Add(time.Hour * 1).Unix(), // 1小时过期})return token.SignedString(jwtSecret)
}// 验证 JWT
func verifyJWT(tokenString string) (bool, error) {token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {return jwtSecret, nil})if err != nil || !token.Valid {return false, err}return true, nil
}func jwtMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {tokenString := r.Header.Get("Authorization")if tokenString == "" || !verifyJWT(tokenString) {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})
}func main() {token, _ := generateJWT()fmt.Println("Generated Token:", token)http.Handle("/", jwtMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Authenticated request with JWT!")})))log.Fatal(http.ListenAndServe(":8080", nil))
}
优缺点分析
| 优点 | 缺点 |
|---|---|
| 无状态,减少数据库查询 | Token 泄露后无法撤销 |
| 适用于微服务架构 | Token 体积较大,影响性能 |
| 可存储额外用户信息 | 需要额外的 Token 失效机制 |
最佳实践
- 短时间 Token(15-30 分钟)+ 刷新 Token
- 存储在 HttpOnly Cookie,避免 XSS
- 使用
RS256代替HS256,提高安全性
3. 认证方式对比与总结
在前面的章节中,我们详细介绍了 Basic Auth、API Key、HMAC-SHA256、JWT 这几种常见的认证方式。接下来,我们从 安全性、易用性、适用场景 等多个维度对这些认证方案进行深入对比,并提供最佳实践建议,帮助你选择合适的认证方式。
3.1 认证方式对比
| 认证方式 | 安全性 | 易用性 | 适用场景 |
|---|---|---|---|
| Basic Auth | 低 | 高 | 内部低安全需求服务 |
| API Key | 中 | 高 | 服务间通信、第三方 API 访问 |
| HMAC | 高 | 中 | 高安全性 API(支付、金融) |
| JWT | 高 | 高 | 无状态认证,微服务架构,单点登录 |
- Basic Auth 由于密码明文传输风险较大,只适用于低安全需求的内部系统。
- API Key 提供简单的认证方式,但存在密钥泄露的风险,因此需要额外的安全措施(如 IP 限制、密钥轮换)。
- HMAC 通过签名保护数据完整性,适用于高安全需求场景,如支付系统、金融服务等。
- JWT 适用于分布式系统和无状态认证,但 Token 一旦泄露风险较高,需要合理设置有效期和刷新机制。
3.2 如何选择合适的认证方式?
不同的业务场景适合不同的认证方式,以下是几种典型的应用场景推荐:
| 应用场景 | 推荐认证方式 | 说明 |
|---|---|---|
| 内部 API | API Key / HMAC | API Key 适用于简单的内部调用,HMAC 适用于更高安全需求 |
| 对外开放 API | API Key / OAuth 2.0 | 结合 OAuth 2.0 可支持用户授权 |
| 用户认证(Web & 移动端) | JWT / OAuth 2.0 | JWT 适用于微服务架构,OAuth 2.0 适用于第三方认证 |
| 支付、交易类 API | HMAC / OAuth 2.0 | HMAC 提供更高安全性,OAuth 2.0 适用于第三方支付 |
| 微服务间通信 | JWT / Mutual TLS | JWT 适用于轻量级认证,Mutual TLS 提供更高安全性 |
3.3 认证方式的关联与组合
在实际应用中,我们通常会 组合使用多种认证方式 以提高安全性。例如:
-
API Key + HMAC
- API Key 作为身份标识
- HMAC 作为请求签名,防止数据篡改
- 适用于高安全要求的 API
-
JWT + OAuth 2.0
- OAuth 2.0 负责用户认证
- JWT 用于微服务间身份传递
- 适用于社交登录、单点登录(SSO)
-
JWT + Refresh Token
- 短时 JWT 作为访问凭证
- Refresh Token 用于续期
- 适用于 Web & 移动端认证
-
HMAC + TLS
- HMAC 认证 API 请求完整性
- TLS 保障数据传输安全
- 适用于支付系统
3.4 最佳实践建议
为了确保认证的安全性,建议遵循以下最佳实践:
必须使用 HTTPS:防止中间人攻击(MITM)
API Key & HMAC 密钥存储在安全环境(如 Vault)
JWT 采用短时有效期(15-30 分钟)+ 刷新 Token
HMAC 认证增加时间戳校验,防止重放攻击
OAuth 2.0 适用于用户身份认证,避免直接暴露 API Key
定期轮换 API Key / JWT 密钥,降低泄露风险
3.5 认证流程示意图
下图展示了一个典型的 JWT + OAuth 2.0 结合 的认证流程:

4. 未来趋势:认证技术的发展方向
随着安全需求的不断提高,传统的认证方式正在被更 安全、高效、无密码化 的方案所取代。以下是未来认证技术的发展趋势:
4.1 零信任架构(Zero Trust)
零信任(Zero Trust) 认为 任何用户和设备在访问资源时都需要重新验证身份,不再默认信任内部网络。其核心原则包括:
- 最小权限原则(Least Privilege Access)
- 动态认证(Continuous Authentication)
- 多因素认证(MFA)
- 基于风险的访问控制(RBAC)
4.2 FIDO2 无密码认证
FIDO2(Fast Identity Online)基于 公私钥加密 和 生物识别技术,实现无密码认证:
- WebAuthn(Web 认证 API)
- Passkeys(苹果、Google、微软支持的无密码登录)
- U2F 安全密钥(如 YubiKey)
FIDO2 彻底消除了密码泄露的风险,提高了安全性。
4.3 去中心化身份(Decentralized Identity, DID)
去中心化身份(DID)基于区块链和分布式技术,用户可以 完全控制自己的身份数据,无需依赖第三方机构。其核心特点:
- 隐私保护:用户决定哪些信息共享
- 可验证凭证(VC):支持链上认证
- 去中心化存储:避免单点泄露
DID 适用于:
- 跨平台身份认证
- 隐私保护型应用
- 去中心化社交网络
5. 总结与展望
本文深入解析了 Basic Auth、API Key、HMAC、JWT 等常见的服务认证方式,并进行了对比分析,帮助你根据不同场景选择合适的方案。同时,我们还探讨了 零信任、FIDO2、去中心化身份(DID) 这些未来认证的发展方向。
未来,认证技术将更加 安全、智能、去中心化,无密码认证(如 FIDO2)和 零信任架构 将成为主流。建议企业和开发者持续跟进认证领域的新技术,确保系统安全。
相关文章:
服务安全认证概述与基础认证方式
文章目录 1. 引言1.1 认证与授权的区别1.2 认证方式的演进 2. 基础认证方式2.1 HTTP Basic Authentication2.2 API Key 认证2.3 HMAC-SHA256 签名认证2.4 JWT(JSON Web Token) 3. 认证方式对比与总结3.1 认证方式对比3.2 如何选择合适的认证方式…...
【Android Studio开发】生命周期、Activity和组件通信(上)
零、前期配置 1.【Android】模式 2.点击【运行】,弹出模拟器 右侧是模拟机,显示Hello World 3. 打开【activity_main.xml】文件,点击【Design】,然后点击【Component Tree】 在弹出的Component Tree中右键【main】,选择【Conver…...
【ES】Elasticsearch学习
文章目录 简单的安装 简单的安装 参考:https://blog.csdn.net/smilehappiness/article/details/118466378 官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html 下载:https://www.elastic.co/cn/downloads/e…...
实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)
一、实验目的 Python 数据可视化: 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means: 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...
【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)
通信接口部分有介绍SPI:【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock&…...
JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。
大白话实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。 思路 实现数组扁平化的基本思路是遍历数组中的每个元素,如果元素是数组,就递归地将其扁平化并添加到结果数组中;如果元…...
SpringBoot最佳实践之 - 使用AOP记录操作日志
1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求,开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友,可以参考此篇博客中记录日志的方式,可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…...
第六届机电一体化技术与智能制造国际学术会议(ICMTIM 2025)
重要信息 4月11-13日 南京江北新区工业大学亚朵酒店 www.icmtim.org(点击了解参会投稿等) 简介 由南京工业大学主办,南京工业大学电气工程与控制科学学院、中国矿业大学、黑龙江大学、江苏省自动化学会承办的第六届机电一体化技术…...
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释 以下是 np.arange(0, 10, 2) 的详细解释: 1. 函数作用 np.arange() 是 NumPy 中用于生成均匀间隔数值序列的函数,类似于 Python 内置的 range(),但返回的是 NumPy 数组而非列表&…...
期刊分区表2025年名单下载(经济学、管理学)
2025年期刊分区表包括SCIE、SSCI、A&HCI、ESCI和OAJ,共设置了包括自然科学、社会科学和人文科学在内的21个大类 本次分享的是期刊分区表2025年名单经济学类、管理学类,一共7631025条 一、数据介绍 数据名称:期刊分区表2025年名单 数据…...
八股学习-JUC java并发编程
本文仅供个人学习使用,参考资料:JMM(Java 内存模型)详解 | JavaGuide 线程基础概念 用户线程:由用户空间程序管理和调度的线程,运行在用户空间。 内核线程:由操作系统内核管理和调度的线程&…...
嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充
1. 外设引脚重映射 1.1 定义 在STM32中,每个外设的引脚都有默认的GPIO端口,但有些引脚可以通过重映射寄存器将功能映射到其他端口。这种机制称为引脚重映射,主要用于解决引脚复用冲突或优化PCB布线。 1.2 重映射的类型 部分重映射&#x…...
PostgreSQL_数据下载并保存(psycopg2)
目录 前置: 1 数据下载 1.1 多个股票多个交易日 1.2 一个交易日所有股票 2 数据保存,使用python中的psycopg2包 2.1 在PyCharm中创建新项目,并安装包 2.2 代码-多个股票多个交易日 2.3 代码-一个交易日所有股票 2.4 在 pgAdmin4 中…...
启明星辰春招面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
边缘计算革命:重构软件架构的范式与未来
摘要 边缘计算通过将算力下沉至网络边缘,正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新,包括分布式分层架构、实时资源调度、安全防护体系等技术变革,并结合工业物联网、智慧医疗等场景案例,…...
【读点论文】Chain Replication for Supporting High Throughput and Availability
在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…...
Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
DAY15.1 Java核心基础 Servlet Servlet是一个接口,是java的基础,java之所以编写web的程序,接收请求并响应,就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求,成为web服务器 Web服务器就是接…...
深入了解 C# 中的 LINQ:功能、语法与应用解析
1. 什么是 LINQ? LINQ(Language Integrated Query,语言集成查询)是 C# 和其他 .NET 语言中的一种强大的查询功能,它允许开发者在语言中直接执行查询操作。LINQ 使得开发者可以使用 C# 语法(或 VB.NET&…...
贝叶斯公式的一个直观解释
E E E:抓到娃娃 H H H:坐地铁 H ˉ \bar H Hˉ:坐公交 P ( E ) P ( H ) P ( E ∣ H ) P ( H ‾ ) P ( E ∣ H ‾ ) P({E}) P({H}) P({E} \mid {H}) {P}(\overline{{H}}) {P}({E} \mid \overline{{H}}) P(E)P(H)P(E∣H)P(H)P(E∣H) P (…...
Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
reconstruct_3d_object_model_for_matching例子
文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…...
【JavaWeb学习Day27】
Tlias前端 员工管理 条件分页查询: 页面布局 搜索栏: <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…...
Webrtc编译官方示例实现视频通话
Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子:peerconnection,这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后,我们使用vs打开…...
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化 在讨论编程语言的选择时,特别是针对微软的 C# 和 Rust,以及谷歌的 Go 语言,以及微软试图通过 Go 来拯救 TypeScript 编译器的问题,我们可以从多个角度来分析和…...
信息学奥赛一本通 1610:玩具装箱 | 洛谷 P3195 [HNOI2008] 玩具装箱
【题目链接】 ybt 1610:玩具装箱 洛谷 P3195 [HNOI2008] 玩具装箱 【题目考点】 1. 动态规划:斜率优化动规 斜率优化动规模板题:信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2 【解题思路】 玩具长度…...
数仓工具—Hive语法之不同纬度聚合
不同纬度聚合 提到不同纬度聚合,大家想到的肯定是grouping sets,或者是cube和rollup 其实这些我们之前都讲过,可以看看之前的文章 数仓工具—Hive语法之cube和rollup 数仓工具—Hive语法之grouping sets 但是我们今天遇到的问题是,使用的工具不支持grouping sets,既然…...
领码科技:在低代码技术浪潮中的分享与探索
前言: 25年的职业生涯,赋予了我深厚的技术积累与实践经验。从武汉大学的工测系毕业,到央企副总工的职位,我始终站在IT浪潮的最前沿。然而,离开企业后,我并未停止前行的脚步。从2024年11月起,我选…...
大数据学习(80)-数仓分层
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家
今天忙了一天,很累,准备睡觉的时候,看到网上盛传的刘强东的朋友圈,东哥又在朋友圈发文了。 说实话,看完之后,感动,真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…...
Java 记忆链表,LinkedList 的升级版
文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知,ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构,对应数据结构理论中的数组和链表。但在这两个数据结构,开发者们通常使用 ArrayList,而不使用 LinkedList。JD…...
