Spring Cloud Alibaba系列三:集成Gateway实现路由管理

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

spring cloud alibaba 版本对照

spring cloud alibaba 有严格的版本要求,所以一定要选对 spring cloud 版本,以及 spring boot 的版本

此系列文章的版本选取如下:

  • Spring Cloud 版本:Spring Cloud 2021.0.1
  • Spring Boot 版本:2.6.3
  • Spring Cloud Alibaba 版本:2021.0.1.0

Spring Cloud Alibaba系列一:nacos 注册中心

Spring Cloud Alibaba系列二:openFeign 实现服务间的通信

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

Spring Cloud Alibaba系列四:集成 seata 实现分布式事务

前言

前两篇整合了nacos做为注册中心,openFeign实现服务间的通信,这篇记录整合Gateway做为整个路由的管理。

那么什么是Gateway

网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同层–应用层。

Gateway能用来干什么?

常见的作用有:

  1. 鉴权校验:验证是否认证和授权
  2. 统一入口:提供所有微服务的入口点,起到隔离作用,保障服务的安全性
  3. 限流熔断
  4. 路由转发
  5. 负载均衡
  6. 链路追踪

1、改造父项目 pom 文件

由于引入了Gateway,所以我们要把父项目的 pom文件里的 spring-boot-starter-web 的依赖删掉,依次在 customerprovider模块的pom文件里引入该依赖。否则启动 gateway 模块会报错。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、创建 gateway 子 module

创建方式同创建其他两个module一样。创建完成之后修改该模块的 pom 文件。需要注意的是,由于common模块引入了mybatis-plus的依赖,所以在gateway的pom文件里如果要添加common模块的依赖,需要移除掉mybatis-plus,否则启动会报DataSource异常。

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>alibaba</artifactId>
        <groupId>cn.xzf</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>cn.xzf</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--gateway依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- Feign Client for loadBalancing -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

另外一个要注意的是,如果在 yml 的配置文件里,配置 routes.uri 为 lb:// 的形式,需要加上loadbalance的依赖,否则启动访问,会 503

<!-- Feign Client for loadBalancing -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

原因如下:

由于从springcloud2020版本开始,弃用了Ribbon,因此Alibaba在2021及之后版本的 nacos 中删除了 Ribbonjar 包,因此无法通过 loadbalancer 路由到指定微服务。

3、配置yml文件

dev 的配置文件内容如下

url:
  base-url: 192.168.2.213

spring:
  cloud:
    nacos:
      discovery:
        #注册中心地址
        server-addr: ${url.base-url}
        username: nacos
        password: nacos
      config:
        #命名空间
        namespace: ${spring.profiles.active}
        file-extension: yaml
        #配置中心地址
        server-addr: ${url.base-url}
    gateway:
      routes:
        - id: provider
          uri: lb://provider
          predicates:
            - Path=/provider/**
          # 过滤器
          filters:
#            - StripPrefix=1 #转发之前去掉第一层路由
        - id: customer
          uri: lb://customer
          predicates:
            - Path=/customer/**
          # 过滤器
          filters:
#            - StripPrefix=1 #转发之前去掉第一层路由
  • routes:配置路由相关的内容
  • id:保持唯一即可
  • uri:可以是http://的形式,也可以是 lb://服务名称(lb://provider)。lb 指使用负载均衡的模式调用对应的服务
  • predicates:路由断言,判断那些url会转发到对应的服务去
  • filters:过滤器,对请求或响应做处理。

更多的配置可以参考 网关GateWay的使用详解、路由、过滤器、跨域配置

上述做完之后,就可以浏览器测试看看了。gateway 服务配置的端口号是8084
在这里插入图片描述
依次启动 gatewayprovidercustomer 服务。
浏览器访问

1、http://localhost:8082/provider/demo/test
在这里插入图片描述

2、http://localhost:8084/customer/demo/test

在这里插入图片描述
3、http://localhost:8084/provider/demo/test

在这里插入图片描述
8082 是正常访问 provider 服务的接口,8084 是 gateway 服务的端口,分别访问 customerprovider 的接口,发现都正确访问到了,自此集成gateway结束了。

实际上 gateway 还有更多的作用,这里只是简单的路由功能,而且路由功能里还可以传参数等操作,更多的功能值得你去挖掘。

上述就是 集成 gateway 的快速过程。

SpringCloudAlibaba系列demo (github.com)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值