Monday, 23 June 2025

Go MicroServices EKS

 project/

├── customer-service/

│   ├── main.go

│   └── Dockerfile

├── order-service/

│   ├── main.go

│   └── Dockerfile

├── k8s/

│   ├── customer-deployment.yaml

│   ├── customer-service.yaml

│   ├── order-deployment.yaml

│   ├── order-service.yaml

│   ├── ingress.yaml

│   ├── tls-secret.yaml

│   └── monitoring/

│       ├── prometheus-config.yaml

│       ├── prometheus-deployment.yaml

│       ├── grafana-deployment.yaml

│       └── grafana-service.yaml


# customer-service/main.go

package main


import (

    "encoding/json"

    "net/http"

)


type Customer struct {

    ID   string `json:"id"`

    Name string `json:"name"`

}


func handler(w http.ResponseWriter, r *http.Request) {

    customer := Customer{ID: "1", Name: "John Doe"}

    json.NewEncoder(w).Encode(customer)

}


func main() {

    http.HandleFunc("/customer", handler)

    http.ListenAndServe(":8080", nil)

}


# order-service/main.go

package main


import (

    "encoding/json"

    "net/http"

)


type Order struct {

    ID         string `json:"id"`

    CustomerID string `json:"customerId"`

    Amount     int    `json:"amount"`

}


func handler(w http.ResponseWriter, r *http.Request) {

    order := Order{ID: "100", CustomerID: "1", Amount: 250}

    json.NewEncoder(w).Encode(order)

}


func main() {

    http.HandleFunc("/order", handler)

    http.ListenAndServe(":8080", nil)

}


# customer-service/Dockerfile

FROM golang:1.20

WORKDIR /app

COPY . .

RUN go build -o customer-service

CMD ["./customer-service"]


# order-service/Dockerfile

FROM golang:1.20

WORKDIR /app

COPY . .

RUN go build -o order-service

CMD ["./order-service"]


# k8s/customer-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: customer-deployment

spec:

  replicas: 1

  selector:

    matchLabels:

      app: customer

  template:

    metadata:

      labels:

        app: customer

    spec:

      containers:

      - name: customer

        image: your-dockerhub-username/customer-service:latest

        ports:

        - containerPort: 8080


# k8s/customer-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: customer-service

spec:

  selector:

    app: customer

  ports:

  - protocol: TCP

    port: 80

    targetPort: 8080


# k8s/order-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: order-deployment

spec:

  replicas: 1

  selector:

    matchLabels:

      app: order

  template:

    metadata:

      labels:

        app: order

    spec:

      containers:

      - name: order

        image: your-dockerhub-username/order-service:latest

        ports:

        - containerPort: 8080


# k8s/order-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: order-service

spec:

  selector:

    app: order

  ports:

  - protocol: TCP

    port: 80

    targetPort: 8080


# k8s/ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: microservices-ingress

  annotations:

    nginx.ingress.kubernetes.io/ssl-redirect: "true"

    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

    kubernetes.io/ingress.class: nginx

spec:

  tls:

  - hosts:

    - your-domain.com

    secretName: tls-secret

  rules:

  - host: your-domain.com

    http:

      paths:

      - path: /customer

        pathType: Prefix

        backend:

          service:

            name: customer-service

            port:

              number: 80

      - path: /order

        pathType: Prefix

        backend:

          service:

            name: order-service

            port:

              number: 80


# k8s/tls-secret.yaml

apiVersion: v1

kind: Secret

metadata:

  name: tls-secret

  namespace: default

  annotations:

    kubernetes.io/ingress.class: nginx

    kubernetes.io/tls-acme: "true"

type: kubernetes.io/tls

data:

  tls.crt: <base64-encoded-cert>

  tls.key: <base64-encoded-key>


# k8s/monitoring/prometheus-config.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: prometheus-config

  labels:

    name: prometheus-config

data:

  prometheus.yml: |

    global:

      scrape_interval: 15s

    scrape_configs:

      - job_name: 'customer-service'

        static_configs:

        - targets: ['customer-service:8080']

      - job_name: 'order-service'

        static_configs:

        - targets: ['order-service:8080']


# k8s/monitoring/prometheus-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: prometheus

spec:

  replicas: 1

  selector:

    matchLabels:

      app: prometheus

  template:

    metadata:

      labels:

        app: prometheus

    spec:

      containers:

      - name: prometheus

        image: prom/prometheus

        ports:

        - containerPort: 9090

        volumeMounts:

        - name: config-volume

          mountPath: /etc/prometheus/

      volumes:

      - name: config-volume

        configMap:

          name: prometheus-config


# k8s/monitoring/grafana-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: grafana

spec:

  replicas: 1

  selector:

    matchLabels:

      app: grafana

  template:

    metadata:

      labels:

        app: grafana

    spec:

      containers:

      - name: grafana

        image: grafana/grafana

        ports:

        - containerPort: 3000


# k8s/monitoring/grafana-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: grafana

spec:

  selector:

    app: grafana

  ports:

  - protocol: TCP

    port: 80

    targetPort: 3000

  type: LoadBalancer


No comments:

Post a Comment