
"작은"또는 "li'l"을 의미하는 페르시아어. 그것은 종종 유혹 할 때 소녀를 언급하는 데 사용됩니다 (의미와 함께, li'l girl)
도시 사전
Koochooloo 에 오신 것을 환영합니다 : Golang 응용 프로그램의 개발을 간소화하기위한 우아하고 실용적인 프로젝트입니다. 잘 조직 된 아키텍처를 자랑하는 Koochooloo는 데이터베이스 처리 및 구성 관리와 같은 중요한 기능을 통합하여 GO를 사용하여 강력한 휴식 애플리케이션을 구축 할 때 모범 사례를 보여줍니다.
init 기능 없음 : 글로벌을 피하고 정보의 복잡성을 단순하게 유지하기위한 init 기능의 복잡성. fx 의존성 주입 프레임 워크로 활용하여 Koochooloo는 다음과 같습니다.
fx 사용을 지원하고 단순화하는 환경.Koochooloo 와 함께 여행을 시작하고 이동 중에 편안한 응용 프로그램을 만들기위한 접근 방식을 재정의하십시오. Koochooloo는 스킬 셋을 확장하거나 복잡한 응용 프로그램을위한 탄탄한 기반을 구축하든 효율적이고 깨끗하며 확장 가능한 소프트웨어 디자인의 파트너입니다.
우선 cmd 패키지에는 COBRA를 사용 하여이 프로젝트의 바이너리가 포함되어 있습니다. 프로젝트의 시작 단계에서 실행할 수있는 데이터베이스 마이그레이션과 같은 작업을위한 간단한 바이너리를 갖는 것이 좋습니다. 각 바이너리에는 main.go 이 있습니다 Register 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 ()
},
},
)
} 다시 각 명령은 그 자체로 깃발을 등록하므로 다른 명령과 분리되어 있습니다. 때로는 명령 사이에 플래그를 공유 해야하는 경우 구성에 플래그를 구성하는 것이 좋습니다. 나중에 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 모듈에 정의 된 구성이 있으며 시작시 전달됩니다.PS koanf는 구성을 입력 한 바이퍼보다 훨씬 낫습니다. 유형 구성에 따라 구성을위한 정의 된 구조가 있고 많은 소스에서 구성을로드합니다.
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 모듈에 정의 된 데이터베이스 구성을 사용하고 데이터베이스 인스턴스를 만듭니다. 앞으로 나아 가기 전에 데이터베이스 인스턴스에 완전히 자신감을 갖도록 데이터베이스를 여기에 핑하는 것이 좋습니다. 또한 데이터베이스 건강에 대한 통찰력을 얻으려면이 핑 함수를 주기적으로 호출하고 그 결과를 메트릭으로보고 할 수 있습니다 (여기서하지 않은).
프로젝트 모델은 model 패키지에 정의됩니다. 이 모델은 내부적으로 사용되지만 response 또는 request 패키지에서 사용할 수 있습니다. 이 패키지에서 데이터베이스와 통신하기위한 구조는 없습니다.
리포지토리는 모델을 저장하거나 검색하기 위해 데이터베이스를 통한 통근을 담당합니다. 저장소는 interface 이며 콘크리트 및 조롱 된 구현이 있습니다. 콘크리트 구현은 기본 코드에 사용되며 조롱 된 하나는 테스트에 사용됩니다. 저장소 테스트는 터치이며 실제 데이터베이스로 수행됩니다.
HTTP 처리기는 handler 패키지에 정의되어 있습니다. Echo는 필요한 eveything을 가진 멋진 HTTP 프레임 워크입니다. 각 핸들러는 경로를 주어진 경로 그룹에 등록하는 Register 방법을 갖는 구조를 가지고 있습니다. Route Group은 특정 부모 경로에서 경로를 그룹화하기위한 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 있습니다. 구조를 정의하는 메트릭이 포함되어 있으며 메트릭을 포함하고 변경하는 방법이 있습니다. Prometheus에서 다른 서비스로 마이그레이션하려면 telemetry 변경하면됩니다. 메트릭은 글로벌이 아니며 개방형 원격 측정 설계 덕분에 각 인스턴스에 대해 별도로 생성되었습니다. 메트릭 엔드 포인트에 더 나은 컨트롤러를 사용하려면 모니터링을 위해 telemetry 패키지에 정의 된 또 다른 HTTP 서버가 있습니다.
요청 및 응답에 대한 패키지를 분리하는 것이 좋습니다. 이 패키지에는 검증 논리도 포함되어 있습니다. GO에서 좋은 검증 팩 케이지 중 하나는 Ozzo-Validator입니다. Validate Method를 제공 한 후 요청을받은 후에는 메소드를 쉽게 검증 할 수 있습니다.
로깅 하나는 응용 프로그램의 가장 중요한 부분입니다. 처음에는 간단한 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