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

【Golang】Go语言http编程底层逻辑实现原理与实战

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言http编程
    • 一、HTTP基础概念
      • 1. HTTP请求
      • 2. HTTP响应
      • 3. HTTP/1.1与HTTP/2
    • 二、http编程实战
      • 1. HTTP服务器
      • 2. HTTP客户端
      • 3. 带参数的请求
      • 4. POST请求提交Form表单
      • 5. POST请求提交Json数据
    • 三、错误处理

Go语言http编程

HTTP(HyperText Transfer Protocol)是互联网上应用最广泛的一种网络协议。无论是浏览网页、使用API进行数据传输,还是实现微服务架构,HTTP都扮演着至关重要的角色。Go语言(又称Golang)以其简洁、高效和强大的并发处理能力,成为了HTTP编程的优选语言之一。

一、HTTP基础概念

在深入了解Go语言的HTTP编程之前,我们需要先了解一些HTTP的基础知识。

1. HTTP请求

请求方法(GET、POST、PUT、DELETE等)
请求URL(包括协议、主机名、端口号、路径和查询参数)
请求头(包含元数据,如Content-Type、Authorization等)
请求体(对于POST、PUT等请求方法,通常包含要发送的数据)

2. HTTP响应

状态码(如200 OK、404 Not Found、500 Internal Server Error等)
响应头(包含元数据,如Content-Type、Location等)
响应体(包含返回的数据)

3. HTTP/1.1与HTTP/2

HTTP/1.1是广泛使用的版本,支持持久连接和缓存控制。
HTTP/2引入了多路复用、头部压缩和服务器推送等特性,提高了性能。

二、http编程实战

1. HTTP服务器

Go语言内置的net/http包提供了简单的HTTP服务器实现。
开启监听程序的代码是放在main方法的最后一行的
以下是一个基本的HTTP服务器示例:

// http_server.go
package mainimport ("fmt""net/http"
)// 定义发送接收数据函数
func helloHandler(w http.ResponseWriter, r *http.Request) {// 给浏览器响应数据// 一般会响应一些信息给客户端 (文字、网页) resp.Write// 响应一段文字[]byte("hello,web")// 响应一段html代码 []byte("html代码") 网页// Write([]byte) (int, error)_, err := w.Write([]byte("<h1>感谢大家来到景天科技苑!</h1>"))if err != nil {return}//查看请求fmt.Println("请求方法: ", r.Method)fmt.Println("请求体: ", r.Body)fmt.Println("请求头", r.Header)fmt.Println("请求路径:", r.URL)fmt.Println("客户端地址:", r.RemoteAddr) //包含ip和端口号
}func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的,一直监听请求// 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径,第二个参数是一个函数http.HandleFunc("/", helloHandler)fmt.Println("Starting server at :8080")// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。//如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

浏览器访问
在这里插入图片描述

2. HTTP客户端

除了HTTP服务器,Go语言也提供了强大的HTTP客户端功能。以下是一个基本的HTTP客户端示例:

