我使用 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
这里有两件事需要考虑:
在示例中,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。 我还创建了一个 GitHub 问题来添加非响应式实现,但是,实现它的决定将取决于更大的社区兴趣。
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