SpringCloud中网关-详解、案例(代码)

2024-04-28 10:44

本文主要是介绍SpringCloud中网关-详解、案例(代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:在Spring Cloud中,网关的角色是非常重要的,它负责整个系统的入口流量,并且可以处理路由、过滤、协议转换等操作

目录

1、网关的技术实现

1.1 网关功能

1.2 网关的形式

2、网关实现步骤

2.1 添加相关依赖

2.2 创建此module的main()方法,用来启动此服务

3、路由过滤器

3.1 路由断言工厂

4.1 路由过滤工厂

4.2 全局过滤器

4.3 跨域问题处理

4、总结


1、网关的技术实现

1.1 网关功能

图 1.1-1 网关功能

上图中展示的便是网关的作用:

  • 身份认证和权限校验:对不同的登录用户校验身份,确定有那些访问权限
  • 服务路由、负载均衡:确定登录的用户访问那些服务,从而调用空闲的服务
  • 请求限流:当访问量过多,就限制用户登录或者让用户等待

1.2 网关的形式

图 1.2-1 网关的两种形式

2、网关实现步骤

2.1 添加相关依赖

图 2.1-1 添加相关依赖

上图中展示的是搭建网关的第一步:

  • 在项目中创建一个新的模块
  • 在新模块pom文件中添加依赖

2.2 创建此module的main()方法,用来启动此服务

图 2.2-1 创建此module的main()方法
上图中展示的是在当前项目中创建一个 gateway 模块而且创建此模块的main()方法,用来启动此服务

3、路由过滤器

3.1 路由断言工厂

图 3.1-1 路由断言工厂
  • 我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的
  • 像这样的断言工厂在SpringCloudGateway还有十几个

4.1 路由过滤工厂

图 4.1-1 路由过滤工厂

上图中展示的便是路由过滤工厂的常见过滤器

4.2 全局过滤器

package cn.itcast.gateway;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** 全局过滤器*/
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> map = request.getQueryParams();// 2.获取authorization参数String authorizeFilter = map.getFirst("authorizeFilter");// 3.校验if ("admin".equals(authorizeFilter)){// 4.校验成功,放行Mono<Void> mono = chain.filter(exchange);return mono;}// 5.校验失败,结束处理exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}// 设置全局过滤器的执行顺序,数字越小越先执行@Overridepublic int getOrder() {return -1;}
}

4.3 跨域问题处理

图 4.3-1 跨域问题处理
上图展示的便是处理跨域问题的方法,即在网关微服务的配置文件中,添加如上对应配置(参数要根据开发情况做出调整)

4、总结

这篇关于SpringCloud中网关-详解、案例(代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943028

相关文章

JavaScript事件绑定与删除

//添加事件 function addEvent(obj, type, handle){try {obj.addEventListener(type, handle, false);} catch (e){try {obj.attachEvent('on' + type, handle);} catch (e){obj['on' + type] = handle;}}} //移除事件

chrome通过file协议浏览html代码时,发送的ajax请求本地文件,会报跨域错误

XMLHttpRequest cannot loadfile:///E:/webs/extJS/ext-3.3.0/examples/csdn/combobox.txt?_dc=1414738973999.Cross origin requests are only supported for protocol schemes: http, data,chrome-extension, http

SpringBoot基于Fly社区模板开源博客项目

1、官网地址 官网演示地址https://fly.layui.com/模板下载地址:https://www.layui.com/template/fly/详细开发文档:https://www.sunnyblog.top/index.html?typeId=1260457825721647104 2、技术栈 开发工具 Idea数据库设计 PowerDesignJDK版本 Java8数据库 My

javascript实现页面的重新加载和页面的刷新

1、reload 方法,该方法强迫浏览器刷新当前页面。 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5(“刷新”) 2、 replace 方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用

Spring定时任务的配置

近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍。 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方

k8s环境部署的集成arthas-spring-boot-starter spingboot项目无法访问控制台

前言 k8s环境部署的集成arthas-spring-boot-starter项目无法访问控制台,springboot项目集成arthas-spring-boot-starter 会自带个控制台 供我们访问 但是当使用k8s环境部署后 这个页面就无法访问了 分析 首先看下arthas对应的配置 arthas-spring-boot-starter 中配置类 见 com.alibaba.art

谈谈对Java中死锁和活锁的理解

在Java中,并发编程是一个重要的主题,但同时也是复杂的,因为它涉及到多个线程共享资源的情况。在这种情况下,可能会遇到多种同步问题,其中最常见的是死锁(Deadlock)和活锁(Livelock)。 死锁(Deadlock) 定义:死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法向前推进。 产生原因: 互斥条件:一个资源每

JVM 加载 Class 文件的原理机制

Class 文件      Java中的Class文件是编译后的Java源代码文件,它包含了Java程序的字节码指令,也就是实际的执行代码。Class文件是Java程序的中间文件,可以被Java虚拟机(JVM)加载和执行。在编译Java源代码时,Java编译器将源代码转换为字节码指令,然后将其保存为一个或多个以.class为后缀的Class文件。这些Class文件包含了类、接口、方法、字段等信

Python字符串操作方法详解

python 字符串常用方法 创建字符串:s = "Hello, World!" 字符串索引和切片 # 索引和切片 print(s[0]) # 输出: H (索引第一个字符) print(s[7]) # 输出: , (索引第八个字符) print(s[1:5]) # 输出: ell (切片从索引1到4的子串) find() 和 index():查找子串在字符串中

JavaScript模块化编程思想演变

JavaScript模块化编程思想演变 对大型的网站来说,模块化编程非常重要。因为越是大型的网站,文件命名冲突、文件依赖程度都非常高,故而引入模块化思想。 下面我从大家经常写代码的习惯来引。 第一种常见写法 全局函数形式 这种形式,各种变量,函数都将暴露在全局环境下,代码示例如下: <script> var a = 1 ,b = 2 ; // 等各种全局变量// 各种函数声明fu