一、概述

经过Spring Gateway入门之后,只是熟悉了Spring Cloud工程的建立以及路由的基本使用。Spring Gateway运用到实践中还有许多其他的要求,比方入门教程中的案例,把某个服务的一切接口都露出到网关,这样不安全也没有必要,有些服务是服务集群内部使用的,不需求露出到网关中。同时网关中的Filters的顺序也需求确认。因而,有必要对网关进行规划。

二、网关规划

网关的规划,这里主要考虑需求的Filters的功用。

微服务-网关Spring Gateway进阶-网关设计与路由

这里也需求标准客户端恳求的数据格式,包含恳求URL、恳求头信息以及恳求音讯体。

恳求URL: ahao.com.cn/api/{apiCod…
恳求Header:X-AuthToken
恳求Body: {param1: “value1”, param2: “value2”}

这里对整体路由的路径进行阐明

微服务-网关Spring Gateway进阶-网关设计与路由

三、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_…