场景
我正在使用CQRS pattern来处理REST服务,这些服务处理销售,如下图所示。
在K8S上,我有:
- 在给定pod上运行的GET端点(查询)的微服务。
- POST和PUT端点(命令)达特另一个微服务在不同的pod上运行。
这两种方法都在同一个资源上运行:销售。自然的URLMap将是:
mydomain.com/api/sales/*
上的GET端点应转到第一个pod。mydomain.com/api/sales/*
上的POST和PUT端点应转到第二个pod。
入口
为了将这两个微服务部署到K8S集群,我为每个微服务定义了一个单独的Service
和Deployment
。然后我创建了一个Ingress
定义来将请求路由到服务:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /api/sales
pathType: Prefix
backend:
service:
name: sales-queries-service
port:
name: 80
- path: /api/sales
pathType: Prefix
backend:
service:
name: sales-commands-service
port:
name: 80
ingressClassName: ingress-nginx
问题
上面的ingress定义不起作用,因为它将相同的路径/api/sales
Map到两个不同的服务。因此,它是不确定的。
许多人都希望ingress规范能够允许HTTP方法的规范。事实上,当我询问ChatGPT时,它建议将此片段添加到我的ingress yaml中,但不幸的是,它是一个不存在的参数......还没有。
httpMethods:
- GET
在K8S集群中是否有其他选项可以指定路由(不安装API网关产品)?
2条答案
按热度按时间btqmn9zl1#
我认为最好基于URL(如/queries /commands)而不是HTTP动词/方法进行路由,因为能够对命令服务进行GET请求可能会很有用。
例如,您可能希望对/health端点执行GET请求以进行健康检查。
或者,如果您确实想对写端执行一些特定的READ查询,是的,当您需要立即一致的答案时,在某些特定场景中这样做实际上是可以的。
正如Greg所说:
这里的关键是要敏捷,灵活,不要太严格。
nc1teljy2#
您可以安装和Traefik并使用支持Http方法路由的IngressRoutes。
因此您可以使用Method()规则将请求指向所需的服务。