본문 바로가기

카테고리 없음

43. 클라우드 네이티브 Go 실습 5편

  • gRPC는 구글이 최초로 개발한 오픈 소스 원격 프로시저 호출 시스템이다. 전송을 위해 HTTP/2를, 인터페이스 정의 언어로 프로토콜 버퍼를 사용하며 인증, 양방향 스트리밍 및 흐름 제어, 차단 및 비차단 바인딩, 취소 및 타임아웃 등의 기능을 제공
  • Apache Beam은 배치와 실시간 데이터 파이프라인을 개발하고, 다양한 런타임 환경을 지원
  • Go-kit는 마이크로서비스 프레임워크이고 다양한 마이크로서비스 디자인 패턴을 지원
  • Mongo는 가장 유명한 NoSQL이고 JSON의 관리 및 집계에 유용
  • Redis는 가장 유명한 캐시 저장소
  • Tracing는 관찰가능성 중 분산추적을 위한 프레임워크를 제공
  • Echo는 웹 어플리케이션 프레임워크이고 Air와 함께 auto reload를 지원
  • MySQL은 오픈소스 RDBMS
  • GORM은 Go언어에서 사용 가능한 ORM(Object Relation Mapping) 라이브러리
  • Operator는 사용자 정의 리소스의 컨트롤러 역할을 수행하며, 쿠버네티스 자원에 대한 멱등성을 구현
  • Exporter는 다양한 시스템으로부터 메트릭을 수집해서 프로메테우스에게 제공
  • RealWorld은 Echo, GORM 등을 사용한 레퍼런스 데모를 제공

5편에서는 Exporter, RealWorld을 데모하고 설명한다.

11. Exporter

컨설 설치

