docker - 使用Docker Compose或Kubernetes时动态服务发现如何工作?

标签 docker kubernetes docker-compose microservices service-discovery

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

  • 网关服务:负责用户身份验证(API端点/api/v1/users),并将请求路由到适当的服务。
  • 消息服务:负责创建,检索,更新和删除消息(API端点/api/v1/messages)。

  • 如果我使用Docker Compose或Kubernetes,如果有请求发送到/api/v1/messages API端点,我的网关服务如何知道将其转发给哪个服务?

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

    提前致谢!

    最佳答案

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

  • 使用docker镜像创建微服务部署/工作负载
  • 创建指向这些部署的服务
  • 使用指向服务
  • 的基于路径的规则创建Ingress

    这是示例 list / 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:
    deployments

    第2步:
    services

    第三步:
    ingress

    关于docker - 使用Docker Compose或Kubernetes时动态服务发现如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52252743/

    相关文章:

    macos - 带有 Grunt 文件监视的 Docker 卷

    docker - 附加到正在运行的远程容器时如何使VSCode运行自定义脚本

    kubernetes - prometheus-adapter 未正常运行

    php - 如何在不终止 docker 容器的情况下重新启动 apache2?

    docker - 在内部进程崩溃时重新启动 Docker 容器

    docker - 当我将 Renderer.RenderHtmlAsPdf 与 IronPdf 一起使用时,为什么我无法加载共享库 'IronPdf_ChromeRenderingEngine'?

    kubernetes - 自定义对象的大有效负载

    elasticsearch - 如何在Kubernetes上编辑path.data和path.log以进行Elasticsearch?

    docker - 由于主机已满,在不同的驱动器上运行 docker 容器

    database - 在首次运行docker-compose up时运行迁移或加载架构的最佳方法是什么?