根据业务需求,我需要自定义负载均衡规则,获取相应的服务,然后返回;
代码如下:
继承LoadBalancerClientFilter 重写choose方法;
protected ServiceInstance choose(ServerWebExchange exchange) {
//获取用户票据信息
String ticket= AuthTicketUtils.getBxAuthTicket(exchange.getRequest());
logger.info("=====获取用户登录票据信息:{}============",ticket);
if(!StringUtils.isEmpty(ticket)){
//根据ticket获取用户信息
if (this.loadBalancer instanceof RibbonLoadBalancerClient) {
RibbonLoadBalancerClient client = (RibbonLoadBalancerClient) this.loadBalancer;
String userId=getUserNo(ticket);
logger.info("========当前操作用户信息为:{}=============",userId);
if(null == userId){
return super.choose(exchange);
}
//获取服务名称
String serviceId = ((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost();
logger.info("===========当前选择服务名称为:{}===========",serviceId);
//这里使用服务ID 和 用户ID 做为选择服务实例的key
GrayscaleProperties grayscaleProperties=new GrayscaleProperties();
grayscaleProperties.setServerId(serviceId);
grayscaleProperties.setUserId(userId);
return client.choose(serviceId,grayscaleProperties);
}
}
return super.choose(exchange);
}
当调用client.choose(String name,Object hint)方法时,将会调用我的规则,我的自定义规则代码如下:首先继承了AbstractLoadBalancerRule类,重写choose方法
public Server choose(Object o) {
logger.info("=======服务选择:{}=======",o);
//获取当前请求的所有服务
logger.info("============LoadBalancer:{}==============",this.getLoadBalancer().toString());
List<Server> servers = this.getLoadBalancer().getReachableServers();
//TODO 逻辑代码省略
return null;
}
当调用this.getLoadBalancer()时,返回的总是上一次正确的服务,举例来说我有A、B、C三个服务,当第一次请求A服务的时候正常返回,第二次B服务请求的时候,this.getLoadBalancer()返回的对象信息是A服务的信息;
附图: