一.首先是搭建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.需要自己使用过程中注意.