soul网关系列(十五):协议类插件(springcloud、dubbo、sofa)源码解读

一、插件简介

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值