package mainimport ("fmt""io""net/http"
)// 手写客户端访问
func main() {/*http.Get()*/// 一个请求包含 请求方式   请求的url   接收响应结果// func Get(url string) (resp *Response, err error)resp, _ := http.Get("http://localhost:8080")// 通过defer关闭连接 resp.Body 响应的主体//通过Body来关闭defer resp.Body.Close()fmt.Println(resp.Body)fmt.Println(resp.Status) // 200 OKfmt.Println(resp.Header) // 响应头// 接收具体的响应内容,从Body里面获取//Body是IO流// The response body is streamed on demand as the Body field is read.// Body io.ReadCloser//循环从Body流中读取buf := make([]byte, 1024)for {n, err := resp.Body.Read(buf)if err != nil && err != io.EOF {fmt.Println("读取出现了错误")return} else {fmt.Println("读取完毕")res := string(buf[:n])fmt.Println("服务器响应的数据为:", res)break}}}

在这里插入图片描述

3. 带参数的请求

客户端编写

  • url的参数拼接 ?拼接 & 连接
package mainimport ("fmt""io""net/http""net/url"
)func main() {// 复杂请求urlStr := "http://127.0.0.1:8080/login" // ?// 参数如何拼接到url上,参数封装为数据url.Values{}data := url.Values{}//通过url.Values.Set()方法,将参数拼接到url上data.Set("username", "admin")  // ?data.Set("password", "123456") // ?// 将url字符串转化为url对象,并给携带数据// func ParseRequestURI(rawURL string) (*URL, error)urlNew, _ := url.ParseRequestURI(urlStr)urlNew.RawQuery = data.Encode()// http://127.0.0.1:8080/login?password=123456&username=admin// ? get的传参,多个参数之间使用 & 连接fmt.Println(urlNew)//查看类型fmt.Printf("%T \n", urlNew)// 发请求,参数是一个字符串地址resp, _ := http.Get(urlNew.String())defer resp.Body.Close()// 读取resp响应信息,一次性读完,返回buf// func ReadAll(r Reader) ([]byte, error)buf, _ := io.ReadAll(resp.Body)fmt.Println(string(buf))
}

服务端:


// http_server.go
package mainimport ("fmt""net/http"
)// 定义发送接收数据函数
func login(resp http.ResponseWriter, req *http.Request) {// 模拟数据库中存在一个数据mysqlUserData := "admin"mysqlPwdData := "123456"fmt.Println("接收到了login请求")// 拿到请求中的查询参数urlData := req.URL.Query()username := urlData.Get("username")password := urlData.Get("password")// 登录逻辑, 将客户端发送的数据和系统数据比对实现登录业务if username == mysqlUserData {if password == mysqlPwdData {resp.Write([]byte("登录成功"))} else {resp.Write([]byte("密码错误"))}} else {resp.Write([]byte("登录失败"))}}func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的,一直监听请求// 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径,第二个参数是一个函数http.HandleFunc("/login", login)fmt.Println("Starting server at :8080")// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。//如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

登录成功
在这里插入图片描述

4. POST请求提交Form表单

客户端

package mainimport ("fmt""io""net/http""net/url"
)func main() {// 目标URLurlStr := "http://127.0.0.1:8080/register"// 构建表单数据formData := url.Values{}formData.Set("username", "admin")formData.Set("password", "123456")// 发送POST请求// func PostForm(url string, data url.Values) (resp *Response, err error)resp, err := http.PostForm(urlStr, formData)if err != nil {fmt.Println("Error sending POST request:", err)return}defer resp.Body.Close()// 读取响应体body, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("Error reading response body:", err)return}// 打印响应状态码和响应体fmt.Println("Response Status:", resp.Status)fmt.Println("Response Body:", string(body))
}

在这个例子中,我们首先定义了目标URL和表单数据。然后,我们使用 url.Values 类型的 formData 来存储表单键值对,并通过 formData.Set 方法添加数据。最后,我们调用 http.PostForm 函数发送请求,并处理响应。

请注意,http.PostForm 简化了表单数据的发送过程,但如果你需要发送非表单数据(如JSON),你应该使用 http.NewRequest 和 http.Client.Do 方法来构建和发送自定义请求。
此外,http.PostForm 发送的请求体是 application/x-www-form-urlencoded 格式的,这通常用于HTML表单提交,但不适用于所有类型的API请求。

服务端

// http_server.go
package mainimport ("fmt""net/http"
)// 定义发送接收数据函数
func register(resp http.ResponseWriter, req *http.Request) {fmt.Println("接收到了注册请求")// 解析表单// 处理表单的请求, 前端提交表单-后盾解析表单// func (r *Request) ParseForm() errorerr := req.ParseForm()if err != nil {return}// 获取表单参数 postusername := req.PostForm.Get("username")password := req.PostForm.Get("password")fmt.Println(username, password)// 很多的判断// 短信// 验证码// 存到数据库resp.Write([]byte("注册成功"))
}func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的,一直监听请求// 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径,第二个参数是一个函数http.HandleFunc("/register", register)fmt.Println("Starting server at :8080")// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。//如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

客户端运行
在这里插入图片描述

服务端运行
在这里插入图片描述

http.NewRequest 和 http.Client.Do 发送表单请求

客户端:

package mainimport ("fmt""io""net/http""net/url""strings"
)func main() {// 构建HTTP客户端client := &http.Client{}// 定义POST URLmyurl := "http://127.0.0.1:8080/register"// 定义HTTP负载data := url.Values{}data.Set("username", "John Doe")data.Set("password", "123456")// 将url.Values编码为表单格式的字符串,并创建一个Readerpayload := strings.NewReader(data.Encode())// 发送POST请求// func NewRequest(method, url string, body io.Reader) (*Request, error)req, err := http.NewRequest("POST", myurl, payload)if err != nil {fmt.Println("Error creating request:", err)return}// 设置HTTP消息头req.Header.Set("Content-Type", "application/x-www-form-urlencoded")// 执行HTTP请求// func (c *Client) Do(req *Request) (*Response, error)resp, err := client.Do(req)if err != nil {fmt.Println("Error sending request:", err)return}defer resp.Body.Close()// 读取响应状态码fmt.Println("Response Status:", resp.Status)// 读取响应体body, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("Error reading response body:", err)return}// 打印响应体fmt.Println("Response Body:", string(body))
}

在这里插入图片描述

5. POST请求提交Json数据

有时,我们需要发送JSON格式的POST请求。为此,我们可以使用encoding/json包将数据结构转换为JSON字符串,然后将其作为请求体发送。

客户端:

package mainimport ("bytes""encoding/json""fmt""io""net/http"
)type LoginRequest struct {Username string `json:"username"`Password string `json:"password"`
}func main() {// 创建一个http.Client对象client := &http.Client{}// 构建一个LoginRequest对象data := LoginRequest{Username: "zhangsan",Password: "password",}// 将LoginRequest对象转换为JSON字符串jsonData, err := json.Marshal(data)if err != nil {fmt.Println("JSON编码失败:", err)return}// 创建一个请求对象req, err := http.NewRequest("POST", "http://127.0.0.1:8080/post", bytes.NewBuffer(jsonData))if err != nil {fmt.Println("创建请求失败:", err)return}// 设置请求头的内容类型为application/jsonreq.Header.Set("Content-Type", "application/json")// 发送请求并获取响应resp, err := client.Do(req)if err != nil {fmt.Println("请求发送失败:", err)return}defer resp.Body.Close()// 读取并处理服务器返回的响应body, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("读取响应失败:", err)return}fmt.Println("响应状态码:", resp.StatusCode)fmt.Println("响应内容:", string(body))
}

服务端:

// http_server.go
package mainimport ("encoding/json""fmt""io""net/http"
)type Result struct {Username string `json:"username"`Password string `json:"password"`
}// 定义发送接收数据函数
func postHandler(resp http.ResponseWriter, req *http.Request) {// 确保处理的是POST请求if req.Method != "POST" {http.Error(resp, "Invalid request method", http.StatusMethodNotAllowed)return}// 读取请求体中的数据body, err := io.ReadAll(req.Body)if err != nil {http.Error(resp, "Error reading request body", http.StatusInternalServerError)return}defer req.Body.Close()// 打印请求体中的数据fmt.Printf("Received POST request with body: %s\n", string(body))//将json字符串反序列化为原生结构体var result Resultif err := json.Unmarshal(body, &result); err != nil {http.Error(resp, "Error parsing request body", http.StatusInternalServerError)}fmt.Println("客户端发来的数据:", result)fmt.Printf("客户端发来的数据:%+v\n", result)fmt.Printf("数据类型%T\n", result)// 发送响应给客户端// Received your POST request. This is the response!resp.Write([]byte("服务端接收到数据"))
}func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的,一直监听请求// 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径,第二个参数是一个函数http.HandleFunc("/post", postHandler)fmt.Println("Starting server at :8080")// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。//如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

运行服务端,客户端,请求成功,服务端拿到json数据。
在这里插入图片描述

三、错误处理

在HTTP编程中,错误处理是非常重要的。我们需要优雅地处理各种可能的错误,如网络错误、解析错误、数据库错误等。

下面是一个简单的错误处理示例。

package mainimport ("encoding/json""fmt""log""net/http"
)type ErrorResponse struct {Error string `json:"error"`
}func helloHandler(w http.ResponseWriter, r *http.Request) {// 模拟一个错误err := fmt.Errorf("something went wrong")if err != nil {handleError(w, err)return}fmt.Fprintf(w, "Hello, World!")
}func handleError(w http.ResponseWriter, err error) {log.Println("Error:", err)w.Header().Set("Content-Type", "application/json")w.WriteHeader(http.StatusInternalServerError)json.NewEncoder(w).Encode(ErrorResponse{Error: err.Error()})
}func main() {http.HandleFunc("/", helloHandler)fmt.Println("Starting server at :8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

在这个示例中,我们定义了一个ErrorResponse结构体,用于表示错误响应。然后,在helloHandler中,我们模拟了一个错误,并调用handleError函数来处理该错误。handleError函数记录了错误日志,设置了响应头和内容类型,并返回了一个JSON格式的错误响应。

相关文章:

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

SOLIDWORKS参数化软件

在产品设计和工程领域&#xff0c;参数化设计是一种革命性的方法&#xff0c;它允许设计者通过定义一系列规则和关系来创建和修改模型。参数化设计的核心在于将设计过程分解为一系列可调整的参数&#xff0c;如尺寸、形状、材料属性等&#xff0c;这些参数之间通过数学关系相互…...

上位机开发常用技术 C# Task 线程 开始,暂停,继续,停止

上位机开发中一定会用到的技术就是 设备的线程开始运行执行生产流程&#xff0c;在生产过程中会有要打开安全门或暂停设备动作&#xff0c;人为去排除设备小问题的时就要用到暂停功能&#xff0c;问题排除后设备继续运行&#xff0c;生产完成后设备停止。 这些操作是上位机开发…...

MySQL 密码忘记了怎么办?

在使用 MySQL 的过程中&#xff0c;有时候我们可能会忘记密码。别担心&#xff0c;本文将详细介绍在 Windows 系统下如何重新设置 MySQL 密码。 一、停止 MySQL 服务 打开“服务”窗口&#xff0c;可以通过在 Windows 搜索栏中输入“服务”来找到并打开它。在服务列表中找到“…...

Java中常见的自带数据结构类

目录 一、ArrayList&#xff08;动态数组&#xff09; 特性 常用方法 二、LinkedList&#xff08;双向链表&#xff09; 特性 常用方法 三、ArrayDeque&#xff08;双端队列&#xff09; 特性 常用方法 四、HashMap&#xff08;哈希表&#xff09; 特性 常用方法 五、TreeMap&…...

数据结构——链表,哈希表

文章目录 链表python实现双向链表复杂度分析 哈希表&#xff08;散列表&#xff09;python实现哈希表哈希表的应用 链表 python实现 class Node:def __init__(self, item):self.item itemself.next Nonedef head_create_linklist(li):head Node(li[0])for element in li[1…...

如何使用Python对Excel、CSV文件完成数据清洗与预处理?

在数据分析和机器学习项目中&#xff0c;数据清洗与预处理是不可或缺的重要环节。 现实世界中的数据往往是不完整、不一致且含有噪声的&#xff0c;这些问题会严重影响数据分析的质量和机器学习模型的性能。 Python作为一门强大的编程语言&#xff0c;提供了多种库和工具来帮…...

第8篇:网络安全基础

目录 引言 8.1 网络安全的基本概念 8.2 网络威胁与攻击类型 8.3 密码学的基本思想与加密算法 8.4 消息认证与数字签名 8.5 网络安全技术与协议 8.6 总结 第8篇&#xff1a;网络安全基础 引言 在现代信息社会中&#xff0c;计算机网络无处不在&#xff0c;从互联网到局…...

Flutter 中的 PopScope 小部件:全面指南

Flutter 中的 PopScope 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;导航和路由管理是构建复杂应用时必须面对的挑战之一。PopScope 小部件是 Flutter 2.0 版本引入的一个新功能&#xff0c;它提供了一种更灵活的方式来控制页面的弹出和返回行为。本文将带你…...

视频剪辑的未来

技术发展推动4&#xff1a; 人工智能与自动化辅助&#xff1a;人工智能在视频剪辑中的应用将不断深化。例如&#xff0c;智能剪辑软件能够自动分析视频素材的内容、情感和节奏&#xff0c;快速生成初步的剪辑版本&#xff0c;剪辑师在此基础上进行进一步的优化和调整&#xff0…...

通过PHP与API的结合,开启电商数据集成的新篇章

在数字化转型的浪潮中&#xff0c;电子商务数据的集成对于企业来说变得越来越重要。无论是在线零售商还是品牌商&#xff0c;都需要实时访问商品数据以优化库存管理、制定定价策略、提升客户体验。PHP&#xff0c;作为服务端脚本语言的佼佼者&#xff0c;为开发者提供了强大的工…...

使用 CDN 后 Apache 的日志记录客户真实 IP

经常搭建网站服务器的都知道&#xff0c;在给站点使用了 CDN 后 Web 应用的日志记录里就会只记录 CDN 节点 IP 了&#xff0c;这就没法看到真实客户请求 IP&#xff0c;对于日志分析、运维日常维护来说就有点儿麻烦了&#xff0c;今天明月结合在五洛云服务器上搭建的Apache环境…...

ORACLE 19C安装 RAC报错

1. 问题描述 在Oracle 19C RAC的安装过程中&#xff0c;使用克隆方式在两个节点上部署集群。当第一个节点配置好基础服务后&#xff0c;关机并克隆节点。当尝试在第二个节点上通过页面进行RAC安装时&#xff0c;出现以下错误&#xff1a; [INS-32070] Could not remove the n…...

省心英语 3.9.9| 资源最全面的英语学习App

省心英语是一款资源全面的英语学习软件&#xff0c;完全免费且无广告&#xff0c;内含丰富的词库和范文、中小学、四六级、考研、专四专八、雅思托福、新概念等所有阶段的学习内容。软件支持练听力、背单词、阅读理解等功能&#xff0c;覆盖了听说读写全方位学习。听力部分包含…...

ruoyi框架动态切换数据库

需求背景 最近需要一个小demo,项目中需要同时连接sqlserver和mysql数据库。 操作教程 1、pom.xml -- 修改common/pom.xml<!-- 动态数据源 --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-star…...

iba Data Export 导出面板选项

时间线选择真实时间“Absolute date / time” 时间间隔选择0.5Sec.&#xff08;最小为0.01Sec.&#xff09; 右侧数据根据需要选择...

过滤器Filter的介绍和使用

1.简介 在 Java Web 开发中&#xff0c;Filter 是一个非常重要的组件&#xff0c;用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。Filter 可以用来实现多种功能&#xff0c;如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层…...

JMeter之mqtt-jmeter 插件介绍

前言 mqtt-jmeter插件是JMeter中的一个第三方插件&#xff0c;用于支持MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议的性能测试。MQTT是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网和传感器网络中。 一、安装插件 mqtt-jmeter项目…...

Nacos2.3.2在ubuntu中的部署

Nacos2.3.2 在ubuntu下的部署 下载地址 发布历史 | Nacos 官网 https://download.nacos.io/nacos-server/nacos-server-2.3.2.zip 修改 application.properties文件 开启鉴权 ### 开启鉴权功能 nacos.core.auth.caching.enabledtrue ### The auth system to use, current…...

Xilinx远程固件升级(一)——QuickBoot方案

Xilinx 7系FPGA远程更新方案——QuickBoot方式远程更新bit 一、远程更新背景和架构 对于非ZYNQ系列的常规FPGA来说&#xff0c;对于bit的更新一般使用JTAG进行烧录。而作为商用产品&#xff0c;想要进行OTA升级时&#xff0c;使用JTAG的升级方式显然不适合&#xff0c;因此&a…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...