一、概述
经过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界说,有两个小问题:榜首、每次发动都需求从头加载;第二、数据量很大,会界说许多路由,影响发动速度。
四、源码
gitee.com/animal-fox_…