Gateway-网关

Gateway是啥玩意?


   说法一:gateway是springmvc之上构建api网关的库,提供了一种简单的方法,来路由API,为api提供横切关注点(安全性,监控,度量,弹性-可扩展性)

  说法二:为微服务架构提供一种简单而有效的统一API路由管理方式。Spring Cloud Gateway目标是替代zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关的基本功能,例如:安全,监控、埋点,限流等。

 

Gateway官方结构


   看起来有点想springmvc的访问流程,经过dispatcher分发到控制中心HandlerMapping,springmvc工作流程可以参考这位博主:https://www.cnblogs.com/hamawep789/p/10840774.html

 

 

 

Gateway职能


 1、请求接入:作为所有API接口服务请求的接入点

2、业务聚合:作为所有后端业务服务的聚合点,所有服务访问都从网关出发

3、中介策略:实现安全性、验证、路由、过滤、流量控制等策略

4、统一管理:对所有API服务和策略进行统一管理

 

Gateway重要概念


Route(路由):这是网关的基本,它是一个ID,一个目标URI一组断言和一组过滤器定义。如果断言为真,则路由匹配。

Predicate(断言):输入类型是一个ServerWeb。

FIlter(过滤器):Gateway中的Filter分为两种类型的Filter,分别是GatewayFilter和Global Fileter。过滤器Filter将会对请求和响应进行修改处理。

 gateway:
      routes:
      -  id: user_server
         #uri: http://localhost:9998/
         uri: lb://user9998   #这个是注册中心的服务名
         predicates:
           - Path=/user/**

 

Gateway最小案例


 开发流程:1、创建网关服务模块 

2、依赖配置,尽量和我的保持一致,参考前面创建项目的文档,这里注释了web依赖,添加版本管理、consul注册中心、健康检查、Gateway网关等依赖

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
<!--
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--consul注册中心的依赖 因为eureka2.0已经停止更新 所以就没有去用他-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!--这个包是用来健康监控的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--引入gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

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

</project>

3、这里需要修改一下配置文件名字,properties改成yum,为了同步官网的配置

server:
  port: 8989  #网关端口

spring:
  application:
    name: gateway   #consul注册名
  cloud:
    consul:
      host: localhost
      port: 8500    #把自己往consul注册中心扔
    gateway:
      routes:
      -  id: user_server
         uri: http://localhost:9998/
         #uri: lb://user9998   #这个是注册中心的服务名
         predicates:
           - Path=/user/**

      -  id: product_server   #自己给服务取的名字
         uri: http://localhost:9997/   #服务访问的地址
         #uri: lb://product9997   #从注册中心拿到该服务的名称
         predicates:  #断言
            - Path=/product/**

4、访问测试,启动项目出现错误,两篇博客:(1)https://blog.csdn.net/qq_44349459/article/details/113613868 (2)https://blog.csdn.net/qq_44349459/article/details/113613287

  a、网关测试user服务访问,先确定服务能够正常访问

 

  网关访问,这样看来没问题的

 

  b、网关测试product服务访问,先确定服务跑通

  网关测试,确定能够访问

 5、上述访问,在配置文件中都是把路径给定死了的,不能进行负载均衡访问,我们需要改一下yml中的配置,让访问从定死的连接变成consul注册中心的服务名。

 

总结


    任何访问路由route都要经过网关,网关进行统一管理交给openfeign进行负载均衡分发。也就是说,不管是直接访问user,还是user——>product,都是从gateway进行路由转发。

 


 

posted @ 2021-01-30 19:15  上天安排的最大嘛!  阅读(409)  评论(0编辑  收藏  举报