当前位置: 首页 > 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…...

O(1)调度算法与CFS

目录 引言 linux内核的O&#xff08;1&#xff09;进程调度算法介绍 主要特点 工作原理 优点 缺点 运行队列 活动队列 过期队列 active指针和expired指针 O(1)调度器&#xff0c;两个队列的机制 两个队列的机制如下&#xff1a; 这个算法后期被CFS替代 CFS 工作原…...

SpringBoot——静态资源访问的四种方式

1.默认的静态资源目录 /static /public /resources /META-INF/resources 动态资源目录&#xff1a;/templates 2.resources静态资源目录图片存放 3. 静态资源访问 3.1.通过路径访问静态资源 http://localhost:8080/a.jpg http://localhost:8080/b.jpg …...

WPF中的Style如何使用

在 WPF 中&#xff0c;Style 是一个非常重要的概念&#xff0c;它用于定义控件的默认外观和行为。以下是如何使用 Style 的一些基本步骤和示例&#xff1a; 1. 定义 Style 资源 通常在 XAML 的资源部分&#xff08;ResourceDictionary&#xff09;中定义样式。 2. 指定 Targ…...

数据分析案例-欺诈性电子商务交易数据集可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行

智慧导诊系统源码&#xff0c;java源码&#xff0c;大屏机自动导诊&#xff0c;互联网医院智能导诊系统源码 老是全身无力&#xff0c;挂什么科&#xff1f; 经常头痛&#xff0c;挂什么科&#xff1f; 总是失眠&#xff0c;又得挂哪个科&#xff1f; 世界上最遥远的距离再加…...

公交线路查询web管理系统||公交线路查询|基于SprinBoot+vue公交线路查询系统(源码+数据库+文档)

公交线路查询web管理系统 目录 基于SprinBootvue公交线路查询系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xf…...

AI对于智能网联汽车发展路径的演化的助力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

linux java17 - linux环境 centos7卸载java8安装java17

前言 因为springboot3不再支持java8&#xff0c;最近开始转java17&#xff0c;具体要求如下 ‌Spring Boot 3要求使用Java 17或更高版本&#xff0c;不支持Java 8。‌ Spring Boot 3.0 正式版已经发布&#xff0c;并且明确要求最低支持Java 17‌12。 Spring Boot 3.0 正式版发…...

高中数学:立体几何-外接球的外心法

文章目录 一、外心法定义二、习题1、例题一2、例题二3、例题三4、例题四 一、外心法定义 依然以三棱锥为例 即&#xff0c;找到三棱锥的外接球的球心&#xff0c;从而可以确定出外接球的半径R。 而三棱锥有四个顶点&#xff0c;这四个顶点必然都在外接球的球面上。 寻找思路…...

【Python-AI篇】人工智能python基础-计算机组成原理

1. 计算机组成原理 2. python基础&#xff08;查漏补缺&#xff09; 2.1 字符串 2.1.1 字符串查找方法 find()&#xff1a; 检测某个字符串是否包含在这个字符串中&#xff0c;在的话返回下标&#xff0c;不在的话返回-1index()&#xff1a; 检测某个字符串是否包含在这个字…...