
波斯语的意思是“小”或“ 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