Gateway网关简介及使用

一、 什么是 API 网关(API Gateway)

1.分布式服务架构、微服务架构与 API 网关

在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。

Gateway网关简介及使用_第1张图片

2.API 网关的定义

网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。

API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。

3.API 网关的职能

Gateway网关简介及使用_第2张图片

4.常见的API网关

l Ngnix+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用

lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本

l Kong

基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:

只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

l Zuul 1.0----老的微服务项目

Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发 问题:缺乏管控,无法动态配

置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx

Netflix提出理论—Zuul2.0 远远超过1.0—实际的产品没有出来。

l Spring Cloud Gateway

Spring公司为了替换Zuul而开发的网关服务,将在下面具体介绍。

注意:SpringCloud alibaba技术栈中并没有提供自己的网关,我们可以采用Spring Cloud Gateway来做网关

二、Gateway简介

Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 Project Reactor 等术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。

1.为什么用Gateway

Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。

2.Gateway组件概念

Gateway网关简介及使用_第3张图片
Gateway网关简介及使用_第4张图片

3.如何使用gateway

(1)引入相关依赖

Gateway网关简介及使用_第5张图片

    <!--如果你引入了gateway的依赖,那么不能引用spring-boot-starter-web的依赖。
              gateway使用的服务netty服务,如果你引入web,而web使用的tomcat服务器。两个服务会出现冲突-->
              
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

(2)编写主启动类

Gateway网关简介及使用_第6张图片

package com.lzq;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GetewayApp02 {
    public static void main(String[] args) {
        SpringApplication.run(GetewayApp02.class,args);
    }
}

(3)配置文件

Gateway网关简介及使用_第7张图片

#服务名称
spring:
  application:
    name: qy165-lzq
#配置路径规则
  cloud:
    gateway:
      routes:
        - id: lzq01 #路由的唯一标识-------随便起只要不重复就可以  如果不写默认uuid创建
          uri: http://localhost:8001  # 真是转发地址
          predicates:                 # 断言  当满足当前条件时进行跳转到uri  可以理解为判断
            - Path=/aaa/**

        - id: lzq02
          uri: lb://lzq-01      #lb 表示跳转方式 获取nacos上的服务器名
          predicates:
            - Path=/aaa/**
#连接nacos地址
    nacos:
      discovery:
        server-addr: localhost:8848
        register-enabled: false

Gateway网关简介及使用_第8张图片
发现uri地址是一个死数据,未来我们可以是集群。

如何解决? --我们也可以把网关交于注册中心来管理,那么网关就可以从注册中心拉取服务信息。

Gateway网关简介及使用_第9张图片
思考: 如果未来我们有1w个微服务,那么就需要在gateway中配置1w微服务的路由。

解决方案: 可以使用gateway自动定位功能

Gateway网关简介及使用_第10张图片

这里我们要注意两个服务器的组名要一样,否则找不到路径会报404
Gateway网关简介及使用_第11张图片

server:
  port: 81
spring:
  application:
    name: qy165-gateway
    #    注册中心的地址
    nacos:
      discovery:
        server-addr: localhost:8848
  #  开启微服务自动定位功能
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true

Gateway网关简介及使用_第12张图片

4.gateway常见的断言–了解

l *基于**Datetime**类型的断言工厂*

此类型的断言根据时间做判断,主要有三个:

AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期

BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期

BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内

-After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]

l *基于远程地址的断言工厂* *RemoteAddrRoutePredicateFactory**:*

接收一个IP地址段,判断请求主机地址是否在地址段中

-RemoteAddr=192.168.1.1/24

l *基于**Cookie**的断言工厂*

CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求

cookie是否具有给定名称且值与正则表达式匹配。

-Cookie=chocolate, ch.

l *基于**Header**的断言工厂*

HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否

具有给定名称且值与正则表达式匹配。 key value

-Header=X-Request-Id, \d+

l *基于**Host**的断言工厂*

HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。

-Host=**.testhost.org

l *基于**Method**请求方法的断言工厂*

MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。

-Method=GET

l *基于**Path**请求路径的断言工厂*

PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。

-Path=/foo/{segment}基于Query请求参数的断言工厂

QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具

有给定名称且值与正则表达式匹配。

-Query=baz, ba.

l *基于路由权重的断言工厂*

WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发

routes:

-id: weight_route1 uri: host1 predicates:

-Path=/product/**

-Weight=group3, 1

-id: weight_route2 uri: host2 predicates:

-Path=/product/**

-Weight= group3, 9

5.gateway内置的过滤器–了解

Gateway网关简介及使用_第13张图片
Gateway网关简介及使用_第14张图片

你可能感兴趣的:(gateway,junit)