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

一、概述

通过Spring Gateway入门之后,仅仅熟悉了Spring Cloud工程的搭建以及路由的基本使用。Spring Gateway运用到实际中还有很多其他的要求,比如入门教程中的案例,把某个服务的所有接口都暴露到网关,这样不安全也没有必要,有些服务是服务集群内部使用的,不需要暴露到网关中。同时网关中的Filters的顺序也需要确定。因此,有必要对网关进行设计。

二、网关设计

网关的设计,这里主要考虑需要的Filters的功能。

image.png

这里也需要规范客户端请求的数据格式,包含请求URL、请求头信息以及请求消息体。

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

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

image.png

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYRSQmXM' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片