springcloud 入门 之网关 springcloud gateway(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: springcloud 入门 之网关 springcloud gateway

文章目录

项目版本

1、jdk:1.8

2、springboot 2.1.6.RELEASE ,springcloud Greenwich.SR6

前言

网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API ,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略( WAF )、防刷、流量、监控日志等功能。一般来说,网关对外暴露的 URL 或者接口信息,我们统称为路由信息。网关的核心是Filter 和 Filter Chain(过滤器链)

Spring Cloud Gateway 是什么

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,旨在取代Zuul网关。关于zuul可查看springcloud 入门(6) 网关 zuul

Spring Cloud Gateway是Spring Cloud官方基于Spring 5、Spring Boot 2 和 Project Reactor等技术开发的网关,旨在提供一种简单而有效的方式来路由到 API 并为它们提供交叉关注点,例如:安全性、监控/指标和弹性。

术语

路由(Route):网关的基本构建块。 它由 ID、目标 URI、断言集合和过滤器集合定义。 如果断言为真,则路由匹配成功。


断言(Predicate):Java 8 断言函数。 输入类型是 Spring 框架的ServerWebExchange。 可以匹配来自 HTTP 请求的任何内容,例如请求头或参数。


过滤器(Filter):使用特定工厂构建的 GatewayFilter 实例。 通过Filter可以在发送下游请求之前或之后修改请求和响应。

Spring Cloud Gateway 工作流程

流程图,来自官网

4.png

客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web Handler处理程序。此处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”类型过滤器逻辑,然后进行代理请求,发出代理请求后,将运行“post”类型过滤器逻辑。

入门示例

入门小样

**注意: 在没有端口的路由中 ,HTTP 和 HTTPS 默认的端口分别是80 和 443。 Spring Cloud Gateway 启动容器目前只支持netty

**

1、创建cloud-gateway springboot项目,引入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2、修改配置文件

添加日志和监控

server.port=7201
spring.application.name=CLOUD-GATEWAY
# 日志配置
logging.level.org.springframework.cloud.gateway=trace
logging.level.org.springframework.http.server.reactive=debug
logging.level.org.springframework.web.reactive=debug
logging.level.reactor.netty=debug
# actuator 监控 http://localhost:7201/actuator/gateway/routes
management.endpoints.web.exposure.include=*

3、配置路由信息

配置路由信息有两种方式:

3.1 通过配置类

@Configuration
public class RouteLocatorConfig {
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder locatorBuilder){
        final RouteLocatorBuilder.Builder routes = locatorBuilder.routes();
        routes.route(baidu-> baidu.path("/qq_39654841").uri("http://blog.csdn.net/").id("my_csdn_route"));
        return routes.build();
    }
}

3.2 在配置文件中配置

# 路由配置
spring.cloud.gateway.routes[0].id=my_csdn_route
spring.cloud.gateway.routes[0].uri=http://blog.csdn.net/
spring.cloud.gateway.routes[0].predicates[0]=Path=/qq_39654841

4、测试

不管选择哪种方式,访问http://localhost:7201/qq_39654841,会跳到https://blog.csdn.net/qq_39654841页面


前面引入了actuator,通过访问http://localhost:7201/actuator/gateway/routes可以看到所有路由信息

5.png

路由发现

Spring Cloud Gateway 路由发现规则在不同的注册中心也有所不同:

  • 如果把Gateway 注册到Eureka 上,通过网关转发服务调用,访问网关的URL是http://Gateway_HOST:Gateway_port/大写serviceld /*,其中服务名默认必须是大写,否则会抛404错误,如果服务名要用小写访问,可以在属性配置文件里面加spring.cloud .gateway.discovery .locator.lowerCaseServiceld =true配置解决。
  • 如果把Gateway 注册到Zookeeper 上,通过网关转发服务调用,服务名默认小写,因此不需要做任何处理。
  • 如果把Gateway 注册到Consul 上,通过网关转发服务调用,服务名默认小写,也不需要做人为修改。

路由发现示例

示例使用eureka作为注册中心,有关eureka可以查看 springcloud 入门(1) eureka注册中心

1、在cloud-gateway引入eureka依赖

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

2、修改cloud-gateway配置文件

