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

第十五章 网关


前言

本系统中网关最主要的功能就是:路由转发、路径重写、负载均衡、过滤等。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的文件。
在这里插入图片描述

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服务,可以看到路由加载的日志,并且能服务注册中心发现该服务。
    在这里插入图片描述
    在这里插入图片描述
  2. 添加新路由,并发布,可以在控制台看到路由更新日志
  - id: test
    uri: http://www.baidu.com/
    predicates:
      - Path=/test

在这里插入图片描述
3. 访问http://127.0.0.1:8888/demo/user/test,可以正确路由到service-demo这个服务的方法上。
在这里插入图片描述

当前版本tag:2.0.0
代码仓库


六、 体验地址

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值