spring cloud gateway微服务网关入门实战

1.概述

Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。

2.核心概念

网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等贡呢。一般来说网关对外暴露的URL或者接口信息,我们统称为路由信息。如果研发过网关中间件或者使用过Zuul的人,会知道网关的核心是Filter以及Filter Chain(Filter责任链)。Sprig Cloud Gateway也具有路由和Filter的概念。下面介绍一下Spring Cloud Gateway中几个重要的概念。

路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配

断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。

过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

快速入门

以Spring Boot框架开发为例,启动一个Gateway服务模块(以Eureka作为注册中心),一个后端服务模块。client端请求经gateway服务把请求路由到后端服务。

前提条件:

Spring bot:版本2.1.8。

Spring cloud:版本Greenwich.SR2。

1.微服务开发

这里以使用Spring Boot框架开发微服务为例,启动一个服务并注册到Eureka

引入依赖


        1.8
        Greenwich.SR2
    

    
        
            com.bosssoft.hr.train
            boss-bes-spring-boot-starter
            1.0-SNAPSHOT
            
                
                    org.springframework
                    spring-webmvc
                
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
                
                    tomcat-annotations-api
                    org.apache.tomcat
                
                
                    tomcat-embed-core
                    org.apache.tomcat.embed
                
            
        
        
            org.springframework.boot
            spring-boot-starter
            
                
                    ch.qos.logback
                    logback-classic
                
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
                
                    org.springframework
                    spring-webmvc
                
            
        
        
            org.springframework.boot
            spring-boot-starter-data-redis-reactive
        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
        
        
            com.auth0
            java-jwt
            3.1.0
        
        
            org.springframework.cloud
            spring-cloud-starter-config
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-starter-contract-stub-runner
            
                
                    spring-boot-starter-web
                    org.springframework.boot
                
            
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        










        
            org.projectlombok
            lombok
            1.16.20
            provided
        

        
            io.jsonwebtoken
            jjwt
            0.9.0
        
        
            org.springframework
            spring-webflux
            5.1.8.RELEASE
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.alibaba
            fastjson
            1.2.47
        
    

注册到eureka,配置文件:

server:
  port: 8766
eureka:
  instance:
    prefer-ip-address: true
    instance-id: 172.20.0.219:8765:cjf
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

配置路由转发、熔断、限流及重试:
两种方式,一种配置文件直接配置:

  cloud:
    gateway:
      ################################
      # 配置允许跨域请求
      ################################
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
      discovery:
        locator:
          enabled: true
      #    路由定义
      routes:
        - id: boss-bes-basedata
          uri: lb://boss-bes-basedata
          predicates:
            - Path=/boss/bes/basedata/**
          filters:
#            - StripPrefix=3
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/fallback
#            - name: RequestRateLimiter
#              args:
#                redis-rate-limiter.replenishRate: 10
#                redis-rate-limiter.burstCapacity: 20
#                key-resolver: "#{@userKeyResolver}"

另一种Bean加载:

/**
     * 认证微服务
     * @param builder 路由设置
     * @return RouteLocator
     */
    @Bean
    public RouteLocator routeLocatorPermission(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(AUTH_ROUTE_ID, r -> r.path(AUTH_ROUTE_PATH).and().readBody(Object.class, requestBody -> true)
                    .filters(f -> f.stripPrefix(0)
                            .hystrix(config -> config.setName("fallbackcmd").setFallbackUri("forward:/fallback"))
                            .requestRateLimiter(config -> config.setKeyResolver(ipKeyResolver))
                    )
                    .uri("lb://boss-bes-auth")
                )
                .build();
    }

你可能感兴趣的:(spring,cloud)