SpringCloud Gateway简单使用

news2024/11/16 3:21:29

前言

SpringCloud Gateway是一个网关框架,也是现在流行的的一个网关框架,它包括了过滤器、限流、权限、基本路由、整合Eureka 断言predicates 等功能,也会介绍和zuul这个框架的一个对比, Spring Cloud 生态系统中的网关,得力于 Spring Cloud 生态环境,我相信公司用Spring Cloud 框架 一般都会用到这个网关路由框架,因此这个是跑不掉,本篇文章介绍的一部分,当然不可能全部介绍,其他部分可以去官网去查找学习。

 

什么是网关

网关是一个服务,是访问内部系统的唯一入口,提供内部服务的路由中转,额外还可以在此基础上提供如身份验证、监控、负载均衡、限流、降级与应用检测等功能。

而为什么要说zuul, SpringCloud Gateway 本身就是替换zuul , zuul 本身开始闭源了, 而且还zuul1.x与zuul2.x  ;zuul1.x 基于 servlet  ,zuul2.x  是基于 servlet 和netty 的开发的。 注定 选定 SpringCloud Gateway   并且 它开发的比较晚,技术选型更好。

 这些性能都不是太高,而性能高的还是nginx+lua ,因为涉及到netty  来说  业务线程 去处理,响应式的,也会消耗业务线程,也会消耗性能。都是具体问题具体分析来说,技术选型也需要选择不同的方式;对于普通来说也不是相差特别大。

控制流

Nignx+lua (openresty kong)

业务逻辑 上的  这个  语言上的差异 导致 这个  控制流 处理非常快。

业务网关 收到请求 需要找服务  通过注册中心连接,负载 网关 以及 服务的负载量。 放弃单点的情况,使用 集群的情况。保证一致性 ,限流  要用redis   记录日志等功能,都是系统需要考虑的功能,大系统一定要考虑到的。

 像一般的网关io  吞吐量,请求数据,过网关,但返回数据是否过网关,这个东西根据吞吐量,来说一般会过网关,然后获取到客户端数据,然后返回,想lvs 这些会把客户端数据带给服务端,然后不过网关返回客户端数据,这种根据自己的需要选择。各有各的优点和缺点。

Spring Cloud Gateway 与 Zuul 对比

 zuul1.x与zuul2.x

Zuul 1.x 基于同步 IO

 

zuul2.x

基于异步io

 

zuul1.x 对比 zuul2.x 性能提升

 SpringCloud Gateway 使用

断言 predicates

多个断言可以配合使用

通过匹配的方式,访问到具体的路由规则,服务上面。

 

 在服务中配置  对应的  配置打到具体的机器上,

 包括多层匹配 ,当上面的匹配到才会到下面的匹配方式

 

