我需要找到一种将请求动态路由到服务的特定容器的方法。我将为我的应用程序制作一个简化的示例,以帮助您理解。我有一个贯穿整个Docker群的Rest API服务。该API有两个端点。
第一个端点创建一个具有唯一session_id
的会话。可以平衡到此终结点的请求,并且可以正常使用我的任何服务实例。然后,我有另一个端点,该端点的路径参数如/session_id
,需要路由到最初创建此会话的服务实例。
因此,可以说我将服务扩展到3个实例,并向第一个端点发出了新请求。例如,该请求命中了3的第二个实例。过了一会儿,第二个请求session_id
随即被创建,该请求以前是作为路径参数创建的。此请求也必须转到第二个实例。
我知道设计无状态应用程序会更好,这样您就不会遇到类似这样的问题,但是在这种情况下是不可能的。我搜索了一些有关consul和ceryx的信息,但是我不确定这两种工具是否都可以。
有人知道如何实现这样的功能吗?谢谢您的提前帮助!
您正在寻找具有持久/粘性会话支持的负载平衡器。
Docker Enterprise通过在创建服务时配置粘性会话来支持此操作。
$> docker service create \
--name demo \
--network demo \
--detach=false \
--replicas=5 \
--label com.docker.lb.hosts=demo.local \
--label com.docker.lb.sticky_session_cookie=session \
--label com.docker.lb.port=8080 \
--env METADATA="demo-sticky" \
ehazlett/docker-demo
有关更多信息,请参见https://docs.docker.com/ee/ucp/interlock/usage/sessions/。>>
您还可以使用Traefik负载平衡器来实现。有关如何配置它的逐步说明,请参见Deploy your Stateful Web Applications in Docker Swarm using Traefik Sticky Sessions。