使用 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 LoadBalancer 的 say-hello1
实例,而是使用循环负载平衡。
我在这里想念什么?
这里是试用它的源代码:https://github.com/altfatterz/client-side-loadbalancing
这里有两点需要考虑:
在示例中,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;
}
此功能仅支持 WebClient 支持的负载平衡。它没有正确记录。我已经记录了它 here。
我还创建了 a GitHub issue 用于添加非反应性实现,但是,实现它的决定将取决于更大的社区兴趣。
我使用 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 LoadBalancer 的 say-hello1
实例,而是使用循环负载平衡。
我在这里想念什么?
这里是试用它的源代码:https://github.com/altfatterz/client-side-loadbalancing
这里有两点需要考虑:
在示例中,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; }
此功能仅支持 WebClient 支持的负载平衡。它没有正确记录。我已经记录了它 here。 我还创建了 a GitHub issue 用于添加非反应性实现,但是,实现它的决定将取决于更大的社区兴趣。