root@philip-virtual-machine:~/go/space/bin/memcached-operator# curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
OK
root@philip-virtual-machine:~/go/space/bin/memcached-operator# sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
받기:1 https://download.docker.com/linux/ubuntu focal InRelease [57.7 kB]
받기:2 https://apt.releases.hashicorp.com focal InRelease [9,495 B]       
받기:3 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages [13.5 kB]                                                           
받기:4 https://apt.releases.hashicorp.com focal/main amd64 Packages [41.2 kB]                                                                       
받기:5 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]                                                                          
기존:6 http://kr.archive.ubuntu.com/ubuntu focal InRelease                                                                             
받기:7 http://kr.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
받기:8 http://security.ubuntu.com/ubuntu focal-security/main i386 Packages [356 kB]
받기:9 http://kr.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
받기:10 http://kr.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [1,469 kB]
받기:11 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1,135 kB]
받기:12 http://security.ubuntu.com/ubuntu focal-security/main Translation-en [205 kB]                                                               
받기:13 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [35.7 kB]                                                       
받기:14 http://security.ubuntu.com/ubuntu focal-security/main amd64 c-n-f Metadata [9,108 B]                                                        
받기:15 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [643 kB]                                                         
받기:16 http://kr.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages [585 kB]                                                               
받기:17 http://security.ubuntu.com/ubuntu focal-security/restricted i386 Packages [20.5 kB]                                                         
받기:18 http://security.ubuntu.com/ubuntu focal-security/restricted Translation-en [91.7 kB]                                                        
받기:19 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 c-n-f Metadata [536 B]                                                    
받기:20 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [675 kB]                                                           
받기:21 http://kr.archive.ubuntu.com/ubuntu focal-updates/main Translation-en [291 kB]                                                              
받기:22 http://security.ubuntu.com/ubuntu focal-security/universe i386 Packages [532 kB]                                                            
받기:23 http://kr.archive.ubuntu.com/ubuntu focal-updates/main amd64 DEP-11 Metadata [277 kB]                                                       
받기:24 http://kr.archive.ubuntu.com/ubuntu focal-updates/main amd64 c-n-f Metadata [14.7 kB]                                                       
받기:25 http://kr.archive.ubuntu.com/ubuntu focal-updates/restricted i386 Packages [21.8 kB]                                                        
받기:26 http://kr.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [694 kB]                                                        
받기:27 http://security.ubuntu.com/ubuntu focal-security/universe Translation-en [115 kB]                                                           
받기:28 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [66.2 kB]                                                   
받기:29 http://security.ubuntu.com/ubuntu focal-security/universe amd64 c-n-f Metadata [13.0 kB]                                                    
받기:30 http://security.ubuntu.com/ubuntu focal-security/multiverse i386 Packages [7,176 B]                                                         
받기:31 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [21.8 kB]                                                        
받기:32 http://security.ubuntu.com/ubuntu focal-security/multiverse Translation-en [4,948 B]                                                        
받기:33 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 DEP-11 Metadata [2,464 B]                                                 
받기:34 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 c-n-f Metadata [536 B]                                                    
받기:35 http://kr.archive.ubuntu.com/ubuntu focal-updates/restricted Translation-en [99.0 kB]                                                       
받기:36 http://kr.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 c-n-f Metadata [532 B]                                                   
받기:37 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe i386 Packages [663 kB]                                                           
받기:38 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [892 kB]                                                          
받기:39 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe Translation-en [196 kB]                                                          
받기:40 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe amd64 DEP-11 Metadata [363 kB]                                                   
받기:41 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe amd64 c-n-f Metadata [19.9 kB]                                                   
받기:42 http://kr.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [24.8 kB]                                                       
받기:43 http://kr.archive.ubuntu.com/ubuntu focal-updates/multiverse i386 Packages [8,432 B]                                                        
받기:44 http://kr.archive.ubuntu.com/ubuntu focal-updates/multiverse Translation-en [6,928 B]                                                       
받기:45 http://kr.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 DEP-11 Metadata [944 B]                                                  
받기:46 http://kr.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 c-n-f Metadata [620 B]                                                   
받기:47 http://kr.archive.ubuntu.com/ubuntu focal-backports/main i386 Packages [34.5 kB]                                                            
받기:48 http://kr.archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [42.0 kB]                                                           
받기:49 http://kr.archive.ubuntu.com/ubuntu focal-backports/main Translation-en [10.0 kB]                                                           
받기:50 http://kr.archive.ubuntu.com/ubuntu focal-backports/main amd64 DEP-11 Metadata [7,988 B]                                                    
받기:51 http://kr.archive.ubuntu.com/ubuntu focal-backports/main amd64 c-n-f Metadata [864 B]                                                       
받기:52 http://kr.archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [19.5 kB]                                                       
받기:53 http://kr.archive.ubuntu.com/ubuntu focal-backports/universe i386 Packages [11.1 kB]                                                        
받기:54 http://kr.archive.ubuntu.com/ubuntu focal-backports/universe Translation-en [13.4 kB]                                                       
받기:55 http://kr.archive.ubuntu.com/ubuntu focal-backports/universe amd64 DEP-11 Metadata [11.3 kB]                                                
받기:56 http://kr.archive.ubuntu.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [672 B]                                                   
내려받기 10.2 M바이트, 소요시간 29초 (356 k바이트/초)                                                                                               
패키지 목록을 읽는 중입니다... 완료
root@philip-virtual-machine:~/go/space/bin/memcached-operator# 
root@philip-virtual-machine:~/go/space/bin/memcached-operator# sudo apt-get update && sudo apt-get install consul
기존:1 https://apt.releases.hashicorp.com focal InRelease
기존:2 https://download.docker.com/linux/ubuntu focal InRelease                                                                                     
기존:3 http://security.ubuntu.com/ubuntu focal-security InRelease                                                                                   
기존:4 http://kr.archive.ubuntu.com/ubuntu focal InRelease                                                                              
기존:5 http://kr.archive.ubuntu.com/ubuntu focal-updates InRelease
기존:6 http://kr.archive.ubuntu.com/ubuntu focal-backports InRelease
패키지 목록을 읽는 중입니다... 완료     
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다       
상태 정보를 읽는 중입니다... 완료
다음 새 패키지를 설치할 것입니다:
  consul
