一、插件简介
- spring cloud插件
- 将http协议转成springCloud协议的核心。
- dubbo插件
- 将http协议转换成dubbo协议的插件,也是网关实现dubbo泛化调用的关键。
- dubbo插件需要配合元数据才能实现dubbo的调用。
- apache dubbo 和 alibaba dubbo用户,都是使用该同一插件。
- sofa插件
- sofa插件是将http协议 转换成sofa协议 的插件,也是网关实现sofa泛化调用的关键。
- sofa插件需要配合元数据才能实现dubbo的调用。
二、springcloud插件流程
2.1 半个月之前的一个错误
在半个月前测试srping cloud插件的时候,遇到了一个问题springcloud serviceId 不存在或者配置错误!或者注册中心配置错误!。

当时没有解决,错误依旧存在,随着对流程和代码的熟悉,今天很快的定位出了问题所在。记录一下定位流程
- 看错误信息没提示serviceId不存在或者配置错误,或者注册中心配置错误,感觉是配置中心错了
- 检查配置信息,根据官网配置,之前soul-bootstrap配置了pom文件和application-local.yml的eureka
- 启动了soul-test里自带的soul-test-eureka
- 重启soul-bootstrap服务
- soul-test-springcloud配置eureka注册中心,启动soul-test-springcloud服务
- postman发送http://localhost:9195/springcloud/order/findById?id=1
- 发现还是报springcloud serviceId错误
- debug,根据这几天的学习,断点至SpringCloudPlugin的doExecute()方法,肯定会走到这里。
final ServiceInstance serviceInstance = loadBalancer.choose(selectorHandle.getServiceId());
if (Objects.isNull(serviceInstance)) {
Object error = SoulResultWrap.error(SoulResultEnum.SPRINGCLOUD_SERVICEID_IS_ERROR.getCode(), SoulResultEnum.SPRINGCLOUD_SERVICEID_IS_ERROR.getMsg(), null);
return WebFluxResultUtils.result(exchange, error);
}
发现这里为空,然后返回了这个错误。还是注册中心负载均衡中心没有找到可用的service id
- 看soulBootstrapApplication的日志,发现居然没有eureka的一点痕迹,肯定是erueka注册中心配置不对。
- 全局eureka搜索soulBootstrap的pom文件,定位到这里默认是屏蔽的
<!-- springCloud if you config register center is nacos please dependency this-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2.1.0.RELEASE</version>-->
<!-- </dependency>-->
<!-- springCloud if you config register center is eureka please dependency end-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!-- <version>2.2.0.RELEASE</version>-->
<!-- </dependency>-->
- 发现eureka-client的客户端居然是屏蔽的,大意了,一个低级错误,官网对这块的配置依赖也没说明,打开后,重启后稍等几秒(猜测同步延迟)正常。

2.2 springcloud 插件源码解读
- 初始化、插件链都和divide没有区别,直接进入doExecute进行分析
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
if (Objects.isNull(rule)) {
return Mono.empty();
}
final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
assert soulContext != null;
// 获取selector和rule信息
final SpringCloudRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), SpringCloudRuleHandle.class);
final SpringCloudSelectorHandle selectorHandle = GsonUtils.getInstance().fromJson(selector.getHandle(), SpringCloudSelectorHandle.class);
if (StringUtils.isBlank(selectorHandle.getServiceId()) || StringUtils.isBlank(ruleHandle.getPath())) {
Object error = SoulResultWrap.error(SoulResultEnum.CANNOT_CONFIG_SPRINGCLOUD_SERVICEID.getCode(), SoulResultEnum.CANNOT_CONFIG_SPRINGCLOUD_SERVICEID.getMsg(), null);
return WebFluxResultUtils.result(exchange, error);
}
// loadBalancer springcloud的负载均衡实现,返回一个选择后的实例
final ServiceInstance serviceInstance = loadBalancer.choose(selectorHandle.getServiceId());
if (Objects.isNull(serviceInstance)) {
Object error = SoulResultWrap.error(SoulResultEnum.SPRINGCLOUD_SERVICEID_IS_ERROR.getCode(), SoulResultEnum.SPRINGCLOUD_SERVICEID_IS_ERROR.getMsg(), null);
return WebFluxResultUtils.result(exchange, error);
}
// reconstructURI 返回全路径url,具体为host:port格式类型
final URI uri = loadBalancer.reconstructURI(serviceInstance


1万+

被折叠的 条评论
为什么被折叠?



