假设我正在创建一个具有微服务架构的聊天应用程序。我有两个服务:
API网关服务:负责用户身份验证(API端点/api/v1/messages
). ),并将请求路由到适当的服务:负责创建、检索、更新和删除消息(API端点
/api/v1/users
)。如果我使用Docker Compose或Kubernetes,如果有请求发送到/api/v1/messages
应用编程接口端点,我的网关服务如何知道它应该转发到哪个服务?
我过去常常编写自己的动态服务发现中间件(https://github.com/zicodeng/tahc-z/blob/master/servers/gateway/handlers/dsd.go)。我的想法是,我将服务预先注册到它们负责的API端点。我的网关服务依赖于请求资源路径来决定这个请求应该转发到哪个服务。但是,如何使用Docker Compose或Kubernetes实现这一点呢?我还需要保留我自己的动态服务发现中间件版本吗?
提前感谢!
发布于 2018-09-11 08:36:31
如果您使用的是Kubernetes,以下是高级步骤:
的基于路径的规则
以下是示例清单/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负责!
一些视觉效果:
步骤1:
第2步:
第3步:
https://stackoverflow.com/questions/52252743
复制相似问题