path断言

        predicates:
        - Path=/mg/**

Query断言

参数值可以写正则,也可以只写参数名

  predicates:
        - Query=foo,ba.

Method断言

 

     predicates:
        - Method=get

Host断言

predicates:
        - Host=mashibing.com

Cookie断言

```
        predicates:
        - Cookie=name,yiming
```

基础使用上,比较简单的,按照具体的规则,写就可以了。

另向路由的方式,会话保持。这是cookie 的保持

 

 

基本路由

依赖

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

配置文件

spring:
  cloud:
    gateway:
      routes:
      - id: xxooroute
        uri: http://localhost:8080  
        filters:
        - StripPrefix=2


server:
  port: 80

 

整合Eureka

依赖

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

配置

```
spring:
  cloud:
    gateway:
      discovery:
        locator:
        // 开启从eureka 拉取服务列表  并自动映射
          enabled: true

  application:
    name: myGateWay
eureka:
  client:
    service-url:
      defaultZone: http://euk1.com:7002/eureka/


server:
  port: 80
```

 负载均衡

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true



      routes:
      - id: mdb
        predicates:
        - Path=/mangodb/**
        uri: lb://MDB
        filters:
        - StripPrefix=1


  application:
    name: myGateWay




eureka:
  client:
    service-url:
      defaultZone: http://euk1.com:7002/eureka/


server:
  port: 80

做匹配的规则,

自定义负载均衡

配置

 在代码中做匹配规则,

 

MDB:
  ribbon:
    NFLoadBalancerRuleClassName: com.admin.MyRule

 

package com.admin;

import java.util.List;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.Server;

public class MyRule extends AbstractLoadBalancerRule{

    @Override
    public Server choose(Object key) {
        // TODO Auto-generated method stub
        List<Server> list = this.getLoadBalancer().getReachableServers();


        System.out.println(list);
        // 各种逻辑~~~~
        System.out.println("xxoo");
        return list.get(0);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub

    }

}

参与到整个过滤规则。

 自定义路由

    @Bean
    public RouteLocator routeLocator (RouteLocatorBuilder locatorBuilder) {

        return locatorBuilder.routes()
                .route(p -> 
                    p.path("/xxoo")
                    .filters(f -> f.stripPrefix(1))
                    .uri("http://ss.com")
                        )

                .route(p ->

                    p.path("/go")
                    .filters(f -> f.stripPrefix(1))
                    .uri("lb://MDB")
                        )

                .build();
    }

自定义过滤器

package com.admin;

import java.util.List;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

@Component
public class MyFilter implements Ordered,GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        ServerHttpRequest request = exchange.getRequest();

        MultiValueMap<String, String> queryParams = request.getQueryParams();
        List<String> list = queryParams.get("id");

        if (null == list || list.size() ==0) {

            // 非法请求


//            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//            
//            return exchange.getResponse().setComplete();
            DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("xiake~!!".getBytes());

            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);

            return exchange.getResponse().writeWith(Mono.just(dataBuffer));

        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // TODO Auto-generated method stub
        return 0;
    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

243. 一个简单的整数问题2——差分+树状数组

给定一个长度为 N 的数列 A&#xff0c;以及 M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r d&#xff0c;表示把 A[l],A[l1],…,A[r] 都加上 d。 Q l r&#xff0c;表示询问数列中第 l∼r 个数的和。 对于每个询问&#xff0c;输出一个整数表示答案。 …

《爱与自由》豆瓣9.3优秀父母的必读书

《爰和自由》 关于作者 孙瑞雪&#xff0c;中国著名的幼儿教育家与心理学专家&#xff0c;"爱和自由、规则和平等”教育精神的 发起者和倡导者&#xff0c;中国系统引进实施国际蒙特梭利教育第一人&#xff0c;成功实践了科学教育法的本土化。她发展和延伸了蒙特梭利敏感…

Oh My Posh美化CMD、Anaconda Prompt解决方案

网上搜到的Oh My Posh安装配置都是针对power shell的&#xff08;我参考这篇成功配置了针对power shell的字体和主题&#xff09;。期间遇到了无法加载文件WindowsPowerShell\profile.ps1的问题&#xff0c;参考这篇解决。由于平时我用Anaconda比较多&#xff0c;而anaconda是基…

基于ARMR和白噪声特性模型及风速威布尔分布研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

PRISEMI芯导产品推荐 | 支持路径管理功能的3A单节锂离子电池充电IC——PSC2965

PRISEMI芯导产品推荐 | 支持路径管理功能的3A单节锂离子电池充电IC——PSC2965 随着便携式电子设备功能越来越多样化和整机性能的不断提升&#xff0c;整机功耗也在面临越来越大的挑战。最直接有效的方式就是提高电池的容量来提高整机的使用时长。为了不降低用户体验&#xff0…

C# 绘图基础

一 GDI技术简介 ① GDI&#xff1a;Graphics Device Interface. ② GDI&#xff1a;GDI的改进&#xff1b; ③ 是.NET框架结构的重要组成部分&#xff1b; ④ 和GDI一样它提供对二维图形图像的支持&#xff1b; 二 .NET 对GDI的封装 三 坐标系统 GDI的坐标系统&#xff1b; …

计算机毕业设计——简单的网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

基于粒子群优化算法的分布式电源优化调度实现配电网稳定运行(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WAYON维安提供新产品:新起点,新征程,DCDC炼成之路

WAYON维安提供新产品&#xff1a;新起点&#xff0c;新征程&#xff0c;DCDC炼成之路 新起点&#xff0c;新征程&#xff0c;DCDC炼成之路 随着新能源汽车、5G通信、工业4.0以及人工智能的快速发展&#xff0c;电源管理芯片的应用场景越来越丰富。同时传统行业&#xff0c;如网…

Day834.Dubbo如何用管程实现异步转同步 -Java 并发编程实战

Dubbo如何用管程实现异步转同步 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Dubbo如何用管程实现异步转同步的内容。 在很多并发场景下&#xff0c;支持多个条件变量能够让并发程序可读性更好&#xff0c;实现起来也更容易。例如&#xff0c;实现一个阻塞队列&a…

星火计划学习笔记——第八讲Apollo控制模块解析与实践2

文章目录1. Apollo控制框架介绍1.1 控制模块的功能和性能要求1.2 控制模块的总体框架1.3 控制模块的代码结构1.3.1 control -> common 中的主要程序1.3.2 control -> conf 中的主要程序1.3.3 control -> controller 中的主要程序1.3.4 control -> proto 中的主要程…

Android 各镜像文件img详解

Android编译后生成文件&#xff0c;在out/target/product/lime下&#xff1a; cache.img、cust.img、metadata.img、misc.img&#xff08;本地无&#xff09;、recovery.img、super.img、userdata.img、vbmeta.img、vbmeta_system.img&#xff08;仅测试适配工作&#xff0c;而…

Python处理Excel比Vba快100倍,媳妇连连夸赞今晚不用再跪搓衣板----python实战

最近经历了一次把vb脚本改造成python脚本&#xff0c;并获得性能提升数倍的过程&#xff0c;当然&#xff0c;这个过程也不是一帆风顺&#xff0c;中间也经历了一些波折&#xff0c;但是&#xff0c;也收获了一波新的认知。正好最近有时间&#xff0c;姑且写下来记录一下。 什…

水一篇,VB+python实现智能聊天机器人案例

1.分工 理论上单python也能写&#xff0c;但是做gui开发&#xff0c;python要用到thinter库/qt库&#xff0c;稍微麻烦一点。这个案例是python做json截取&#xff0c;VB做gui开发截取json字符。 2.准备工作 编写生成file_controlv2.dll并注册&#xff0c;编写speaker.vbs,准备…

java实现获取当前日期、农历、周

大家好&#xff0c;我是雄雄。 前言 大家先看下面的一段话&#xff1a; 今天是&#xff1a;2022年12月18日&#xff0c;星期日&#xff0c;农历十一月廿五&#xff0c;早安&#x1f31e;&#x1f31e;&#x1f31e; 1.讣告 | 我国著名眼科专家兰绪达在南昌逝世&#xff0c;享…

Linux 多线程(附带线程池代码加注释)

目录 01. Linux线程概念 01.1 什么是线程 01.1.1 轻量级进程ID与进程ID之间的区别 01.1.2 总结&#xff08;重点&#xff09; 01.2 线程的优点 01.3 线程的缺点 01.4 线程异常 01.5 线程用途 02. Linux进程VS线程 02.1 进程和线程 02.2 关于多线程和多进程编程 03…

Pytorch中的卷积与反卷积(conv2d和convTranspose2d)

卷积 卷积是特征提取的常用操作&#xff0c;卷积可以改变图片的通道和大小&#xff0c;相比全连接操作&#xff0c;卷积可以减少计算量&#xff0c;并且充分融合图像的局部特征。 import torch import torch.nn as nnx torch.randn(1,1,4,4) model nn.Conv2d(in_channels1,o…

Spring MVC学习 | 注解配置Spring MVC总结

文章目录一、注解配置Spring MVC1.1 初始化类1.2 Spring MVC配置类1.3 完整配置过程二、总结2.1 常用组件2.2 执行流程学习视频&#x1f3a5;&#xff1a;https://www.bilibili.com/video/BV1Ry4y1574R 一、注解配置Spring MVC 1.1 初始化类 &#x1f511;注解配置的原理 在…

非零基础自学Golang 第10章 错误处理 10.1 错误处理的方式 10.2 自定义错误

非零基础自学Golang 文章目录非零基础自学Golang第10章 错误处理10.1 错误处理的方式10.2 自定义错误10.2.1 错误类型10.2.2 创建错误10.2.3 自定义错误格式第10章 错误处理 我们在编写程序时&#xff0c;为了加强程序的健壮性&#xff0c;往往会考虑到对程序中可能出现的错误…

大数据必学Java基础(一百一十三):监听器概念引入

文章目录 监听器概念引入 一、什么是监听器? 二、监听器怎么分类?