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

问题描述 投票:0回答:2

我使用 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'

应该仅访问基于

LoadBalancer的基于请求的粘性会话
say-hello1实例,但使用循环负载平衡。

我在这里想念什么?

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

spring-cloud spring-cloud-loadbalancer
2个回答
0
投票

这里有两件事需要考虑:

  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。 我还创建了一个 GitHub 问题来添加非响应式实现,但是,实现它的决定将取决于更大的社区兴趣。


0
投票

LoadBalancer 的基于请求的粘性会话似乎不起作用。

无论是否将 Cookie 传递给 WebClient 都不起作用。该请求只是循环赛。但是,cookie 正在从 UserApplication 传递到 SayHelloApplication RestController。

输出示例: 键:cookie,值:'sc-lb-instance-id=say-hello1'

我正在使用下面的配置。

春天: 应用: 姓名:用户 云: 发现: 客户: 简单的: 实例: 打个招呼: - 实例 ID:say-hello1 uri:http://localhost:8090 - 实例 ID:say-hello2 uri:http://localhost:9092 - 实例 ID:say-hello3 uri:http://localhost:9999 负载均衡器: 配置:基于请求的粘性会话 粘性会话: 添加服务实例 cookie:true

© www.soinside.com 2019 - 2024. All rights reserved.