一.GateWay简介

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

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

二.项目现状

  • 具有两个微服务,一个是注册中心(registry),另一个是服务提供者(provider)
  • 服务提供者 - provider
  • 项目配置细节
server:
  port: 8081
spring:
  application:
    name: server-provider
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka    
  • 微服务提供的两个接口
@RestController
public class TsetController {

    @GetMapping("hello")
    public String hello(){
        return "Hello,我是provider";
    }

    @GetMapping("hi")
    public String hi(){
        return "hi,我是provider";
    }
}
  • 项目情况
    在这里插入图片描述

三.项目构建-gateway

Spring Cloud GateWay官方文档

  • POM文件
 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
  • 项目配置
server:
  port: 8088

spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  
 #是否与服务注册于发现组件进行结合,
 #设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。     
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka

四.运行项目

Hello,我是provider

hi,我是provider

  • 问题一:服务名需要大写才访问,是否可以通过小写服务名访问
    添加配置:spring.cloud.gateway.discovery.locator.lowerCaseServiceId:true即可
spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true              #是否与服务注册于发现组件进行结合,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
          lowerCaseServiceId: true   #该配置开启后,服务名可以小写

hi,我是provider

  • 问题二:是否可以自定义路由
      routes:
        - id: provider-routes       #路由名称:不重复即可
         uri: lb://SERVER-PROVIDER  #lb:从eureka中获取服务
          predicates:				#谓语:url包含provider
               - Path=/provider/**  
          filters:					#过滤器:过滤器从第一个之后开始截取
              - StripPrefix=1
  • 完成配置
spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true              #是否与服务注册于发现组件进行结合,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
          lowerCaseServiceId: true   #该配置开启后,服务名可以小写
      routes:
        - id: provider-routes
          uri: lb://SERVER-PROVIDER     #lb:从eureka中获取服务
          predicates:
            - Path=/provider/**
          filters:
            - StripPrefix=1
  • 访问provider项目的/hi接口

方式一:http://127.0.0.1:8088/server-provider/hi

方式二:http://127.0.0.1:8088/provider/hi

GitHub项目地址:https://github.com/oldgarlic/spring-cloud

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