任务

跑通springcloud插件,研究底层原理

springcloud 插件

依赖

先看 springcloud 的依赖,可以看到和 divide 插件类似,也是实现了 AbstractSoulPlugin 抽象类。

image.png

基础实现原理

我们可以聚焦于 SpringCloudPlugin 的实现,重点关注 doExecute 方法。

  • 这里的负载均衡是用 ribbon
  • service-id 是 springCloud-test,就是 springcloud 服务的 app 名称
1
2
3
4
5
6
7
8
9
10
11
12
13
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
...
//负载均衡选择服务实例
final ServiceInstance serviceInstance = loadBalancer.choose(selectorHandle.getServiceId());
...
//通过服务实例和真实 url 构造 uri
final URI uri = loadBalancer.reconstructURI(serviceInstance, URI.create(soulContext.getRealUrl()));

//通过 uri 和请求方式,构造真实的请求 url
String realURL = buildRealURL(uri.toASCIIString(), soulContext.getHttpMethod(), exchange.getRequest().getURI().getQuery());
...
return chain.execute(exchange);
}

负载均衡 balance

在这里我们可以注意到,springcloud 插件的原理其实和 divide 插件类似,区别就是负载均衡使用了 netflix 的 Ribbon 作为负载均衡器。

后续安排

  • 对 springcloud 的 ribbon 进行小结

Link