Skip to content

第十五章 网关

前言

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

一、POM 配置

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

xml
			<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 子项目引入的核心包,

xml
<!--注册中心客户端-->
        <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 的文件。 在这里插入图片描述

yml
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 里面取出来,然后加载到系统里面;同时还需要监听配置文件的变化,方便实时更新配置文件,源码如下:

java
@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 配置中心。

yml
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 里面的,可以参考源码

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. 添加新路由,并发布,可以在控制台看到路由更新日志
yml
- id: test
  uri: http://www.baidu.com/
  predicates:
    - Path=/test

在这里插入图片描述

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

当前版本 tag:2.0.0 代码仓库

六、 体验地址

后台数据库只给了部分权限,报错属于正常!

想学的老铁给点点关注吧!!!

欢迎留言交流!!!

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