从零开始,手打一个权限管理系统(第十五章 网关)

第十五章 网关

前言

本系统中网关最主要的功能就是:路由转发、路径重写、负载均衡、过滤等。Spring Cloud Gateway官方文档


一、POM配置

父级pom.xml引入相关依赖,具体内容请参考源码,核心的依赖就是SpringCloud、SpringCloudAlibaba、SpringBoot,

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

Gateway子项目引入的核心包,

<!--注册中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--gateway 网关依赖,内置webflux 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

二、路由配置

路由信息全部都托管到nacos里面一个名为dynamic_routes的文件。


image.png
routes:
  # service-auth
  - id: service-auth
    predicates:
      - Path=/auth/**
    uri: lb://service-auth
    filters:
      - StripPrefix=1
  # service-upms-api
  - id: service-upms-api
    predicates:
      - Path=/upms/**
    uri: lb://service-upms-api
    filters:
       - StripPrefix=1
  # service-demo
  - id: service-demo
    predicates:
      - Path=/demo/**
    uri: lb://service-demo
    filters:
      - StripPrefix=1
 - id: test
   uri: http://www.baidu.com/
   predicates:
     - Path=/test

参数解释:
id:路由唯一标识,用来区别于其他的route
uri:请求被转发到的微服务,lb表示负载均衡
predicate:断言的作用是进行条件判断,我们这里用的是Path Route Predicate Factory,路径匹配成功才会执行路由。
filter: 过滤器,StripPrefix=1表示去掉前缀


三、路由初始化

路由的配置信息存放在Nacos里面,在系统启动的时候需要从nacos里面取出来,然后加载到系统里面;同时还需要监听配置文件的变化,方便实时更新配置文件,源码如下:

@Slf4j
@Configuration
@AllArgsConstructor
public class DynamicRouteInit {
    private RouteDefinitionWriter routeDefinitionWriter;
    private NacosConfigProperties nacosConfigProperties;

    @PostConstruct
    public void initRoute() {
        try {
            Properties properties = new Properties();
            properties.put(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
            properties.put(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername());
            properties.put(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword());
            ConfigService configService = NacosFactory.createConfigService(properties);
            String content = configService.getConfig(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, CommonConstant.CONFIG_TIMEOUT_MS);
            log.info("初始化路由网关开始");
            updateRoute(content);
            log.info("初始化路由网关完成");

            /**
             * 监听配置
             * 如果希望 Nacos 推送配置变更,可以使用 Nacos 动态监听配置接口来实现。
             */
            configService.addListener(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, new Listener() {
                @Override
                public void receiveConfigInfo(String configInfo) {
                    log.info("更新路由网关开始");
                    updateRoute(configInfo);
                    log.info("更新路由网关完成");
                }

                @Override
                public Executor getExecutor() {
                    return null;
                }
            });
        } catch (NacosException e) {
            log.error("加载路由出错:{}", e.getErrMsg());
        }
    }

    public void updateRoute(String content) {
        Yaml yaml = new Yaml();
        GatewayRouteList gatewayRouteList = yaml.loadAs(content, GatewayRouteList.class);
        gatewayRouteList.getRoutes().forEach(route -> {
            log.info("加载路由:{},{}", route.getId(), route);
            routeDefinitionWriter.save(Mono.just(route)).subscribe();
        });
    }
}

四、其他配置

新建配置文件bootstrap.yml,用来配置一些固定不变的参数,其他动态或者有变化可以托管到nacos配置中心。

server:
  port: 8888

spring:
  application:
    # 应用名称
    name: @artifactId@
  # 配置中心
  cloud:
    nacos:
      # 服务发现
      discovery:
        # 服务发现地址
        server-addr: @nacos.addr@
        # 组名
        group: @group.name@
      # 配置中心
      config:
        # 配置中心地址
        server-addr: @nacos.addr@
        # 文件扩展名
        file-extension: yml
        # 组名
        group: @group.name@
        # 共享文件配置
        shared-configs[0]:
          # 文件名称
          data-id: application.${spring.cloud.nacos.config.file-extension}
          refresh: true

log:
  # 日志名
  appName: service-gateway

其中@***@这种类型的参数是配置到pom.xml里面的,可以参考源码

<profiles>
        <!--生产环境-->
        <profile>
            <id>prod</id>
            <properties>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <group.name>DEFAULT_GROUP</group.name>
            </properties>
        </profile>
    </profiles>

五、验证

  1. 启动Gateway服务,可以看到路由加载的日志,并且能服务注册中心发现该服务。


    image.png

    image.png
  2. 添加新路由,并发布,可以在控制台看到路由更新日志

  - id: test
    uri: http://www.baidu.com/
    predicates:
      - Path=/test
image.png
  1. 访问http://127.0.0.1:8888/demo/user/test,可以正确路由到service-demo这个服务的方法上。
    image.png

当前版本tag:2.0.0
代码仓库


六、 体验地址

后台数据库只给了部分权限,报错属于正常!
想学的老铁给点点关注吧!!!
欢迎留言交流!!!

我是阿咕噜,一个从互联网慢慢上岸的程序员,如果喜欢我的文章,记得帮忙点个赞哟,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容