docker - 使用 Docker Compose 或 Kubernetes 时动态服务发现如何工作?
问题描述
假设我正在创建一个具有微服务架构的聊天应用程序。我有 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 镜像创建微服务部署/工作负载
- 创建指向这些部署的服务
- 使用指向服务的基于路径的规则创建入口
这是示例清单/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-messaging
或curl http://svc-gateway
您不需要运行自己的服务发现,这由 Kubernetes 负责!
一些视觉效果:
推荐阅读
- kotlin - Kotlin 比较两个列表 - 如果 id 匹配则覆盖它
- jestjs - Nest.js 测试模块,不能覆盖注入另一个提供程序的提供程序,未定义接收
- sas - 当列不是数字时,SAS删除行
- google-sheets - Google 表格:条件格式
- reactjs - Dockerize 一个 React-Django 项目,其中前端由 Django 提供
- javascript - POST 请求... UnhandledPromiseRejectionWarning:未处理的承诺拒绝
- javascript - SyntaxError:意外的令牌“导出”
- vue.js - 使用 Vue 制作 Web 组件
- amazon-web-services - SQS 数字很高,即使我没有使用它
- javascript - 如何用玩笑模拟默认导出的模块