一、概述
通过Spring Gateway入门之后,仅仅熟悉了Spring Cloud工程的搭建以及路由的基本使用。Spring Gateway运用到实际中还有很多其他的要求,比如入门教程中的案例,把某个服务的所有接口都暴露到网关,这样不安全也没有必要,有些服务是服务集群内部使用的,不需要暴露到网关中。同时网关中的Filters的顺序也需要确定。因此,有必要对网关进行设计。
二、网关设计
网关的设计,这里主要考虑需要的Filters的功能。
这里也需要规范客户端请求的数据格式,包含请求URL、请求头信息以及请求消息体。
请求URL: ahao.com.cn/api/{apiCod…
请求Header:X-AuthToken
请求Body: {param1: “value1”, param2: “value2”}
这里对整体路由的路径进行说明
三、Java路由配置
基于自定义实现RouteLocator,可以实现以上路由功能,代码片段如下:
@Bean
public RouteLocator customizeRoute(RouteLocatorBuilder builder) {
RouteLocatorBuilder.Builder routes = builder.routes();
List<ApiCodeDVO> list = apiCodeService.list();
for (ApiCodeDVO dvo : list) {
logger.info("dvo: {}, ", dvo.toString());
Function<PredicateSpec, Route.AsyncBuilder> predicateSpecAsyncBuilderFunction =
r -> r.path("/api/" + dvo.getApiCode())
// rewirtePath的功能是把/api/MS00001访问路径修改为/hello
.filters(filter -> filter.rewritePath("/api/" + dvo.getApiCode(), dvo.getUrl()))
.uri("lb://" + dvo.getSystemCode());
routes.route(predicateSpecAsyncBuilderFunction);
}
return routes.build();
如上的apiCodeService实现如下:
@Override
public List<ApiCodeDVO> list() {
List<ApiCodeDVO> list = new ArrayList<>();
list.add(generate("MS00001", "nacos-demo", "/hello"));
list.add(generate("MS00002", "nacos-demo", "/hello"));
list.add(generate("MS00003", "client-demo", "/hello"));
list.add(generate("MS00004", "client-demo", "/hello"));
return list;
}
private ApiCodeDVO generate(String apiCode, String systemCode, String url) {
ApiCodeDVO dvo = new ApiCodeDVO();
dvo.setApiCode(apiCode);
dvo.setSystemCode(systemCode);
dvo.setUrl(url);
return dvo;
}
三、总结
如上这种方式,需要在网关定义所有的外部暴露接口与内部服务的关系。这样不需要暴露的接口,网关就不会对外暴露。
这里的实现不是很优雅,在route这里读取了所有的apiCode定义,有两个小问题:第一、每次启动都需要重新加载;第二、数据量很大,会定义很多路由,影响启动速度。
四、源码
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END