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日志并进行多维度分析。
目录
相关文章
|
6天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
18天前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
72 6
|
1月前
|
Java API 微服务
服务网关Gateway
该博客文章详细介绍了Spring Cloud Gateway的使用方法和概念。文章首先阐述了API网关在微服务架构中的重要性,解释了客户端直接与微服务通信可能带来的问题。接着,文章通过具体的示例代码,展示了如何在Spring Cloud Gateway中添加依赖、编写路由规则,并对路由规则中的基本概念如Route、Predicate和Filter进行了详细解释。最后,文章还提供了路由规则的测试方法。
服务网关Gateway
|
26天前
|
安全 API
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
|
26天前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
2月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
59 3
|
2月前
|
Java 微服务 Spring
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway自定义请求的 httpClient
112 3
|
1月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
本节针对微服务中另一重要组件:网关 进行了实战性演练,网关作为分布式架构中的重要中间件,不仅承担着路由分发(重点关注Path规则配置),同时可根据自身负载均衡策略,对多个注册服务实例进行均衡调用。本节我们借助GateWay实现的网关只是技术实现的方案之一,后续大家可能会接触像:Zuul、Kong等,其实现细节或有差异,但整体目标是一致的。
|
28天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
22天前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
167 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)