Go語言實戰 : API服務器 (2) 運行流程

1.API服務器的總流程

分為兩步:

  1. 啟動API服務器
  2. API服務器對HTTP請求進行處理

2.API服務器啟動流程

  1. 解析配置文件,利用配置文件完成對服務器的初始化配置
  2. 初始化logger,開啟日志記錄
  3. 與數據庫建立連接
  4. 設置http連接(例如設置響應頭,注冊路由,注冊中間件)

3.HTTP 請求處理流程

  1. DNS域名解析
    DNS的過程是這樣的:首先我們知道我們本地的機器上在配置網絡時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS服務器,如果能夠找到相應的url則返回其ip,否則該DNS將繼續將該解析請求發送給上級DNS,整個DNS可以看做是一個樹狀結構,該請求將一直發送到根直到得到結果。現在已經擁有了目標ip和端口號,這樣我們就可以打開socket連接了。

  2. 建立連接
    當我們輸入這樣一個請求時,首先要建立一個socket連接,因為socket是通過ip和端口建立的(tcp鏈接),所以之前還有一個DNS解析過程,把域名變成ip,如果url里不包含端口號,則會使用該協議的默認端口號。

  3. 發送請求
    連接成功建立后,開始向web服務器發送請求,這個請求一般是GET或POST命令(POST用于FORM參數的傳遞)。GET命令的格式為GET 路徑/文件名 HTTP/1.0
    文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本)

現在可以發送GET命令:GET /mydir/index.html HTTP/1.0

  1. 接收請求
    API服務器收到這個請求,進行處理,首先根據 HTTP 請求行的信息來解析到 HTTP 方法和路徑,之后根據 API 服務器注冊的路由信息(大概可以理解為:HTTP 方法 + 路徑和具體處理函數的映射)找到具體的處理函數。

  2. 處理請求
    在接收到請求之后,API 通常會解析 HTTP 請求報文獲取請求頭和消息體,然后根據這些信息進行相應的業務處理,HTTP 框架一般都有自帶的解析函數,只需要輸入 HTTP 請求報文,就可以解析到需要的請求頭和消息體。

例如對應剛剛的get請求,就會解析出請求的消息頭和消息體,然后API服務器就根據解析出來的內容,從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務器把該文件內容傳送給相應的Web瀏覽器。

業務處理主要可以分為:

  1. 包含對數據庫的操作:需要訪問數據庫(增刪改查),然后獲取指定的數據,對數據處理后構建指定的響應結構體,返回響應包。
  2. 不包含對數據庫的操作:進行業務邏輯處理后,構建指定的響應結構體,返回響應包。

4.REST Web 框架選擇

要編寫一個 RESTful 風格的 API 服務器,首先需要一個 RESTful Web 框架,選擇 GitHub star 數最多的 Gin。采用輕量級的 Gin 框架,具有如下優點:

  • 快速

基于 Radix 樹的路由,小內存占用。沒有反射。可預測的 API 性能。

  • 支持中間件

傳入的 HTTP 請求可以由一系列中間件和最終操作來處理。例如:Logger,Authorization,GZIP,最終操作 DB。

  • Crash 處理

Gin 可以 catch 一個發生在 HTTP 請求中的 panic 并 recover 它。這樣,你的服務器將始終可用。例如,你可以向 Sentry 報告這個 panic!

  • JSON 驗證

Gin 可以解析并驗證請求的 JSON,例如檢查所需值的存在。

  • 路由組

更好地組織路由。是否需要授權,不同的 API 版本…… 此外,這些組可以無限制地嵌套而不會降低性能。

  • 錯誤管理

Gin 提供了一種方便的方法來收集 HTTP 請求期間發生的所有錯誤。最終,中間件可以將它們寫入日志文件,數據庫并通過網絡發送。

  • 內置渲染

Gin 為 JSON,XML 和 HTML 渲染提供了易于使用的 API。

  • 可擴展性

