gateway入门(一)

网关gateway

1.什么是网关

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API

2.网关在架构中的地位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pp5BnjVQ-1617890459352)(C:\Users\SC4757\AppData\Roaming\Typora\typora-user-images\image-20210407234408183.png)]

现在前后端分离的系统一般都是如下设计:

nginx做静态资源服务器,前端页面调用后台接口时先请求到nginx,nginx负载均衡路由到后端网关(gateway),然后网关做请求身份验证,服务路由,日志记录等等操作,再转发业务处理接口,处理完返回数据

3.网关和nginx的区别

网关应当具备以下功能:

  • 性能:API高可用,负载均衡,容错机制。
  • 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
  • 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
  • 缓存:数据缓存。
  • 监控:记录请求响应数据,api耗时分析,性能监控。
  • 限流:流量控制,错峰流控,可以定义多种限流规则。
  • 灰度:线上灰度部署,可以减小风险。
  • 路由:动态路由规则

以上功能对系统的稳定性和健壮性至关重要。

nginx和Spring Cloud Gateway在功能上是有一些重叠的地方,都可以做服务转发。但是网关在大型微服务系统中是一个很重的角色,Spring Cloud Gateway是专为为网关的角色而设计的,功能强大,而且是官方出品,所以在大型系统开发中基本上都会选用此组件。

而nginx只能实现一些上面所说的一部分功能,一般都是选择nginx做静态资源缓存和前端调用接口的负载均衡。

在网络模型中,nginx是四层负载均衡,gateway是七层负载均衡。关于负载均衡的资料:https://lawrenceli.me/blog/load-balancing

4.网关的核心

  • 路由(route): 网关最基础的部分,也是网关比较基础的工作单元。路由由一个ID、一个目标 URL(最终路由到的地址)、一系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组 成。如果断言为true,则匹配该路由。

  • 断言(predicates):参考了Java8中的断言java.util.function.Predicate,开发人员可以匹配Http 请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配一样),如果断 言与请求相匹配则路由

  • 过滤器(filter):一个标准的Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑

    断言是我们的匹配条件,结合目标的url,就可以确定一个具体的路由。

项目结构
在这里插入图片描述

父级目录的pom

 <dependencyManagement>
        <dependencies>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

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


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

    </dependencies>

gateway模块的pom

   <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

gateway模块的配置文件

server.port=80

spring.application.name=cloud-gateway
#路由id
spring.cloud.gateway.routes[0].id=gateway-id
#路由url
spring.cloud.gateway.routes[0].uri=http://localhost:8001
#断言
spring.cloud.gateway.routes[0].predicates[0]=Path=/order/**

路由url是order模块的请求地址
order模块请求
网关模块请求
by the way:虽然我喜欢用properties配置文件,但是用yml配置gateway更顺手
---------------------初步demo over----------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值