Spring Cloud 中的粘性会话和 Zuul

Sticky Sessions and Zuul in Spring Cloud

我有一组微服务,我们使用 zuul 从前端进行路由,作为使用 spring 云将 uri 上下文路径映射到特定微服务的一种方式。

我们在内部和外部都使用 spring OAuth2,而且效果很好。

但是,对于一项特定服务,出现了对 SAML 的要求,这对该服务强加了粘性会话要求。

有没有人考虑过这个问题,什么是为 zuul 提供粘性会话支持的正确方法。

在我解决这个问题之前,我将一些请求从前端的 HAProxy 直接路由到此服务。

我假设如果您需要具有多个后端的粘性会话,那么您必须使用功能区过滤器。粘性会话可以添加为 IRule,例如

@RibbonClient(value="myui", configuration=UiRibbonConfiguration.class)
public class UiRibbonConfiguration {
  @Bean
  public IRule loadBalancerRule() {
    return new MyStickySessionRule();
  }
}

加上一个 ZuulFilter(或者你后端的一个 servlet Filter)添加一个 cookie 用于关联 - 每个后端实例必须唯一标识自己,然后在 MyStickySessionRule你必须查看传入的 cookie 来决定将请求发送到哪个实例(例如,如果后端是 Spring 启动应用程序,你可以将 "X-Application-Context" header 值作为 cookie 发送) .

N.B。如果您可以在后端使用 Spring Session,您将不需要粘性会话。