浅谈Spring Cloud Gateway

news/2024/11/23 4:36:56/

网关:用户和微服务的桥梁

网关的核心是一组过滤器,按照先后顺序执行过滤操作。

Spring Cloud Gateway是基于webFlux框架实现,而webFlux框架底层则使用了高性能的Reactor模式通信框架的Netty

Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关,它基于Spring Framework 5,Spring Boot 2和Project Reactor等技术栈构建。它提供了一种简单而有效的方式来路由请求,以及对请求进行过滤和转换。

Spring Cloud Gateway的主要特点包括:

轻量级:Spring Cloud Gateway是一个轻量级的API网关,它可以快速启动和部署。

动态路由:Spring Cloud Gateway支持动态路由,可以根据请求的路径和参数将请求路由到不同的服务实例。

过滤器:Spring Cloud Gateway提供了一系列的过滤器,可以对请求进行过滤和转换,例如添加请求头、修改请求路径等。

集成性:Spring Cloud Gateway可以与Spring Cloud Config、Spring Cloud Discovery等组件集成,可以实现动态配置和服务发现。

响应式编程:Spring Cloud Gateway基于Project Reactor实现,可以实现响应式编程,提高系统的吞吐量和性能。

Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

Gateway Filter针对某一个路由filter对某一个接口做限流

Global Filter 针对全局的filter token ip黑名单

Spring Cloud Gateway快速入门

login-service

 

application.yml

server:port: 8081
spring:application:name: login-serviceeureka:client:service-url: #指定server注册地址defaultZone: http://localhost:8761/eurekaregister-with-eureka: truefetch-registry: trueregistry-fetch-interval-seconds: 5instance:hostname: localhostinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名+应用名+端口号

gateway-service

application.yml

server:port: 8089 #网关
spring:application:name: gateway-servicecloud:inetutils:ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'gateway:enabled: true #默认tureroutes:- id: login_service_routeuri: http://localhost:8081predicates:- Path=/doLogin  #匹配规则
eureka:client:service-url: #指定server注册地址defaultZone: http://localhost:8761/eurekaregister-with-eureka: truefetch-registry: trueregistry-fetch-interval-seconds: 5instance:hostname: localhostinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名+应用名+端口号

 

Gateway路由配置方式

eureka、gateway、configserver auth-server

静态路由

配置文件路由

官方提供代码配置

https://spring.io/projects/spring-cloud-gateway

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("login", r -> r.path("/doLogin").uri("http://localhost:8081")).route("bili", r -> r.path("/guochuang").uri("https://www.bilibili.com/")).build();}}

动态路由

需要添加eureka-client依赖

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

application.yml添加如下内容

discovery:locator:enabled: true #开启动态路由  通过应用名称 找到服务功能lower-case-service-id: true #开启服务名小写

login-service添加eureka-client

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

 

Gateway过滤器

过滤器生命周期分类

Pre在业务逻辑之前

Post在业务逻辑之后

过滤器种类分类

GatewayFilter 需要配置路由,才能过滤。如果需要使用全局路由,需要配置Default Filters

作用:1、记录接口访问次数 2.限流操作

globalFilter 针对全局 针对每个路由

作用:1、黑名单校验 2、全局token校验 3、参数校验

@Component
public class MGlobalFilter implements GlobalFilter, Ordered {

