首页 > 解决方案 > 使用 Docker Compose 或 Kubernetes 时动态服务发现如何工作?

问题描述

假设我正在创建一个具有微服务架构的聊天应用程序。我有 2 项服务:

  1. 网关服务:负责用户认证(API端点/api/v1/users),并将请求路由到适当的服务。

  2. 消息服务:负责创建、检索、更新和删除消息(API 端点/api/v1/messages)。

如果我使用 Docker Compose 或 Kubernetes,如果有请求发送到/api/v1/messagesAPI 端点,我的网关服务如何知道它应该转发到哪个服务?

我曾经编写自己的动态服务发现中间件(https://github.com/zicodeng/tahc-z/blob/master/servers/gateway/handlers/dsd.go)。这个想法是我使用他们负责的 API 端点预先注册服务。而我的网关服务依赖于请求资源路径来决定这个请求应该被转发到哪个服务。但是您如何使用 Docker Compose 或 Kubernetes 做到这一点?我还需要保留自己的动态服务发现中间件版本吗?

提前致谢!

标签: dockerkubernetesdocker-composemicroservicesservice-discovery

解决方案


如果您使用的是 Kubernetes,以下是高级步骤:

  1. 使用 docker 镜像创建微服务部署/工作负载
  2. 创建指向这些部署的服务
  3. 使用指向服务的基于路径的规则创建入口

这是示例清单/yaml 文件:(根据需要更改 docker 映像、端口等)

apiVersion: v1
kind: Service
metadata:
  name: svc-gateway
spec:
  ports:
    - port: 80
  selector:
    app: gateway
---
apiVersion: v1
kind: Service
metadata:
  name: svc-messaging
spec:
  ports:
    - port: 80
  selector:
    app: messaging
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-gateway
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: gateway
    spec:
      containers:
      - name: gateway
        image: gateway/image:v1.0
        ports:
        - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-messaging
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: messaging
    spec:
      containers:
      - name: messaging
        image: messaging/image:v1.0
        ports:
        - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-for-chat-application
spec:
  rules:
  - host: chat.example.com
    http:
      paths:
      - backend:
          serviceName: svc-gateway
          servicePort: 80
        path: /api/v1/users
      - backend:
          serviceName: svc-messaging
          servicePort: 80
        path: /api/v1/messages

如果您有其他容器在同一个命名空间中运行并希望与这些服务通信,您可以直接使用它们的服务名称。

例如: curl http://svc-messagingcurl http://svc-gateway

您不需要运行自己的服务发现,这由 Kubernetes 负责!

一些视觉效果:

步骤1: 部署

第2步: 服务

第 3 步: 入口


推荐阅读