Giới thiệu dự án Go-Zero Short Link
Go-Zero là một framework microservice mạnh mẽ cho Go. Bài viết này sẽ hướng dẫn cách xây dựng một dịch vụ rút gọn link (short link) bằng Go-Zero và triển khai nó lên Kubernetes (K8s) sử dụng Drone CI/CD để tự động hóa quy trình build và deploy.
Chuẩn bị
Trước khi bắt đầu, cần có một cluster Kubernetes đã được cài đặt và sẵn sàng. Ngoài ra, cần triển khai các dịch vụ phụ trợ như MySQL, Redis, và Etcd. Đối với môi trường sản xuất, việc sử dụng các dịch vụ cơ sở dữ liệu được quản lý bởi nhà cung cấp đám mây là khuyến khích.
Cấu hình Dockerfile
Dưới đây là các file Dockerfile được cấu hình để build các microservice.
Dockerfile.base.alpine
FROM alpine:3.18
RUN addgroup -S microsvc \
&& adduser -S -g microsvc microsvc \
&& apk --no-cache add \
ca-certificates curl netcat-openbsd
USER microsvc
Dockerfile.builder.go
FROM golang:1.21-alpine AS builder
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://proxy.golang.org,direct
RUN mkdir -p /app/shortlink
WORKDIR /app/shortlink
COPY go.mod go.mod
RUN go mod download
Dockerfile.service.transform
### shortlink:builder
FROM my-registry.com/shortlink/shortlink:builder AS builder
WORKDIR /app/shortlink/transform
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/transform-service transform/*.go
### shortlink:base.alpine
FROM my-registry.com/shortlink/shortlink:base.alpine
LABEL maintainer="DevOps Team"
WORKDIR /home/microsvc
COPY --from=builder /app/shortlink/transform/bin/transform-service .
COPY ./transform/etc ./transform/etc
RUN chown -R microsvc:microsvc ./
RUN ln -sf /usr/share/zoneinfo/Asia/Ho_Chi_Minh /etc/localtime
RUN echo 'Asia/Ho_Chi_Minh' >/etc/timezone
USER microsvc
CMD ["./transform-service", "-f", "transform/etc/transform.yaml"]
Dockerfile.service.gateway
### shortlink:builder
FROM my-registry.com/shortlink/shortlink:builder AS builder
WORKDIR /app/shortlink/gateway
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/api-gateway gateway/*.go
### shortlink:base.alpine
FROM my-registry.com/shortlink/shortlink:base.alpine
LABEL maintainer="DevOps Team"
WORKDIR /home/microsvc
COPY --from=builder /app/shortlink/gateway/bin/api-gateway .
COPY ./gateway/etc ./gateway/etc
RUN chown -R microsvc:microsvc ./
RUN ln -sf /usr/share/zoneinfo/Asia/Ho_Chi_Minh /etc/localtime
RUN echo 'Asia/Ho_Chi_Minh' >/etc/timezone
USER microsvc
CMD ["./api-gateway", "-f", "gateway/etc/gateway.yaml"]
Cấu hình Kubernetes
Các file ConfigMap sau định nghĩa cấu hình cho các microservice.
configmap-gateway.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: api-gateway
data:
gateway.yaml: |-
Name: api-gateway
Host: 0.0.0.0
Port: 8080
Transform:
Etcd:
Hosts:
- etcd-cluster-ip:2379
Key: transform.service
configmap-transform.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: transform-service
data:
transform.yaml: |-
Name: transform.service
Log:
Mode: console
ListenOn: 0.0.0.0:9090
Etcd:
Hosts:
- etcd-cluster-ip:2379
Key: transform.service
DataSource: root:password@tcp(mysql-cluster-ip:3306)/shortlink?charset=utf8mb4&parseTime=true&loc=Asia%2FHo_Chi_Minh
Table: shortlinks
Cache:
- Host: redis-cluster-ip:6379
Pipeline CI/CD với Drone
File `.drone.yml` định nghĩa quy trình tự động build và deploy ứng dụng.
kind: pipeline
type: kubernetes
name: Transform Service Pipeline
steps:
- name: Cập nhật Helm Chart
image: busybox
commands:
- echo $DRONE_COMMIT
- '[ -n "$DRONE_COMMIT" ] && (
sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" charts/shortlink/Chart.yaml;
sed -i "s/SERVICE_NAME/transform-service/g" charts/shortlink/Chart.yaml;
sed -i "s/IMAGE_NAME/transform-service/g" charts/shortlink/values.yaml;
sed -i "s/CONFIGMAP_NAME/transform-service/g" charts/shortlink/values.yaml;
sed -i "s/CONTAINER_PORT/9090/g" charts/shortlink/values.yaml;
sed -i "s/ENABLE_INGRESS/false/g" charts/shortlink/values.yaml;
sed -i "s/8080/9090/g" charts/shortlink/templates/NOTES.txt;
)'
- cat charts/shortlink/Chart.yaml
- cat charts/shortlink/values.yaml
- name: Build Docker Image
image: plugins/docker
settings:
debug: true
dockerfile: Dockerfile.service.transform
repo: my-registry.com/shortlink/transform-service
tags: ${DRONE_COMMIT}
registry: my-registry.com
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: Deploy to K8s with Helm
image: pelotech/drone-helm3
settings:
helm_command: upgrade
chart: ./charts/shortlink
release: transform-service
namespace: shortlink
api_server:
from_secret: k8s_api_server
kubernetes_token:
from_secret: k8s_token
skip_tls_verify: true
trigger:
branch:
- main
---
kind: pipeline
type: kubernetes
name: API Gateway Pipeline
steps:
- name: Cập nhật Helm Chart
image: busybox
commands:
- echo $DRONE_COMMIT
- '[ -n "$DRONE_COMMIT" ] && (
sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" charts/shortlink/Chart.yaml;
sed -i "s/SERVICE_NAME/api-gateway/g" charts/shortlink/Chart.yaml;
sed -i "s/IMAGE_NAME/api-gateway/g" charts/shortlink/values.yaml;
sed -i "s/CONFIGMAP_NAME/api-gateway/g" charts/shortlink/values.yaml;
sed -i "s/CONTAINER_PORT/8080/g" charts/shortlink/values.yaml;
sed -i "s/ENABLE_INGRESS/true/g" charts/shortlink/values.yaml;
sed -i "s/8080/8080/g" charts/shortlink/templates/NOTES.txt;
)'
- cat charts/shortlink/Chart.yaml
- cat charts/shortlink/values.yaml
- name: Build Docker Image
image: plugins/docker
settings:
debug: true
dockerfile: Dockerfile.service.gateway
repo: my-registry.com/shortlink/api-gateway
tags: ${DRONE_COMMIT}
registry: my-registry.com
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: Deploy to K8s with Helm
image: pelotech/drone-helm3
settings:
helm_command: upgrade
chart: ./charts/shortlink
release: api-gateway
namespace: shortlink
api_server:
from_secret: k8s_api_server
kubernetes_token:
from_secret: k8s_token
skip_tls_verify: true
trigger:
branch:
- main
Xác thực
Sau khi triển khai, có thể kiểm tra dịch vụ bằng các lệnh curl.
Gọi API rút gọn link
# curl -i "http://your-domain.com/shorten?url=https://example.com"
curl -i "http://shortlink.your-company.com/shorten?url=https://example.com"
Gọi API mở rộng link
# curl -i "http://your-domain.com/expand?shorten=abc123"
curl -i "http://shortlink.your-company.com/expand?shorten=abc123"