
波斯語的意思是“小”或“ li'l”。調情時通常用來指一個女孩(帶有含義,li'l女孩)
城市詞典
歡迎來到Koochooloo :一個優雅,實用的項目,旨在簡化Golang應用程序的開發。 Koochooloo擁有一個組織良好的建築,集成了重要的功能,例如數據庫處理和配置管理,以使用GO構建強大的REST應用程序的最佳實踐。
init功能:避開全球範圍和init功能的複雜性,以使事情變得簡單。Koochooloo利用fx作為我們的依賴注入框架,提供:
fx在測試中使用與生產相同的環境的環境。與Koochooloo一起踏上旅程,並重新定義您在GO中創建RESTFUL應用程序的方法。無論您是擴大技能還是為複雜應用程序建立堅實的基礎, Koochooloo都是您的高效,乾淨和可擴展軟件設計的合作夥伴。
首先, cmd軟件包包含使用Cobra的二進製文件。對於可以在項目的啟動階段運行的數據庫遷移等任務,有一個簡單的二進製文件,這是一件好事。每個Register文件都有其main.go 。在cmd的root.go中,這些Register功能從子命令中調用。這是寄存器功能的示例:
// Register server command.
func Register ( root * cobra. Command ) {
root . AddCommand (
& cobra. Command {
Use : "server" ,
Short : "Run server to serve the requests" ,
Run : func ( _ * cobra. Command , _ [] string ) {
fx . New (
fx . Provide ( config . Provide ),
fx . Invoke ( main ),
). Run ()
},
},
)
}再次,每個命令單獨註冊其標誌,因此我們與其他命令有分離。有時,我們需要在命令之間具有共享標誌,那麼最好將它們放入config中。對於以後的情況, koanf可以幫助我們建立以下結構:
func Register ( fs * pflag. FlagSet ) {
fs . StringP (
"url" , "u" ,
nats . DefaultURL ,
fmt . Sprintf ( "nats server url(s) e.g. %s" , nats . DefaultURL ),
)
}此函數寄存器共享標誌,然後我們將基於它們加載配置,並具有以下功能:
k := koanf . New ( "." )
if err := k . Load ( posflag . Provider ( fs , "." , k ), nil ); err != nil {
log . Errorf ( "error loading config.yml: %s" , err )
}
if err := k . Unmarshal ( "" , & instance ); err != nil {
log . Fatalf ( "error unmarshalling config: %s" , err )
}每個應用程序的主要部分是其配置。從配置文件到環境變量,項目中有許多方法可以使用配置。 Koanf將所有這些都放在一個美麗的包裹中。這裡的要點是:
config Module中定義,並且它將在其啟動時傳遞給它。PS Koanf的鍵入配置比Viper好。通過鍵入配置,我的意思是您有一個定義的配置結構,然後從許多源加載配置中。
對於安裝Koanf,您可以使用以下命令:
go get -u github.com/knadh/koanf/v2
go get -u github.com/knadh/koanf/providers/file
go get -u github.com/knadh/koanf/providers/env
go get -u github.com/knadh/koanf/providers/structs
go get -u github.com/knadh/koanf/parsers/toml在domain軟件包中定義的軟件包和服務僅使用domain的其他軟件包,而無需使用任何第三方軟件包。這些軟件包和服務指定了核心域概念。
有一個db軟件包負責連接到數據庫。該軟件包使用在config模塊中定義的數據庫配置並創建數據庫實例。在此之前,最好在此處ping您的數據庫在數據庫實例中充分自信。同樣,對於在數據庫健康方面的洞察力,您可以定期調用此PING功能,並通過指標報告其結果(我在這裡不做)。
項目模型在model軟件包中定義。這些模型在內部使用,但可以用於response或request軟件包。沒有結構可以與此軟件包中的數據庫進行通信。
存儲庫負責使用數據庫進行通信以存儲或檢索模型。存儲庫是interface ,並且有一個具體的嘲笑實現。混凝土實現在主代碼中使用,模擬的實現用於測試。請注意,存儲庫的測試很敏感,並且使用實際數據庫進行。
HTTP處理程序在handler軟件包中定義。 Echo是一個很棒的HTTP框架,它具有您需要的東西。每個處理程序的結構都有一個Register方法,該方法將其路線註冊到給定的路線組中。路由組是從ECHO框架中的一個概念,用於在特定的父路徑下分組路線。每個處理程序都有所需的結構。處理程序結構是在main.go中創建的,然後在其組上註冊。
type Healthz struct {}
// Handle shows server is up and running.
func ( h Healthz ) Handle ( c echo. Context ) error {
return c . NoContent ( http . StatusNoContent )
}
// Register registers the routes of healthz handler on given echo group.
func ( h Healthz ) Register ( g * echo. Group ) {
g . GET ( "/healthz" , h . Handle )
}所有指標均使用基於開放的Prometheus收集。每個軟件包都有其metric.go定義一個結構包含指標並具有更改它們的方法。為了從普羅米修斯遷移到另一項服務,您只需要更改telemetry即可。指標不是全局的,由於開放的遙測設計,它們為每個實例創建。對於在指標端點上具有更好的控制器,還有另一台HTTP服務器在telemetry軟件包中定義用於監視。
分開包裹的請求和響應是一件好事。這些軟件包還包含驗證邏輯。 GO中的良好驗證Pakcages之一是Ozzo-validator。提供驗證方法後,獲得請求後,您可以輕鬆地使用其方法驗證它。
記錄一個應用程序中最重要的部分。一開始,除了簡單的Stdout日誌外,沒有更多的東西。但是將來,您需要將記錄並將其運送到聚合系統中,因為當您的系統成長時,從文本日誌中檢測出問題將是不可能的。
ZAP是結構記錄的最佳記錄儀之一。 zap迫使您將其傳遞到您的子模塊中,並且還使用Named方法命名登錄器。通過使用命名的記錄器,您可以輕鬆地在日誌聚合器中找到模塊日誌。
該項目僅需要MongoDB,您可以使用提供的docker-compose運行它。
cd deployments && docker-compose up -d
cd cmd/koochooloo/ && go build && ./koochooloocurl -X POST -d ' {"url": "https://elahe-dastan.github.io"} ' -H ' Content-Type: application/json ' 127.0.0.1:1378/api/urls
curl -L 127.0.0.1:1378/api/CKaniA checks.....................: 99.83% ✓ 2995 ✗ 5
data_received..............: 2.0 MB 64 kB/s
data_sent..................: 521 kB 17 kB/s
group_duration.............: avg=649.18ms min=153.18µs med=265.45ms max=30.95s p(90)=1.61s p(95)=2.06s
http_req_blocked...........: avg=14.12ms min=0s med=3µs max=1.65s p(90)=13µs p(95)=147.04µs
http_req_connecting........: avg=6.23ms min=0s med=0s max=1.36s p(90)=0s p(95)=0s
http_req_duration..........: avg=272.98ms min=0s med=127.99ms max=4.81s p(90)=830.93ms p(95)=1.29s
http_req_receiving.........: avg=125.23µs min=0s med=60µs max=11.21ms p(90)=228µs p(95)=363µs
http_req_sending...........: avg=50.78µs min=0s med=22µs max=7.28ms p(90)=86µs p(95)=138µs
http_req_tls_handshaking...: avg=7.86ms min=0s med=0s max=653.63ms p(90)=0s p(95)=0s
http_req_waiting...........: avg=272.8ms min=0s med=127.71ms max=4.81s p(90)=830.87ms p(95)=1.29s
http_reqs..................: 4000 129.093962/s
iteration_duration.........: avg=1.29s min=142.34ms med=1.04s max=30.97s p(90)=2.18s p(95)=2.64s
iterations.................: 1000 32.273491/s
vus........................: 100 min=100 max=100
vus_max....................: 100 min=100 max=100