Go設(shè)計(jì)模式之代理模式講解和代碼示例
Go 代理模式講解和代碼示例
代理是一種結(jié)構(gòu)型設(shè)計(jì)模式, 讓你能提供真實(shí)服務(wù)對(duì)象的替代品給客戶端使用。 代理接收客戶端的請(qǐng)求并進(jìn)行一些處理 (訪問控制和緩存等), 然后再將請(qǐng)求傳遞給服務(wù)對(duì)象。
代理對(duì)象擁有和服務(wù)對(duì)象相同的接口, 這使得當(dāng)其被傳遞給客戶端時(shí)可與真實(shí)對(duì)象互換。
概念示例
Nginx 這樣的 Web 服務(wù)器可充當(dāng)應(yīng)用程序服務(wù)器的代理:
- 提供了對(duì)應(yīng)用程序服務(wù)器的受控訪問權(quán)限。
- 可限制速度。
- 可緩存請(qǐng)求。
server.go: 主體
package main type server interface { handleRequest(string, string) (int, string) }
nginx.go: 代理
package main type Nginx struct { application *Application maxAllowedRequest int rateLimiter map[string]int } func newNginxServer() *Nginx { return &Nginx{ application: &Application{}, maxAllowedRequest: 2, rateLimiter: make(map[string]int), } } func (n *Nginx) handleRequest(url, method string) (int, string) { allowed := n.checkRateLimiting(url) if !allowed { return 403, "Not Allowed" } return n.application.handleRequest(url, method) } func (n *Nginx) checkRateLimiting(url string) bool { if n.rateLimiter[url] == 0 { n.rateLimiter[url] = 1 } if n.rateLimiter[url] > n.maxAllowedRequest { return false } n.rateLimiter[url] = n.rateLimiter[url] + 1 return true }
application.go: 真實(shí)主體
package main type Application struct{} func (a *Application) handleRequest(url, method string) (int, string) { if url == "/app/status" && method == "GET" { return 200, "ok" } if url == "/create/user" && method == "POST" { return 201, "user created" } return 404, "Not OK" }
main.go: 客戶端代碼
package main import "fmt" func main() { nginxServer := newNginxServer() appStatusURL := "/app/status" createuserURL := "/create/user" httpCode, msg := nginxServer.handleRequest(appStatusURL, "GET") fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg) httpCode, msg = nginxServer.handleRequest(appStatusURL, "GET") fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg) httpCode, msg = nginxServer.handleRequest(appStatusURL, "GET") fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg) httpCode, msg = nginxServer.handleRequest(createuserURL, "POST") fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg) httpCode, msg = nginxServer.handleRequest(createuserURL, "GET") fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg) }
output.txt: 執(zhí)行結(jié)果
Url: /app/status
HttpCode: 200
Body: okUrl: /app/status
HttpCode: 200
Body: okUrl: /app/status
HttpCode: 403
Body: Not AllowedUrl: /app/status
HttpCode: 201
Body: user createdUrl: /app/status
HttpCode: 404
Body: Not OK
到此這篇關(guān)于Go設(shè)計(jì)模式之代理模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go代理模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GO比較兩個(gè)對(duì)象是否相同實(shí)戰(zhàn)案例
我們時(shí)常有比較兩個(gè)值是否相等的需求,下面這篇文章主要給大家介紹了關(guān)于GO比較兩個(gè)對(duì)象是否相同的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄
這篇文章主要介紹了詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式
這篇文章主要介紹了golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12使用Golang簡單實(shí)現(xiàn)七牛圖片處理API
本文給大家實(shí)現(xiàn)的是使用Golang簡單實(shí)現(xiàn)七牛圖片處理API的方法和步驟,基于PIPE庫實(shí)現(xiàn)的,非常的實(shí)用,有需要的小伙伴可以參考下2016-08-08go使用errors.Wrapf()代替log.Error()方法示例
這篇文章主要為大家介紹了go使用errors.Wrapf()代替log.Error()的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08