connetist / connectist-backend

2 stars 0 forks source link

[FEAT] 유저가 여러개의 user-service에서 하나의 인스턴스로만 Routing 하는 Sticky Session 구현 #103

Closed JunHyungJang closed 1 day ago

JunHyungJang commented 1 month ago

📕 제목

import java.util.List;

@Component @Order(LoadBalancerClientFilter.LOAD_BALANCER_CLIENT_FILTER_ORDER) public class StickySessionLoadBalancerFilter extends LoadBalancerClientFilter {

public StickySessionLoadBalancerFilter(LoadBalancerClient loadBalancer) {
    super(loadBalancer);
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
    ServerHttpRequest request = exchange.getRequest();

    String userId = extractUserIdFromRequest(request);
    if (userId != null) {
        ServiceInstance instance = chooseInstance(route.getId(), userId);
        if (instance != null) {
            String uri = instance.getUri().toString();
            ServerHttpRequest newRequest = request.mutate().uri(URI.create(uri)).build();
            return chain.filter(exchange.mutate().request(newRequest).build());
        }
    }
    return chain.filter(exchange);
}

private String extractUserIdFromRequest(ServerHttpRequest request) {
    HttpCookie userCookie = request.getCookies().getFirst("userId");
    return userCookie != null ? userCookie.getValue() : null;
}

private ServiceInstance chooseInstance(String serviceId, String userId) {
    List<ServiceInstance> instances = loadBalancer.choose(serviceId);
    int index = Math.abs(userId.hashCode() % instances.size());
    return instances.get(index);
}

}

2. 사용자 식별자 추출
- 쿠키에서 userId 추출하기
3. Application.yaml 파일설정

spring: cloud: gateway: default-filters:


4. Eureka 설정

eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true



## 🏫 To-do
- [ ] Custom LoadBalancer 생성
- [ ] userId 값을 기준으로 Routing 
hyojaeKwon commented 1 month ago

준형님~ 제가 작업 진행하면 될까요?

JunHyungJang commented 1 month ago

준형님~ 제가 작업 진행하면 될까요?

제가하겠슴다