新建一個中間件非常簡單

5.配置解決方案

Viper是適用于Go應用程序的完整配置解決方案。它被設計用于在應用程序中工作,并且可以處理所有類型的配置需求和格式,具有如下特性:

  • 設置默認值
  • 從JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件讀取配置信息
  • 實時監控和重新讀取配置文件(可選)
  • 從環境變量中讀取
  • 從遠程配置系統(etcd或Consul)讀取并監控配置變化
  • 從命令行參數讀取配置
  • 從buffer讀取配置
  • 顯式配置值

從上面這些特性來看,Viper 毫無疑問是非常強大的,而且 Viper 用起來也很方便,在初始化配置文件后,讀取配置只需要調用 viper.GetString()、viper.GetInt() 和 viper.GetBool() 等函數即可。

Viper能夠執行下列操作:

  1. 查找、加載和反序列化JSON、TOML、YAML、HCL、INI、envfile和Java properties格式的配置文件;
  2. 提供一種機制為你的不同配置選項設置默認值;
  3. 提供一種機制來通過命令行參數覆蓋指定選項的值;
  4. 提供別名系統,以便在不破壞現有代碼的情況下輕松重命名參數;
  5. 當用戶提供了與默認值相同的命令行或配置文件時,可以很容易地分辨出它們之間的區別;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391360.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391360.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 命令 之查看程序占用內存

2019獨角獸企業重金招聘Python工程師標準>>> 查看PID ps aux | grep nginx root 3531 0.0 0.0 18404 832 ? Ss 15:29 0:00 nginx: master process ./nginx 查看占用資源情況 pmap -d 3531 top -p 3531 轉載于:https://my.oschina.net/mengzha…

邏輯回歸 自由度_回歸自由度的官方定義

邏輯回歸 自由度Back in middle and high school you likely learned to calculate the mean and standard deviation of a dataset. And your teacher probably told you that there are two kinds of standard deviation: population and sample. The formulas for the two a…

動畫電影的幕后英雄怎么說好_幕后編碼面試-好與壞

動畫電影的幕后英雄怎么說好Interviewing is a skill in and of itself. You can be the best developer in the world but you may still screw up an interview.面試本身就是一種技能。 您可以成為世界上最好的開發人員,但您仍可能會搞砸面試。 How many times h…

數據庫之DML

1、表的有關操作: 1.1、表的創建格式: CREATE TABLE IF NOT EXISTS 表名(屬性1 類型,屬性2 類型,....,屬性n 類型);# 標記部分表示可以省略 1.2、表的修改格式:ALTER table 表名 ADD…

網絡對抗技術作業一 201421410031

姓名:李冠華 學號:201421410031 指導教師:高見 1、虛擬機安裝與調試 安裝windows和linux(kali)兩個虛擬機,均采用NAT網絡模式,查看主機與兩個虛擬機器的IP地址,并確保其連通性。同時…

生存分析簡介:Kaplan-Meier估計器

In my previous article, I described the potential use-cases of survival analysis and introduced all the building blocks required to understand the techniques used for analyzing the time-to-event data.在我的上一篇文章中 ,我描述了生存分析的潛在用例…

強密碼檢測

#!/usr/bin/env python # -*- coding: utf-8 -*- #1. 密碼長度應該大于或等于8位 #2. 密碼必須包含數字、字母及特殊字符三種組合 nums 0123456789 chars1 abcdefghijklmnopqrstuvwxyz chars2 ABCDEFGHIJKLMNOPQRSTUVWXYZ symbols r!#$%^&*()_-/*{}[]\|";:/?…

OD Linux發行版本

題目描述: Linux操作系統有多個發行版,distrowatch.com提供了各個發行版的資料。這些發行版互相存在關聯,例如Ubuntu基于Debian開發,而Mint又基于Ubuntu開發,那么我們認為Mint同Debian也存在關聯。 發行版集是一個或多…

