spring cloud gateway 简单实例

简介

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Netflix Zuul网关。网关作为流量入口,在微服务系统中有着非常重要的作用,网关常见的功能有路由转发、权限校验、限流控制等。

用户的请求首先经过gateway,根据路径由gateway的predict 去断言进到哪一个 router, router经过各种过滤器处理后,最后路由到具体的业务服务,如图:

gatewya1.png

核心概念

Route Predicate

Route Predicate负责路由匹配,Spring Cloud Gateway内置了许多Predicate,我们可以直接使用。

GatewayFilter

GatewayFilter路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应, 路由过滤器适用于特定路由。

Global Filters

Global Filters全局路由过滤器和GatewayFilter类似,不同的是它作用于所有路由。

核心处理流程

Spring Cloud Gateway 的核心处理流程如下,Gateway的客户端回向Spring Cloud Gateway发起请求,请求首先会被HttpWebHandlerAdapter进行提取组装成网关的上下文,然后网关的上下文会传递到DispatcherHandler。DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应RoutePredicateHandlerMapping(路由断言处理器映射器)。路由断言处理映射器主要用于路由的查找,以及找到路由后返回对应的FilteringWebHandler。FilteringWebHandler主要负责组装Filter链表并调用Filter执行一系列Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕后,将Response返回到Gateway客户端。

gateway.png

上代码

新建四个模块,工程目录结构如下:

image.png

新建spring父项目

新建maven项目,pom如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</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>

添加eureka模块

新建eureka service模块,pom如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

配置文件如下:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: eurka-server

添加两个server模块

新建eureka client模块,pom如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件如下:

server:
  port: 8762

spring:
  application:
    name: service-hi

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

添加服务:

    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String getPort(@RequestParam(value = "name") String name) {
        StringBuilder stringBuilder = new StringBuilder();
        Enumeration<String> headers = request.getHeaderNames();
        while (headers.hasMoreElements()) {
            String headName = headers.nextElement();
            stringBuilder.append(headName + ":" + request.getHeader(headName) + "<br/>");
        }

        return "Hi," + name + ",我的port是:" + port + ",<br/> header:<br/>" + stringBuilder.toString();

    }

访问地址http://localhost:8762/hi?name=randy,结果如图:

image.png

添加gateway模块

新建eureka client模块,pom如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

配置文件如下:

server:
  port: 8081

spring:
  application:
    name: sc-gateway-service
  cloud:
    gateway:
      actuator:
        verbose:
          enabled: true
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
        - id: path-route
          uri: lb://service-hi
          predicates:
            - Path=/demo/{segment}
          filters:
            - AddRequestHeader=GatewayFilter,myfilter
            - StripPrefix=1

访问http://localhost:8081/get,结果如图:

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容