    /**
     * 过滤方法
     *
     * @param exchange
     * @param chain 放行
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        
        //获取请求响应,header url 参数
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        HttpHeaders headers = request.getHeaders();
        System.out.println("路径:"+path+" 请求头:"+headers);
        String name = request.getMethod().name();
        System.out.println(name);
        request.getRemoteAddress().getAddress();
        request.getRemoteAddress().getHostName();
        ServerHttpResponse response = exchange.getResponse();

        response.getHeaders().set("content-type","application/json;charset=utf-8");
        HashMap<String,Object> map =new HashMap<>(4);
        map.put("code", HttpStatus.UNAUTHORIZED.value());
        map.put("msg", "未授权登入");
        ObjectMapper objectMapper =new ObjectMapper();
        //把map转成字节
        byte[] bytes = new byte[0];
        try {
            bytes = objectMapper.writeValueAsBytes(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //通过buffer工资将字节数组包装成一个数据包
        DataBuffer wrap = response.bufferFactory().wrap(bytes);
        return  response.writeWith(Mono.just(wrap));

        //放行到下一个过滤器
        //return chain.filter(exchange);
    }

    /**
     * 指定顺序的方法
     * 越小优先级越大
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}


http://www.ppmy.cn/news/537832.html

相关文章

AC220V两档加热电路案例分析

在生活中&#xff0c;我们需要用到很多带有两档加热的小家电&#xff0c;例如:暖风机、吹风机、电暖扇等&#xff0c;在拆解荣事达的暖风机时&#xff0c;我们看到了这样的一种实现两档加热功能的电路。 首先我们先了解一下我们的市电AC 220V&#xff0c;我们的市电的波形其实是…

电机正反转的远程计算机控制,plc控制电机正反转原理图

plc控制电机正反转原理图 三相正反转的主电路和控制电路&#xff0c;以及与PLC控制系统的外部接线图和梯形图。 在图1是三相异步电动机正反转控制的主电路和继电器控制电路图&#xff0c;图2与3是功能与它相同的plc控制系统的外部接线图和梯形图&#xff0c;其中&#xff0c;KM…

电热水器技术性能指标

1、即热式和贮水式的选择 有使用安全、卫生、不受水压限制&#xff0c;随时可供热水&#xff0c;水温易调节等优点&#xff0c;在发达的西方国家已广泛地使用&#xff0c;即热式热水器体积小&#xff0c;不须预热&#xff0c;但功率大&#xff0c;通常在4-6kw以上&#xff0…

CST仿真指导 | 问题类型与求解器的选择

目录 前言1. Home > Problem Type2. 选择合适的求解器关注“电磁学社”&#xff0c;让电磁仿真不再复杂&#xff01; 前言 用户根据仿真目的与求解问题的类型&#xff0c;应该选择合适的Problem Type与Solver。当我们需要对已有模型进行其他类型的仿真求解时&#xff0c;无…

软件开源,航芯方案分享 | 全自动咖啡机设计方案

如今&#xff0c;随着人们生活节奏不断地加快&#xff0c;生活水平日益提高&#xff0c;咖啡作为世界上最流行的饮品之一&#xff0c;已然走进人们的日常生活&#xff0c;逐渐被越来越多的人所喜爱。随之而来的“咖啡机”也变得愈加流行。酿制一杯完美的咖啡&#xff0c;需要借…

车载电子 || 电池FPC连接片虚焊失效分析

案例背景 某车载电池充电异常&#xff0c;经初步分析是内部FPC连接板接触不良导致。连接板由FPC镍片SMD元件PI膜构成&#xff0c;如下图&#xff1a; 分析过程 X-Ray检测 通过X-RAY检测&#xff0c;可以明显辨别出Ni片与FPC焊盘之间存在虚焊不良。而且未虚焊的点位均存在较大…

电线 电流 和 断路器选择

电线&#xff0c;一般现在都用铜线。 1平方(毫米)的铜线&#xff0c;可承受最大的电流是13A&#xff0c;但是在设计时都按5A来算。 比如有个买了个1.5KW的热水器&#xff0c;电流15000/220V6.8A, 理论上用1平方的线够了&#xff0c;但是一般人都用2.5平方。我的理解是线粗点&a…

1行代码爬CSDN热榜,Python哈啤酒式写法

橡皮擦&#xff0c;一个逗趣的互联网高级网虫 项目背景 群友&#xff1a;擦姐&#xff0c;CSDN 热榜数据最少能用几行代码爬取&#xff1f; 擦姐&#xff1a;估计 10 行吧。 群友&#xff1a;oh baby&#xff0c;show me your code&#xff01; 项目的需求就是这么来的&#…