添加eureka、日志配置

# 此客户端是否应该从eureka server 获取eureka注册信息
eureka.client.register-with-eureka=true
eureka.instance.instance-id=cloud-gateway
# 和eureka服务器通讯的URL
eureka.client.service-url.defaultZone=http://eurekaUser:eurekaUserPassword@localhost:8001/eureka
# 在地址栏上使用 IP 地址进行显示
eureka.instance.prefer-ip-address=true
# 设置心跳的时间间隔(默认是30秒)
eureka.instance.lease-renewal-interval-in-seconds=15
# eureka server 最后一次收到心跳时等待的时间,超时将会移除client(默认是90秒)
eureka.instance.lease-expiration-duration-in-seconds=90
# 日志配置
logging.level.org.springframework.cloud.gateway=debug
logging.level.org.springframework.http.server.reactive=debug
logging.level.org.springframework.web.reactive=debug
logging.level.reactor.netty=debug
# 是否与服务发现组件相结合,通过serviceId 转发到具体的实例
spring.cloud.gateway.discovery.locator.enabled=true
# 注册中心为eureka时,设置为true表示开启用小写的serviceId 进行服务路由的转发
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

eureka-server做了安全处理,可参考springcloud 入门(10) Spring Security 安全与权限 ,没有做处理的可以不用账号密码。

3、eureka-consumer在之前的基础上添加测试方法

@RequestMapping("/consumer/feign")
@RestController
public class FeignController {
    @GetMapping("/gateway/request")
    public String getRequest(HttpServletRequest request){
        final String header = request.getHeader("request-arg");
        System.out.println(header);
        return "request";
    }
}

4、测试

分别启动eureka-server、eureka-consumer、cloud-gateway

访问 http://localhost:7201/eureka-consumers/consumer/feign/gateway/request,出现下面页面成功调用eureka-consumer。

image.png

当Spring Cloud Gateway 注册到eureka时,会自动发现服务并生成默认的路由规则

可以通过cloud-gateway控制台发现

image.png

或者访问http://localhost:7201/actuator/gateway/routes

{
    "route_id": "CompositeDiscoveryClient_EUREKA-CONSUMERS",
    "route_definition": {
      "id": "CompositeDiscoveryClient_EUREKA-CONSUMERS",
      "predicates": [
        {
          "name": "Path",
          "args": {
            "pattern": "/eureka-consumers/**"
          }
        }
      ],
      "filters": [
        {
          "name": "RewritePath",
          "args": {
            "regexp": "/eureka-consumers/(?<remaining>.*)",
            "replacement": "/${remaining}"
          }
        }
      ],
      "uri": "lb://EUREKA-CONSUMERS",
      "order": 0
    },
    "order": 0
  },

如果把spring.cloud.gateway.discovery.locator.lower-case-service-id改成false

# 注册中心为eureka时,设置为true表示开启用小写的serviceId 进行服务路由的转发
spring.cloud.gateway.discovery.locator.lower-case-service-id=false

路由变成了大写的

{
    "route_id": "CompositeDiscoveryClient_EUREKA-CONSUMERS",
    "route_definition": {
      "id": "CompositeDiscoveryClient_EUREKA-CONSUMERS",
      "predicates": [
        {
          "name": "Path",
          "args": {
            "pattern": "/EUREKA-CONSUMERS/**"
          }
        }
      ],
      "filters": [
        {
          "name": "RewritePath",
          "args": {
            "regexp": "/EUREKA-CONSUMERS/(?<remaining>.*)",
            "replacement": "/${remaining}"
          }
        }
      ],
      "uri": "lb://EUREKA-CONSUMERS",
      "order": 0
    },
    "order": 0
  },

再访问 http://localhost:7201/eureka-consumers/consumer/feign/gateway/request,就会出现404页面

image.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
9天前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
112 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
10天前
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
28天前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
170 1
|
2月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
62 1
Gateway服务网关
|
2月前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
54 0
|
3月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
3月前
|
XML Java 数据格式
如何使用 Spring Cloud 实现网关
如何使用 Spring Cloud 实现网关
51 3
|
4月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
88 3
|
3月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
67 0
|
4月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway

热门文章

最新文章