0개 업그레이드, 1개 새로 설치, 0개 제거 및 590개 업그레이드 안 함.
38.3 M바이트 아카이브를 받아야 합니다.
이 작업 후 105 M바이트의 디스크 공간을 더 사용하게 됩니다.
받기:1 https://apt.releases.hashicorp.com focal/main amd64 consul amd64 1.11.1 [38.3 MB]
내려받기 38.3 M바이트, 소요시간 5초 (8,055 k바이트/초)
Selecting previously unselected package consul.
(데이터베이스 읽는중 ...현재 190484개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack .../consul_1.11.1_amd64.deb ...
Unpacking consul (1.11.1) ...
consul (1.11.1) 설정하는 중입니다 ...
root@philip-virtual-machine:~/go/space/bin/memcached-operator#

 

컨설 시작

root@philip-virtual-machine:~/go/space/bin/memcached-operator# consul -v
Consul v1.11.1
Revision 2c56447e
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

root@philip-virtual-machine:~/go/space/bin/memcached-operator# consul agent -dev
==> Starting Consul agent...
           Version: '1.11.1'
           Node ID: '56101cd7-9cd1-d0c6-667f-92c6b41745b1'
         Node name: 'philip-virtual-machine'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

2022-01-13T11:45:52.007+0900 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:56101cd7-9cd1-d0c6-667f-92c6b41745b1 Address:127.0.0.1:8300}]"
2022-01-13T11:45:52.007+0900 [INFO]  agent.server.serf.wan: serf: EventMemberJoin: philip-virtual-machine.dc1 127.0.0.1
2022-01-13T11:45:52.007+0900 [INFO]  agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader=
2022-01-13T11:45:52.007+0900 [INFO]  agent.server.serf.lan: serf: EventMemberJoin: philip-virtual-machine 127.0.0.1
2022-01-13T11:45:52.007+0900 [INFO]  agent.router: Initializing LAN area manager
2022-01-13T11:45:52.008+0900 [INFO]  agent.server: Adding LAN server: server="philip-virtual-machine (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
2022-01-13T11:45:52.008+0900 [INFO]  agent.server: Handled event for server in area: event=member-join server=philip-virtual-machine.dc1 area=wan
2022-01-13T11:45:52.008+0900 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=udp
2022-01-13T11:45:52.008+0900 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=tcp
2022-01-13T11:45:52.008+0900 [WARN]  agent: grpc: addrConn.createTransport failed to connect to {dc1-127.0.0.1:8300 0 philip-virtual-machine.dc1 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:0->127.0.0.1:8300: operation was canceled". Reconnecting...
2022-01-13T11:45:52.008+0900 [INFO]  agent: Starting server: address=127.0.0.1:8500 network=tcp protocol=http
2022-01-13T11:45:52.008+0900 [WARN]  agent: DEPRECATED Backwards compatibility with pre-1.9 metrics enabled. These metrics will be removed in a future version of Consul. Set `telemetry { disable_compat_1.9 = true }` to disable them.
2022-01-13T11:45:52.008+0900 [INFO]  agent: Started gRPC server: address=127.0.0.1:8502 network=tcp
2022-01-13T11:45:52.009+0900 [INFO]  agent: started state syncer
2022-01-13T11:45:52.009+0900 [INFO]  agent: Consul agent running!
2022-01-13T11:45:52.060+0900 [WARN]  agent.server.raft: heartbeat timeout reached, starting election: last-leader=
2022-01-13T11:45:52.061+0900 [INFO]  agent.server.raft: entering candidate state: node="Node at 127.0.0.1:8300 [Candidate]" term=2
2022-01-13T11:45:52.061+0900 [DEBUG] agent.server.raft: votes: needed=1
2022-01-13T11:45:52.061+0900 [DEBUG] agent.server.raft: vote granted: from=56101cd7-9cd1-d0c6-667f-92c6b41745b1 term=2 tally=1
2022-01-13T11:45:52.061+0900 [INFO]  agent.server.raft: election won: tally=1
2022-01-13T11:45:52.061+0900 [INFO]  agent.server.raft: entering leader state: leader="Node at 127.0.0.1:8300 [Leader]"
2022-01-13T11:45:52.061+0900 [INFO]  agent.server: cluster leadership acquired
2022-01-13T11:45:52.061+0900 [INFO]  agent.server: New leader elected: payload=philip-virtual-machine
2022-01-13T11:45:52.062+0900 [INFO]  agent.leader: started routine: routine="federation state anti-entropy"
2022-01-13T11:45:52.062+0900 [INFO]  agent.leader: started routine: routine="federation state pruning"
2022-01-13T11:45:52.062+0900 [DEBUG] connect.ca.consul: consul CA provider configured: id=fb:50:9b:45:1a:65:15:c1:68:57:73:5f:da:cd:b8:0d:0f:e2:26:eb:68:66:43:11:85:9d:67:a9:7a:56:9c:b9 is_primary=true
2022-01-13T11:45:52.062+0900 [DEBUG] agent.server.autopilot: autopilot is now running
2022-01-13T11:45:52.062+0900 [DEBUG] agent.server.autopilot: state update routine is now running
2022-01-13T11:45:52.063+0900 [INFO]  connect.ca: initialized primary datacenter CA with provider: provider=consul
2022-01-13T11:45:52.063+0900 [INFO]  agent.leader: started routine: routine="intermediate cert renew watch"
2022-01-13T11:45:52.063+0900 [INFO]  agent.leader: started routine: routine="CA root pruning"
2022-01-13T11:45:52.063+0900 [INFO]  agent.leader: started routine: routine="CA root expiration metric"
2022-01-13T11:45:52.063+0900 [INFO]  agent.leader: started routine: routine="CA signing expiration metric"
2022-01-13T11:45:52.063+0900 [INFO]  agent.leader: started routine: routine="virtual IP version check"
2022-01-13T11:45:52.063+0900 [DEBUG] agent.server: successfully established leadership: duration=2.363326ms
2022-01-13T11:45:52.063+0900 [INFO]  agent.server: member joined, marking health alive: member=philip-virtual-machine partition=default
2022-01-13T11:45:52.064+0900 [DEBUG] agent.leader: stopping routine: routine="virtual IP version check"
2022-01-13T11:45:52.064+0900 [DEBUG] agent.leader: stopped routine: routine="virtual IP version check"
2022-01-13T11:45:52.182+0900 [INFO]  agent.server: federation state anti-entropy synced
2022-01-13T11:45:52.392+0900 [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
2022-01-13T11:45:52.393+0900 [INFO]  agent: Synced node info
2022-01-13T11:45:54.896+0900 [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
2022-01-13T11:45:54.896+0900 [DEBUG] agent: Node info in sync
2022-01-13T11:45:54.896+0900 [DEBUG] agent: Node info in sync
2022-01-13T11:45:58.075+0900 [DEBUG] agent.http: Request finished: method=GET url=/v1/agent/metrics from=127.0.0.1:42038 latency=744.905µs

컨설 익스포터를 빌드한다.

root@philip-virtual-machine:~/go/space/pro/consul_exporter# make
>> checking code style
>> checking license header
mkdir -p /root/go/space/bin
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/v1.42.0/install.sh \
	| sed -e '/install -d/d' \
	| sh -s -- -b /root/go/space/bin v1.42.0
golangci/golangci-lint info checking GitHub for tag 'v1.42.0'
golangci/golangci-lint info found version: 1.42.0 for v1.42.0/linux/amd64
golangci/golangci-lint info installed /root/go/space/bin/golangci-lint
>> running golangci-lint
GO111MODULE=on go list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
go: downloading github.com/hashicorp/consul/api v1.7.0
go: downloading github.com/go-kit/kit v0.10.0
go: downloading github.com/prometheus/client_golang v1.8.0
go: downloading github.com/prometheus/common v0.15.0
go: downloading github.com/prometheus/exporter-toolkit v0.5.1
go: downloading gopkg.in/alecthomas/kingpin.v2 v2.2.6
go: downloading github.com/prometheus/procfs v0.2.0
go: downloading github.com/hashicorp/serf v0.9.3
go: downloading golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9
go: downloading google.golang.org/protobuf v1.23.0
go: downloading github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
go: downloading github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
go: downloading github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d
go: downloading golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211
go: downloading github.com/go-logfmt/logfmt v0.5.0
go: downloading github.com/hashicorp/golang-lru v0.5.1
go: downloading github.com/jpillora/backoff v1.0.0
GO111MODULE=on /root/go/space/bin/golangci-lint run  ./...
>> running yamllint on all YAML files in the repository
yamllint not installed so skipping
>> running check for unused/missing packages in go.mod
GO111MODULE=on go mod tidy
go: downloading github.com/hashicorp/consul/sdk v0.6.0
go: downloading gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15
go: downloading github.com/hashicorp/memberlist v0.2.2
go: downloading github.com/google/go-cmp v0.4.0
go: downloading github.com/google/btree v1.0.0
go: downloading github.com/miekg/dns v1.1.26
go: downloading github.com/kr/pretty v0.2.0
go: downloading github.com/kr/text v0.1.0
go: downloading golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
curl -s -L https://github.com/prometheus/promu/releases/download/v0.12.0/promu-0.12.0.linux-amd64.tar.gz | tar -xvzf - -C /tmp/tmp.XW8ssv9a1p
promu-0.12.0.linux-amd64/
promu-0.12.0.linux-amd64/LICENSE
promu-0.12.0.linux-amd64/NOTICE
promu-0.12.0.linux-amd64/promu
mkdir -p /root/go/space/bin
cp /tmp/tmp.XW8ssv9a1p/promu-0.12.0.linux-amd64/promu /root/go/space/bin/promu
rm -r /tmp/tmp.XW8ssv9a1p
>> building binaries
GO111MODULE=on /root/go/space/bin/promu build --prefix /root/go/space/pro/consul_exporter 
 >   consul_exporter
>> running all tests
GO111MODULE=on go test -race  ./...
?   	github.com/prometheus/consul_exporter/cmd/consul_exporter	[no test files]
ok  	github.com/prometheus/consul_exporter/pkg/exporter	0.030s
root@philip-virtual-machine:~/go/space/pro/consul_exporter#

다른 익스포터 소스를 분석한다.

[root@localhost exporter]# git clone https://github.com/mnadeem/volume_exporter.git

 

[root@localhost exporter]# cd volume_exporter
[root@localhost volume_exporter]# go run main.go --volume-dir=go:/root/go
go: downloading github.com/prometheus/client_golang v1.9.0
go: downloading github.com/prometheus/common v0.15.0
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading gopkg.in/alecthomas/kingpin.v2 v2.2.6
go: downloading github.com/golang/protobuf v1.4.3
go: downloading github.com/prometheus/procfs v0.2.0
go: downloading golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e
go: downloading github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
go: downloading github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d
go: downloading google.golang.org/protobuf v1.25.0
INFO[0000] Starting volume_exporter                      source="main.go:40"
INFO[0000] Directory Name : go, Path : /root/go          source="main.go:56"
INFO[0000] Starting volume_exporter (version=, branch=, revision=)  source="main.go:62"
INFO[0000] Build context (go=go1.16.3, user=, date=)     source="main.go:63"
INFO[0000] Starting Server: :9888                        source="main.go:128"

12. RealWorld

[root@localhost shipping]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

[root@localhost shipping]# sudo chmod +x /usr/local/bin/docker-compose
[root@localhost echo-gorm-realworld-app]# systemctl start docker

 

[root@localhost echo-gorm-realworld-app]# git clone https://github.com/xesina/golang-echo-realworld-example-app.git

 

[root@localhost echo-gorm-realworld-app]# cd golang-echo-realworld-example-app
[root@localhost golang-echo-realworld-example-app]# ll
total 84
drwxr-xr-x. 2 root root    24 Jan 10 21:50 article
drwxr-xr-x. 2 root root    19 Jan 10 21:50 db
-rw-r--r--. 1 root root  1169 Jan 10 21:50 Dockerfile
drwxr-xr-x. 2 root root    61 Jan 10 21:50 docs
-rw-r--r--. 1 root root  1128 Jan 10 21:50 go.mod
-rw-r--r--. 1 root root 30526 Jan 10 21:50 go.sum
drwxr-xr-x. 2 root root   177 Jan 10 21:50 handler
-rw-r--r--. 1 root root  1068 Jan 10 21:50 LICENSE
-rw-r--r--. 1 root root 28254 Jan 10 21:50 logo.png
-rw-r--r--. 1 root root  1077 Jan 10 21:50 main.go
-rw-r--r--. 1 root root   654 Jan 10 21:50 Makefile
drwxr-xr-x. 2 root root    39 Jan 10 21:50 model
-rw-r--r--. 1 root root  1878 Jan 10 21:50 readme.md
drwxr-xr-x. 3 root root    61 Jan 10 21:50 router
drwxr-xr-x. 2 root root    39 Jan 10 21:50 store
drwxr-xr-x. 2 root root    21 Jan 10 21:50 user
drwxr-xr-x. 2 root root    53 Jan 10 21:50 utils

 

[root@localhost golang-echo-realworld-example-app]# go mod download
[root@localhost golang-echo-realworld-example-app]# go build

 

[root@localhost golang-echo-realworld-example-app]# yum install gcc
[root@localhost golang-echo-realworld-example-app]# go build

 

[root@localhost golang-echo-realworld-example-app]# go run main.go

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.91ms]  CREATE TABLE "favorites" ("user_id" integer,"article_id" integer, PRIMARY KEY ("user_id","article_id"))  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.56ms]  CREATE TABLE "users" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"username" varchar(255) NOT NULL,"email" varchar(255) NOT NULL,"password" varchar(255) NOT NULL,"bio" varchar(255),"image" varchar(255) )  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.76ms]  CREATE INDEX idx_users_deleted_at ON "users"(deleted_at)   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.49ms]  CREATE UNIQUE INDEX uix_users_username ON "users"("username")   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.69ms]  CREATE UNIQUE INDEX uix_users_email ON "users"("email")   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.38ms]  CREATE TABLE "follows" ("follower_id" int not null,"following_id" int not null , PRIMARY KEY ("follower_id","following_id"))  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.24ms]  CREATE TABLE "article_tags" ("article_id" integer,"tag_id" integer, PRIMARY KEY ("article_id","tag_id"))  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.22ms]  CREATE TABLE "articles" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"slug" varchar(255) NOT NULL,"title" varchar(255) NOT NULL,"description" varchar(255),"body" varchar(255),"author_id" integer )  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.00ms]  CREATE INDEX idx_articles_deleted_at ON "articles"(deleted_at)   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [0.95ms]  CREATE UNIQUE INDEX uix_articles_slug ON "articles"("slug")   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.33ms]  CREATE TABLE "comments" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"article_id" integer,"user_id" integer,"body" varchar(255) )  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.31ms]  CREATE INDEX idx_comments_deleted_at ON "comments"(deleted_at)   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.32ms]  CREATE TABLE "tags" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"tag" varchar(255) )  
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.46ms]  CREATE INDEX idx_tags_deleted_at ON "tags"(deleted_at)   
[0 rows affected or returned ] 

(/root/grpc/examples/python/helloworld/examples/shipping/echo-gorm-realworld-app/golang-echo-realworld-example-app/db/db.go:42) 
[2022-01-10 21:54:47]  [1.20ms]  CREATE UNIQUE INDEX uix_tags_tag ON "tags"("tag")   
[0 rows affected or returned ] 

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.16
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on 127.0.0.1:8585

 

[root@localhost golang-echo-realworld-example-app]# go test ./...
?   	github.com/xesina/golang-echo-realworld-example-app	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/article	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/db	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/docs	[no test files]
ok  	github.com/xesina/golang-echo-realworld-example-app/handler	4.765s
?   	github.com/xesina/golang-echo-realworld-example-app/model	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/router	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/router/middleware	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/store	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/user	[no test files]
?   	github.com/xesina/golang-echo-realworld-example-app/utils	[no test files]