주제
Go로 작업된 Go-GRPC 클라우드 네이티브 서버
특징
- Golang
- GoCache
- GRPC
- Google Cloud Platform
- Cloud Run
- Datastore
- Cloud Build
- Apns (Apple Server Push)
- Github Actions CI/CD
Github Actions CI/CD
Github Actions로 자동화하여 컨테이너 빌드 및 GCP 환경으로 서비스 배포를 수행합니다. 키와 같이 민감한 데이터가 보함된 데이터는 깃허브 레포지토리 시크릿을 사용해 관리합니다. 코드가 통합되고 배포되기까지 흐름을 깃허브 액션에서 관리합니다.
- 깃허브로 코드가 푸시되어 트리거되면 GCP Cloud Build로 빌드를 수행하고 Registy로 Push합니다.
- GCP Cloud Run 서비스는 k8s Knative기반의 서비스로 해당 스펙에 맞춰 yml을 작성합니다.
- GCP CLoud Run 서비스로 배포합니다.
# Deploy - stop previous version
- name: Deploy - stop previous version
run: |-
gcloud builds submit -t gcr.io/${{ secrets.PROJECT_ID }}/${SERVICE_NAME}:${GITHUB_SHA} .
cat <<EOF >> cloudrun.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: clubhouse-dev
annotations:
run.googleapis.com/ingress: all
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/maxScale: '100'
... 중략 ...
- name : KAKAO_REST_API_KEY
value : ${{ secrets.KAKAO_REST_API_KEY }}
- name : ETCD_INTERVAL_AD
value : "300"
resources:
limits:
cpu: 1000m
memory: 512Mi
EOF
cat cloudrun.yaml
gcloud run services replace cloudrun.yaml --region=asia-northeast3
Protobuff & GRPC
서버에서 작성한 proc 정의를 사용해서, 서버-클라 양측에서 사용할 모델을 생성하여 사용함으로써, 서버-클라간 상호 동일한 모델구조 참조를 보장함
syntax = "proto3";
option go_package = "github.com/hojin-kr/haru/cmd/proto";
package haru;
// Service definition.
service version1 {
rpc CreateAccount (AccountRequest) returns (AccountReply) {}
rpc GetProfile (ProfileRequest) returns (ProfileReply) {}
rpc UpdateProfile (ProfileRequest) returns (ProfileReply) {}
rpc CreateGame (GameRequest) returns (GameReply) {}
...중략
#!/bin/bash
protoc --go_out=./cmd --go_opt=paths=source_relative \
--go-grpc_out=./cmd --go-grpc_opt=paths=source_relative \
proto/haru.proto
protoc proto/haru.proto --swift_out=./proto --grpc-swift_out=./proto
Cloud Run
- Deploy 분리 운영
- Revision과 Env 관리및 서비스 모니터링
적용 프로젝트
클럽하우스
일정과 장소를 보고 조인을 신청하고, 채팅을 통해서 함께 라운딩할 사람들과 소통합니다.