spring cloud gateway 和 Ribbon的整合源码

在spring cloud gateway的源码中,我们看到会调用 RibbonLoadBalancerClient.choose(String serviceId)的方法。这个方法调用了getServer(serviceId),choose方法就是通过Ribbon获取到服务的ip。


public ServiceInstance choose(String serviceId) {

Server server = getServer(serviceId);

if (server ==null) {

return null;

}

return new RibbonServer(serviceId, server, isSecure(server, serviceId),

serverIntrospector(serviceId).getMetadata(server));

}

1.getServer(serviceId)方法 这个方法调用了getLoadBalancer(serviceId),getLoadBalancer(serviceId)这个方法就是通过工厂来获取LoadBanlancer。

protected Server getServer(String serviceId) {

return getServer(getLoadBalancer(serviceId));

}

protected Server getServer(ILoadBalancer loadBalancer) {

if (loadBalancer ==null) {

return null;

}

return loadBalancer.chooseServer("default");// TODO: better handling of key

}

protected ILoadBalancer getLoadBalancer(String serviceId) {

return this.clientFactory.getLoadBalancer(serviceId);

}

获取到服务的ip后,gateway获取到url,并且组装成调用下游的绝对路径,进行调用

URI uri = exchange.getRequest().getURI();

// if the `lb:` mechanism was used, use `` as the default,

// if the loadbalancer doesn't provide one.

String overrideScheme =null;

if (schemePrefix !=null) {

overrideScheme = url.getScheme();

}

URI requestUrl =loadBalancer.reconstructURI(new DelegatingServiceInstance(instance, overrideScheme), uri);

最后将具体的uri放到exchange上下文的GATEWAY_REQUEST_URL_ATTR中

为最后的NettyRoutingFilter的httpclient调用做准备

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容