0

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

4

1 回答 1

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 支持的负载平衡。它没有正确记录。我在这里记录了它。我还创建了一个 GitHub 问题来添加非响应式实现,但是,实现它的决定将取决于更大的社区利益。

于 2021-06-18T15:33:51.020 回答