Go語言實戰 : API服務器 (3) 服務器雛形

簡單API服務器功能 實現外部請求對API 服務器健康檢查和狀態查詢,返回響應結果 1.API服務器的狀態監測 以內存狀態檢測為例,獲取當前服務器的健康狀況、服務器硬盤、CPU 和內存使用量 func RAMCheck(c *gin.Context) {u, _ : mem.VirtualMemory()//獲…

TCP/IP協議-1

轉載資源,鏈接地址https://www.cnblogs.com/evablogs/p/6709707.html 轉載于:https://www.cnblogs.com/Chris-01/p/11474915.html

http://nancyfx.org + ASPNETCORE

商務產品servicestack: https://servicestack.net/ http://nancyfx.org ASPNETCORE http://nancyfx.org Drapper ORM精簡框架 https://github.com/StackExchange/Dapper Nancy 是一個輕量級用于構建基于 HTTP 的 Web 服務,基于 .NET 和 Mono 平…

使用r語言做garch模型_使用GARCH估計貨幣波動率

使用r語言做garch模型Asset prices have a high degree of stochastic trends inherent in the time series. In other words, price fluctuations are subject to a large degree of randomness, and therefore it is very difficult to forecast asset prices using traditio…

ARC下的內存泄漏

##ARC下的內存泄漏 ARC全稱叫 ARC(Automatic Reference Counting)。在編譯期間,編譯器會判斷對象的使用情況,并適當的加上retain和release,使得對象的內存被合理的管理。所以,從本質上說ARC和MRC在本質上是一樣的,都是…

python:校驗郵箱格式

# coding:utf-8import redef validateEmail(email):if re.match("^.\\(\\[?)[a-zA-Z0-9\\-\\.]\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) ! None:# if re.match("/^\w[a-z0-9]\.[a-z]{2,4}$/", email) ! None:print okreturn okelse:print failret…

cad2019字體_這些是2019年最有效的簡歷字體

cad2019字體When it comes to crafting the perfect resume to land your dream job, you probably think of just about everything but the font. But font is a key part of your first impression to recruiters and employers.當制作一份完美的簡歷來實現理想的工作時&…

Go語言實戰 : API服務器 (4) 配置文件讀取及連接數據庫

讀取配置文件 1. 主函數中增加配置初始化入口 先導入viper包 import (..."github.com/spf13/pflag""github.com/spf13/viper""log")在 main 函數中增加了 config.Init(*cfg) 調用,用來初始化配置,cfg 變量值從命令行 f…

方差偏差權衡_偏差偏差權衡:快速介紹

方差偏差權衡The bias-variance tradeoff is one of the most important but overlooked and misunderstood topics in ML. So, here we want to cover the topic in a simple and short way as possible.偏差-方差折衷是機器學習中最重要但被忽視和誤解的主題之一。 因此&…

win10 uwp 讓焦點在點擊在頁面空白處時回到textbox中

原文:win10 uwp 讓焦點在點擊在頁面空白處時回到textbox中在網上 有一個大神問我這樣的問題:在做UWP的項目,怎么能讓焦點在點擊在頁面空白處時回到textbox中? 雖然我的小伙伴認為他這是一個 xy 問題,但是我還是回答他這個問題。 首…

python:當文件中出現特定字符串時執行robot用例

#coding:utf-8 import os import datetime import timedef execute_rpt_db_full_effe_cainiao_city():flag Truewhile flag:# 判斷該文件是否存在# os.path.isfile("/home/ytospid/opt/docker/jsc_spider/jsc_spider/log/call_proc.log")# 存在則獲取昨天日期字符串…

MySQL分庫分表方案

1. MySQL分庫分表方案 1.1. 問題:1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非萬不得已,否則不要去干它。1.2.2. 你的SQL語句不再是聲明式的(declarative)1.2.3. 你招致了大量的網絡延時1.2.4. 你失去…