Soul网关整合Spring Cloud 使用和存在的问题

本文详细介绍了如何搭建Soul网关的后台管理系统与自定义网关项目,包括依赖配置、超时设置及服务信息配置。在实际使用中,作者遇到了POST请求参数丢失、空指针异常等问题,并给出了解决方案。此外,文章还提到Soul网关的性能优势及一些不足之处,强调其可插拔插件设计和便捷的后台管理。
摘要由CSDN通过智能技术生成

 一.首先是搭建soul网关的后台管理系统

首先从官网上下载最新版本的soul-admin jar包部署在服务器上,这个jar包是soul网关的后台管理系统.

大家按照官方文档配置非常简单.地址在这里 https://shenyu.apache.org/zh/docs/index/

二.搭建自定义的soul网关项目.

1.首先新建单独的网关spring boot项目,maven加入依赖


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        <soul.version>2.3.0-RELEASE</soul.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>2.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <!--Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!--soul gateway start-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-gateway</artifactId>
            <version>${soul.version}</version>
        </dependency>
        <!--soul data sync start use websocket-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-sync-data-websocket</artifactId>
            <version>${soul.version}</version>
        </dependency>
        <!--soul springCloud plugin start-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-springcloud</artifactId>
            <version>${soul.version}</version>
        </dependency>
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-context-path</artifactId>
            <version>${soul.version}</version>
        </dependency>
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
            <version>${soul.version}</version>
        </dependency>
        <!--soul springCloud plugin end-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-ratelimiter</artifactId>
            <version>${soul.version}</version>
        </dependency>
    </dependencies>

2.配置文件配置

soul:
  sync:
    websocket:
      ##这里的配置是soul-admin后台管理的ip地址
      urls: ws://127.0.0.1:9095/websocket
 ##这里需要配置一下httpclient的超时时间
  httpclient:
    readTimeout: 10000
    writeTimeout: 10000
    connectTimeout: 10000

这里第一个坑就来了,你再soul后台管理系统配置的单独服务的超时时间和这里配置httpclient时间共同起作用,因为他底层是用的reactor httpclient,也需要配置超时时间

3.进入后台管理系统配置服务信息, 账号是admin,密码是123456

4.如果你不想下游服务集成他的依赖包,自动配置信息到他的后台管理系统,就需要自己手动将服务信息配置到soul后台系统里面,所以上面我没有按照官方文档配置依赖到下游服务的maven里面

①配置元数据空间的服务信息

 ②配置插件列表中的context_path插件信息

 ③配置 spring cloud 插件的信息

上面三步配置完成之后就可以直接使用进行路由了.

三. soul网关存在的其他的坑

1. post请求url上拼接参数,下游服务参数接收不到?

具体问题解决过程可以看我提的issues https://github.com/dromara/shenyu/issues/1580

因为SpringCloudPlugin 插件中,只处理了GET请求,所以post请求参数丢弃了

2.当soul找不到spring cloud项目配置的元空间服务的时候,会报错空指针,正常情况应该会有提示找不到元空间服务, 是因为GlobalPlugin中的DefaultSoulContextBuilder的build方法中有这么一段代码

 @Override
    public SoulContext build(final ServerWebExchange exchange) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        MetaData metaData = MetaDataCache.getInstance().obtain(path);
        if (Objects.nonNull(metaData) && metaData.getEnabled()) {
            exchange.getAttributes().put(Constants.META_DATA, metaData);
        }
        return Optional.ofNullable(metaData).map(e -> decoratorMap.get(e.getRpcType()))
                .orElse(decoratorMap.get(RpcTypeEnum.HTTP.getName()))
                .decorator(buildDefault(request), metaData);
    }

可以看到最后的lambda表达式中当metaData为null的时候,会默认为是http调用,然后去找http的decorator方法去构建SoulContext,但是因为 spring cloud的项目没有引入http插件依赖,所以会报空指针.

3.超时配置需要配置两遍问题,后台管理系统配置一遍,httpclient需要单独配置一遍

四.总结:

1.soul网关是可插拔插件式的网关,大家可以用它官方现有的插件,直接引入相应的依赖,配置一下就可以使用,也可以定制自己的插件,非常方便,耦合度非常低.设计理念非常好

2.有单独的后台管理系统配置,不用像spring cloud gateway需要单独的引入配置中心.可以很方便的进行插件管理,配置增加和修改.

3.soul网关目前测试性能是spring cloud gateway的10倍以上,是因为 spring cloud gateway存在性能问题还没有解决.

4.缺点就是有一些坑和bug.需要自己使用过程中注意.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值