使用 Spring Cloud LoadBalancer 的基于请求的粘性会话配置

Request-based Sticky Session configuration with Spring Cloud LoadBalancer

我使用 Spring Cloud LoadBalancer

针对基于请求的粘性会话进行了以下配置
spring:
  cloud:
    discovery.client.simple.instances:
      say-hello:
        - instanceId: say-hello1
          uri: http://localhost:8080
        - instanceId: say-hello2
          uri: http://localhost:8081

    loadbalancer:
      configurations: request-based-sticky-session
      sticky-session:
        add-service-instance-cookie: true

server.port:9090

以下调用:

$ http :9090/hi 'Cookie:sc-lb-instance-id=say-hello1'

应该只转到基于 Request-based Sticky Session for LoadBalancersay-hello1 实例,而是使用循环负载平衡。

我在这里想念什么?

这里是试用它的源代码:https://github.com/altfatterz/client-side-loadbalancing

这里有两点需要考虑:

  1. 在示例中,cookie 必须传递给实际的负载平衡请求,例如:

    @GetMapping("/hi")
    public String hi(@RequestParam(value = "name", defaultValue = "Mary") String name) {
     logger.info("Accessing /hi endpoint");
     HttpHeaders headers = new HttpHeaders();
     headers.set("Cookie", "sc-lb-instance-id=say-hello1");
    
     HttpEntity entity = new HttpEntity(headers);
     ResponseEntity<String> greeting = restTemplate.exchange("http://say-hello/greeting", HttpMethod.GET, entity, String.class, new HashMap<>());
     return greeting + " " + name;
    }
    
  2. 此功能仅支持 WebClient 支持的负载平衡。它没有正确记录。我已经记录了它 here。 我还创建了 a GitHub issue 用于添加非反应性实现,但是,实现它的决定将取决于更大的社区兴趣。