服务网关要和远程服务调用(Feign)配合使用;

1,什么是Gateway网关:

Gateway网关是SpringCloud自家的组件技术;

1.1,网关的功能:

  1. 1. **身份验证和权限校验;**
  2. 1. **将用户请求路由到微服务,负载均衡;**
  3. 1. **请求限流;**

在网关路由规则不符合,就会拒绝访问;

1.2,Gateway和Feign的宏观架构:

image.png

1.3,在SpringCloud中的两种网关实现:

  1. **Gateway;(推荐)**
  1. **Zuul;**

1.3.1,这两种的网关组件区别:

  - Zuul是基于Servlet的实现,属于阻塞式编程;而SpringCloudGateway是基于Spring5中提供的WebFlux,属于响应式编程,比Zuul具有更好的性能;

2,* Gateway网关的搭建/入门:

  - **Gateway的最佳使用也是和Feign同理,将Gateway单独抽取为一个模块:**
  - **结构如下:**
  - ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1652607176111-2b7c69b9-2c90-482f-b3a4-049269c6efa4.png#clientId=u41c82a6b-1cec-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=184&id=u7385d299&margin=%5Bobject%20Object%5D&name=image.png&originHeight=237&originWidth=382&originalType=binary&ratio=1&rotation=0&showTitle=false&size=68698&status=done&style=none&taskId=u5e395dc5-636e-4290-8583-fe21f8206f9&title=&width=297)

2.1,导入依赖:

<dependencies>
  <!--网关-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
  </dependency>
  <!--nacos服务发现依赖-->
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
</dependencies>

2.2,编写启动类:

  - SpringBoot创建步骤;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {

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

2.3,* 编写基础配置和路由规则:

2.3.1,在网关路由中可以配置的内容:

  - **路由id:路由唯一的标识;**
  - **uri:路由目的地,支持 lb 和 http 两种,主要使用 http;**
  - **predicate:路由断言,判断请求是否符合要求,符合则转发到路由目的地;**
  - **filters:路由过滤器,处理请求或响应;**
     - **在模块中的resources目录下编写 application . yml 文件:**
# 网关端口
server:
  port: 10010

# 服务名称
spring:
  application:
    name: gateway 

# nacos地址  
  cloud:
    nacos:
    server-addr: localhost:80 

# 网关的配置
  gateway:
    routes: # 网关路由配置
    - id: userservice # 路由id,自定义,只要唯一即可
    # 方式一:路由的目标地址 http就是固定地址
    # uri: http://127.0.0.1:8081 
    # 方式二:lb就是负载均衡(load balancing),后面跟服务名称,表示对这个服务进行路由
    uri: lb://userservice 
    predicates: # 路由断言,也就是判断请求是否符合路由规则的条件,结果通常是真或假
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。 本例中,我们将 /user/开头的请求,代理到lb://userservice,lb是LoadBalanced负载均衡的缩写,根据服务名拉取服务列表,实现负载均衡。注:Path后面是等于,不是冒号,这只是一个字符串**

2.4,测试:

2.4.1,启动网关,访问http://localhost:10010/user/1时,符合/user/**规则,请求转发到uri:http://userservice/user/1,得到了结果:

image.png

2.5,*网关路由的流程图:

image.png


3,* 路由断言工厂:(Route Predicate Factory)

3.1,在网关路由中可以配置的内容:

  - **路由id:路由唯一的标识;**
  - **uri:路由目的地,支持 lb 和 http 两种,主要使用 http;**
  - **predicate:路由断言,判断请求是否符合要求,符合则转发到路由目的地;**
  - **filters:路由过滤器,处理请求或响应;**

application.yml 文件:

spring:
# 网关的配置
  gateway:
    routes: # 网关路由配置
    - id: userservice # 路由id,自定义,只要唯一即可
    # 方式一:路由的目标地址 http就是固定地址
    # uri: http://127.0.0.1:8081 
    # 方式二:lb就是负载均衡(load balancing),后面跟服务名称,表示对这个服务进行路由
    uri: lb://userservice 
    predicates: # 路由断言,也就是判断请求是否符合路由规则的条件,结果通常是真或假
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

Path=/user/ # 这个是按照路径匹配,只要以/user/开头就符合要求**


3.2,* 路由断言工厂的介绍:

  - **在我们配置文件中写的断言规则仅仅只是字符串,这些字符串必须经过Predicate Factory的处理,才能转变为路由判断的条件;**
  - **就如上述的**Path=/user/****是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来进行处理;**
  - **其中,像这样的断言工厂在SpringCloudGateway中还有十多种;**
  - **作用:读取用户定义的断言条件,对请求做出判断;**

3.2.1,Spring提供的11种基本的断言工厂:

  - **官方网站:**[https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#the-after-route-predicate-factory](https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#the-after-route-predicate-factory);到时候要用直接查;

image.png

常用:Path; RemoteAddr :被墙的原理;

4,* 路由过滤器工厂:(Gateway Filter)

4.1,什么是过滤器工厂:

  - **过滤器工厂是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做出处理:**
  - **流程如下:**
  - ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1652610956906-d82c6b26-ab19-40cb-8a0d-1707f476dcb7.png#clientId=uba5d6abe-1ef4-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=293&id=uab029141&margin=%5Bobject%20Object%5D&name=image.png&originHeight=293&originWidth=838&originalType=binary&ratio=1&rotation=0&showTitle=false&size=47515&status=done&style=none&taskId=u1921fe46-d4d9-455d-b47b-8ee9b81a41b&title=&width=838)