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如下:

    
        org.springframework.boot
        spring-boot-starter-parent
        2.2.2.RELEASE
         
    

    
        1.8
        Hoxton.RELEASE
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

添加eureka模块

新建eureka service模块,pom如下:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server

配置文件如下:

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如下:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.boot
    spring-boot-starter-web

配置文件如下:

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 headers = request.getHeaderNames();
        while (headers.hasMoreElements()) {
            String headName = headers.nextElement();
            stringBuilder.append(headName + ":" + request.getHeader(headName) + "
"); } return "Hi," + name + ",我的port是:" + port + ",
header:
" + stringBuilder.toString(); }

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

image.png

添加gateway模块

新建eureka client模块,pom如下:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.cloud
    spring-cloud-starter-gateway

配置文件如下:

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

你可能感兴趣的:(spring cloud gateway 简单实例)