【七】GateWay网关组件

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

上篇:Feign远程调用组件

基本概念

网关的核心功能特性:
请求路由
权限控制
限流
架构图:

在这里插入图片描述
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

构建服务

  1. 新建module m-cloud-gateway-9002

在这里插入图片描述

  1. 导入依赖
   <!--eureka client 客户端依赖引入-->
        <!--spring boot ⽗启动器依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--GateWay ⽹关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--引⼊webflux-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!--⽇志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok⼯具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <!--引⼊Jaxb,开始-->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--引⼊Jaxb,结束-->
        <!-- Actuator可以帮助你监控和管理Spring Boot应⽤-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <!--spring cloud依赖版本管理-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!--编译插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <!--打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  1. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class McloudGateWay9002 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(McloudGateWay9002.class, args);
    }
}
  1. 配置文件application.yml
server:
  port: 9002

spring:
  application:
    name: m-cloud-eureka-server


#注册发现
eureka:
  client:
    service-url:
      defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    spring.application.name}:${
    
    server.port}:@project.version@

  1. 添加gateWay配置
spring:
  cloud:
    gateway:
      routes:
        - id: service-autodeliver-router  #路由 ID,保持唯一
          uri: lb://m-service-autodeliver # 目标服务地址  自动投递微服务(部署多实例)动态路由:
          predicates:  # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
            - Path=/autodeliver/**
        - id: service-resume-router
          uri: lb://m-service-resume
          predicates:
            - Path=/resume/**
#            filters:
#               - StripPrefix=1
  1. 启动访问http://localhost:9002/autodeliver/checkState/1545132
    在这里插入图片描述

核心概念。

Spring Cloud GateWay天⽣就是异步非阻塞的,基于Reactor模型
路由(route): 网关最基础的部分,也是网关比较基础的工作单元。路由由⼀个ID、⼀个⽬标
URL(最终路由到的地址)、⼀系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组
成。如果断言为true,则匹配该路由。
断言(predicates):参考了Java8中的断⾔java.util.function.Predicate,开发⼈员可以匹配Http
请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配⼀样),如果断
言与请求相匹配则路由。
在这里插入图片描述

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

GateWay动态路由详

  • pom.xml中添加注册中⼼客户端依赖(因为要获取注册中⼼服务列表,eureka客户端已经引⼊)
  • 动态路由配置
    在这里插入图片描述
    动态路由设置时,uri以 lb: //开头(lb代表从注册中⼼获取服务),后⾯是需要转发到的服务名

GateWay过滤器

从过滤器类型的⻆度,Spring Cloud GateWay的过滤器分为GateWayFilter和GlobalFilter两种

过滤器类型 影响范围
GateWayFilter 应⽤到单个路由路由上
GlobalFilter 应⽤到所有的路由上
如Gateway Filter可以去掉url中的占位后转发路由,⽐如
          predicates:
            - Path=/resume/**
            filters:
               - StripPrefix=1

GateWay高可用

可以启动多个GateWay实例来实现高可用,在GateWay的上游使⽤Nginx等负载均衡设备进行负载转发以达到高可用的目的

#配置多个GateWay实例
upstream gateway {
    
    
 server 127.0.0.1:9002;
 server 127.0.0.1:9003;
}
location / {
    
    
 proxy_pass http://gateway;
}

猜你喜欢

转载自blog.csdn.net/u014535922/article/details/129978827
今日推荐