当前位置: 首页 > news >正文

SpringBoot之Zuul服务

概述

Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤

目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记录/异常处理/单点登录引导功能本文主要内容:Zuul的执行流程、Zuul过滤实现、Zuul安全配置、Zuul路由配置、Zuul集成Hystrix、Zuul集成Zipkin与Sleuth

Zuul项目实战

Zuul执行流程

  • 接收请求
    • 客户端发送请求到Zuul服务器(前置经过Nginx反向代理)
  • Pre-filters
    • 请求首先通过Pre类型的过滤器,这些过滤器可以进行安全检查、身份验证、日志记录、选择路由等操作。
  • 路由转发Routing
    • 如果Pre-filter通过请求将被路由到具体的微服务实例上。Zuul 可以根据配置的路由规则将请求转发到不同的后端服务。
  • 服务调用
    • Zuul通过Fegin进行客户端负载均衡,选择一个服务实例进行调用
  • Post-filters
    • 服务处理完成后,响应会返回并经过 Post 类型的过滤器,这些过滤器可以修改返回的响应头、收集统计信息等。最终Zuul将响应发送回客户端
  • Error-filters
    • 如果在任何阶段发生错误,请求将被转发到 Error 类型的过滤器,进行错误处理后经过Post-filters,最终Zuul将响应发送回客户端

Zuul过滤器

网关过滤器
pre-filter

前置过滤器在请求被路由到源服务器之前执行,通常继承ZuulFilter抽象类。实际项目中我们使用前置过滤器对于400到500的状态错误码进行过滤,进而对于从cas认证服务中获取token的特定请求进行错误日志的记录

package test.gateway.filter;import org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException;
import test.common.util.R;
import com.google.gson.Gson;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;/*** @Description: 捕获400到500错误码,否则不执行该过滤器*/
public class ErrorStatusCodeZuulFilter extends ZuulFilter {protected static String GET_TOKEN_URI =  "/cas/getToken";@Overridepublic String filterType() {return "post";}@Overridepublic int filterOrder() {return -1; // Needs to run before SendResponseFilter which has filterOrder == 0}@Overridepublic boolean shouldFilter() {    		int statusCode = Integer.parseInt(RequestContext.getCurrentContext().get("responseStatusCode").toString());return statusCode >= 400 && statusCode <= 500;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();int statusCode = Integer.parseInt( ctx.get("responseStatusCode").toString());	String uri = ctx.get("requestURI").toString();if (uri != null && uri.equals(GET_TOKEN_URI)) { //获取token请求失败R<String>  res = new R<>();		res.setCode(statusCode);res.setData(null);res.setMsg("Account or password error");ctx.setResponseBody(new Gson().toJson(res));return null;}try {throw new Exception();} catch (Throwable t) {	    		throw new ZuulRuntimeException(new ZuulException(t, statusCode, t.getMessage()));}}
}
routing-filter

处理将请求发送到源服务器的逻辑

post-filter

后置过滤器在请求被路由后执行,可以对响应进行修改或添加额外的HTTP等。

error-filter

当请求处理过程中发生错误时,这些过滤器会被调用,同时最终也会调用后置post类型过滤器返回 

扩展-OncePerRequestFilter

OncePerRequestFilter是Spring Framework中的一个接口,它属于Servlet过滤器(Filter)的范畴,但不是Zuul中定义的特定过滤器类型。在Spring MVC中,OncePerRequestFilter确保每个请求只被处理一次。它通过同步代码块来保证,即使在支持异步处理的 Spring MVC 应用程序中,请求也不会被重复处理。项目中我们通过自定义过滤器(继承OncePerRequestFilter)处理访问公共接口且未携带token的请求,该过滤器也属于前置的过滤器,因为它通常用于在请求进入其他阶段之前执行某些操作。

Zuul安全配置

自定义WebSecurityConfig

在Spring Security的上下文中,WebSecurityConfig类通常用于配置Spring Security的安全策略。此类继承自WebSecurityConfigurerAdapter,WebSecurityConfig可以用来定义Zuul网关的安全设置,通过提供了一种自定义安全配置的方法实现,实际项目中我们对zuul进行的http请求相关安全配置

package test.zuul.config;
import .../*** @Description: Zuul http configuration*/
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // 定义Zuul网关的安全设置private final static Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class);@Autowiredprivate FilterIgnorePropertiesConfig filterIgnorePropertiesConfig;@Autowiredprivate FindByIndexNameSessionRepository<? extends Session> sessionRepository;@Autowiredprivate RedisOperationsSessionRepository redisOperationsSessionRepository; @Autowiredprivate AuthenticationServiceFeign authenticationService;@Overridepublic void configure(HttpSecurity http) throws Exception {http.csrf().disable(); //禁用csrfhttp.headers().frameOptions().disable();ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry =http.antMatcher("/**") // 允许所有请求.authorizeRequests();filterIgnorePropertiesConfig.getUrls().forEach(url -> registry.antMatchers(url).permitAll());registry.anyRequest().authenticated();http.exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login/idpbg"))	        .and().logout().logoutUrl("/logout").addLogoutHandler(new LogoutHandler() { //登出后处理逻辑@Overridepublic void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {					if(authentication != null) {String indexName = authentication.getName();// 查询用户的 Session 信息      Map<String, ? extends Session> userSessions = sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, indexName);// 删除当前用户相关sessionList<String> sessionIds = new ArrayList<>(userSessions.keySet());for (String session : sessionIds) {redisOperationsSessionRepository.deleteById(session);}//删除系统当前在线用户信息...}Cookie cookie = new Cookie();//重置cookie...response.addCookie(cookie);}}).logoutSuccessHandler(logoutSuccessHandler()).oauth2Login().and().oauth2Client();	}private LogoutSuccessHandler logoutSuccessHandler() { //登出成功后处理逻辑return new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)throws IOException, ServletException {if(authentication != null) {if(authentication.getDetails() instanceof OAuth2AuthenticationDetails) {// 刪除JWT......}}new SecurityContextLogoutHandler().logout(request, null, null);try {response.sendRedirect("/"); //重定向到登录页面}} catch (IOException e) {e.printStackTrace();}}};}
}

Zuul-路由规则

  # 默认情况下所有的eureka上的服务都会被zuul自动地创建映射关系来进行路由,# 设置ignored-services: '*' 时,避免注册到Eureka中的服务被Zuul默认路由,从而避免不必要的服务暴露ignored-services: '*' routes:# CAS 路由配置cas-server:sensitiveHeaders: path: /cas/**serviceId: cas-serverstrip-prefix: false #表示Zuul不会移除请求的URI路径前面的/cas/部分# END CAS路由配置..其他服务路由配置..

Zuul-熔断

在项目开发Zuul服务时,通常会集成Hystrix,并通过HystrixH对依赖的微服务进行熔断保护,防止单个服务的故障影响到整个系统

hystrix:command:default:execution:isolation:thread:# hystrix超时时间计算方法 = ribbonTimeout(ReadTimeout + ConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1)#  timeoutInMilliseconds = (600000 + 600000) * 1 * 2timeoutInMilliseconds: 2400000# 仅正式局配置Threadpool参数threadpool:default:coreSize: 50maximumSize: 10000allowMaximumSizeToDivergeFromCoreSize: truemaxQueueSize: -1ribbon:  # Zuul 如果使用 Eureka查找路由,则需要配置ConnectTimeout和SocketTimeoutConnectTimeout: 600000 # 6min,由于通过网关存在下载/导报表服务,此类需求建立连接耗时比较长,所以设置为6minSocketTimeout: 600000 # 6min,由于通过网关存在下载/导报表服务,此类需求建立连接耗时比较长,所以设置为6minReadTimeout: 600000  # 6min,由于通过网关存在下载/导报表服务,此类需求建立连接耗时比较长,所以设置为6minMaxAutoRetries: 0MaxAutoRetriesNextServer: 1 #下一个服务调用自动重试次数MaxTotalConnections: 400  # okhttp模式下最大连接数量eureka:enabled: true #通过Eureka路由到具体微服务httpclient:enabled: falseokhttp:  #use okhttp will betterenabled: truefeign: httpclinet: #use okhttp will betterenabled: falseokhttp: enabled: true 

Zuul-Zipkin与Sleuth

Sleuth是Spring Cloud的一个组件,用于在微服务架构中提供分布式跟踪解决方案。Sleuth通常与Zipkin等分布式跟踪系统配合使用,可以生成请求链路的跟踪信息,帮助开发者理解请求在系统中流动的路径,从而优化性能和定位问题,项目中我们在application.yml文件配置:

 zipkin:#base-url: http://10.169.33.369/  # Zipkin Server URL, 仅当spring.zipkin.sender.type=web才需要设置,基于消息服务则不需要设置enabled: true # 启用Zipkin,默认truesender:type: rabbit  #  微服務基于消息服务发送 Zipkin Data到Zipkin Serverrabbitmq:queue: zipkin  # 对应RabbitMq的队列名,仅当spring.zipkin.sender.type=rabbit时有效,默认配置为zipkinsleuth:web:client:enabled: true  # 对于web请求,是否开启sleuth功能。默认为true。sampler:probability: 0.1 # 1.0即100%收集 默认0.1

相关文章:

SpringBoot之Zuul服务

概述 Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤。 目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记…...

Go-变量

可以理解为一个昵称 以后这个昵称就代指这些信息 var sg string "czy" 声明赋值 package mainimport "fmt"func main() {var sg string "陈政洋"fmt.Println(sg)var age int 73fmt.Println(age)var flag bool truefmt.Println(flag) } …...

【CTF-Crypto】RSA-选择明密文攻击 一文通

RSA&#xff1a;选择明密文攻击 关于选择明/密文攻击&#xff0c;其实这一般是打一套组合拳的&#xff0c;在网上找到了利用的思路&#xff0c;感觉下面这个题目是真正将这个问题实现了&#xff0c;所以还是非常棒的一道题&#xff0c;下面先了解一下该知识点&#xff1a;(来自…...

Pytorch基础:torch.expand() 和 torch.repeat()

在torch中&#xff0c;如果要改变某一个tensor的维度&#xff0c;可以利用view、expand、repeat、transpose和permute等方法&#xff0c;这里对这些方法的一些容易混淆的地方做个总结。 expand和repeat函数是pytorch中常用于进行张量数据复制和维度扩展的函数&#xff0c;但其…...

如何正确安装Scrapy 2.6.1并解决常见的Python环境问题

在配置Python环境和安装包时&#xff0c;常常会遇到版本冲突和路径问题&#xff0c;特别是当系统中存在多个Python版本时。本文将指导你如何在CentOS系统中正确使用pip3安装Scrapy 2.6.1&#xff0c;并解决一些常见的环境问题。 步骤1: 确认和升级 pip3 确认 pip3 的版本&…...

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…...

关于模型参数融合的思考

模型参数融合通常指的是在训练过程中或训练完成后将不同模型的参数以某种方式结合起来&#xff0c;以期望得到更好的性能。这种融合可以在不同的层面上进行&#xff0c;例如在神经网络的不同层之间&#xff0c;或者是在完全不同的模型之间。模型参数融合的目的是结合不同模型的…...

Windows MySQL本地服务器设置并导入数据库和数据

文章目录 小结问题及解决导出数据库Windows MySQL本地服务器设置导入数据库和数据 参考 小结 最近需要在本地Windows环境中设置MySQL服务器&#xff0c;并导入数据库和数据&#xff0c;记录过程。 问题及解决 导出数据库 首先需要导出数据库&#xff1a; C:\mysql-8.0.37-…...

豪投巨资,澳大利亚在追逐海市蜃楼吗?

澳大利亚政府正在积极投资于量子计算领域。继2021年向量子技术投资逾1亿澳元后&#xff0c;2023年5月&#xff0c;该国发布了首个国家量子战略&#xff0c;详细阐述了如何把握量子技术的未来及保持全球领先地位。 澳大利亚的国家量子战略概述 原文链接&#xff1a; https://ww…...

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…...

05_kafka-整合springboot

文章目录 kafka 整合 springboot pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version> </parent> <dependencies>&…...

论UML在学情精准测评系统中的应用

摘要简介 项目背景&#xff1a; 随着教育改革的不断深入&#xff0c;对学生学情的精准测评成为教育教学工作中的重要环节。为了解决传统学情测评方式主观性强、效率低、反馈不及时等问题&#xff0c;我们团队受教育主管部门委托&#xff0c;承担了中小学学情精准测评系统&…...

Day23 代码随想录打卡|字符串篇---重复的子字符串

题目&#xff08;leecode T459&#xff09;&#xff1a; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。fang 移动匹配。分析可以由自己的子串构成的字符串&#xff0c;肯…...

【win10 文件夹数量和看到不一致查看隐藏文件已经打开,Thumb文件作妖】

目录 任务介绍&#xff1a;重命名规则修改前修改后 实现思路VB代码实现BUG犯罪现场&#xff08;眼见不一定为实&#xff09;破案1&#xff1a;抓顶风作案的反贼&#xff01;&#xff01;&#xff01;破案2&#xff1a;破隐身抓刺客&#xff01;&#xff01;&#xff01;杀器&am…...

ctfshow web入门 sql注入 web224--web233

web224 扫描后台&#xff0c;发现robots.txt&#xff0c;访问发现/pwdreset.php &#xff0c;再访问可以重置密码 &#xff0c;登录之后发现上传文件 检查发现没有限制诶 上传txt,png,zip发现文件错误了 后面知道群里有个文件能上传 <? _$GET[1]_?>就是0x3c3f3d60245…...

「Java开发指南」如何用MyEclipse搭建GWT 2.1和Spring?(一)

本教程将指导您如何生成一个可运行的Google Web Toolkit (GWT) 2.1和Spring应用程序&#xff0c;该应用程序为域模型实现了CRUD应用程序模式。在本教程中&#xff0c;您将学习如何&#xff1a; 安装Google Eclipse插件为GWT配置一个项目搭建从数据库表到一个现有的项目GWT编译…...

python同时进行字符串的多种替换

一些常见的方法&#xff1a; 使用str.replace()方法&#xff1a;这是一种简单的方法&#xff0c;但是如果你有多个替换需要进行&#xff0c;可能会变得很繁琐。 text "This is a sample text with some words." text text.replace("sample", "exa…...

【Java基础题型】用筛法求之N内的素数(老题型)

输入格式 N输出格式 0&#xff5e;N的素数样例输入 100样例输出 2 3 5 7 11 13 17 19 23 29 31 37 老朋友素数了属于是&#xff01; 方法1&#xff1a;(穷举法) 通过遍历 i 的所有除数&#xff0c;如果除以除数后商变成了0&#xff0c;那么把布尔值变成假的。表示不是素数 【…...

Linux进程——Linux环境变量

前言&#xff1a;在结束完上一篇的命令行参数时&#xff0c;我们简单的了解了一下Linux中的环境变量PATH&#xff0c;而环境变量不只有PATH&#xff0c;关于更多环境变量的知识我们将在本篇展开&#xff01; 本篇主要内容&#xff1a; 常见的环境变量 获取环境变量的三种方式 本…...

SRM系统供应链库存协同提升企业服务水平

SRM系统供应链库存协同是一种以提高供应链整体效率和竞争力为目标的管理方法。它涉及到企业与供应商之间的紧密合作&#xff0c;以实现库存优化、成本降低、风险分担和灵活响应市场变化等目标。 一、SRM供应链库存协同的概念和特点 SRM供应链库存协同是指企业与供应商之间通过…...

Windows安全加固-账号与口令管理

在当今日益增长的网络安全威胁中&#xff0c;Windows系统的安全加固显得尤为重要。其中&#xff0c;账号与口令管理作为系统安全的第一道防线&#xff0c;其重要性不言而喻。本文将深入探讨Windows安全加固中的账号与口令管理策略&#xff0c;以确保系统的安全性和稳定性。 账…...

【数据库原理及应用】期末复习汇总高校期末真题试卷03

试卷 一、选择题 1 数据库中存储的基本对象是_____。 A 数字 B 记录 C 元组 D 数据 2 下列不属于数据库管理系统主要功能的是_____。 A 数据定义 B 数据组织、存储和管理 C 数据模型转化 D 数据操纵 3 下列不属于数据模型要素的是______。 A 数据结构 B 数据字典 C 数据操作 D…...

数据库加密数据模糊匹配查询技术方案

文章目录 前言沙雕方案内存加载解密密文映射表 常规做法实现数据库加密算法参考 分词组合加密&#xff08;推荐&#xff09; 超神方案总结个人简介 前言 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下&#xff0c;如何…...

jsSPA应用如何实现动态内容更新

JS SPA&#xff08;单页面应用&#xff09;应用的原理、优势以及例子如下&#xff1a; 原理&#xff1a; SPA应用的核心原理在于&#xff0c;它使用JavaScript动态地创建和更新DOM结构&#xff0c;而非通过传统的多页面跳转来呈现内容。当用户与应用程序交互时&#xff0c;SP…...

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…...

python 中如何匹配字符串

python 中如何匹配字符串&#xff1f; 1. re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 import re line"this hdr-biz 123 model server 456" patternr"123" matchObj re.matc…...

Windows 系统运维常用命令

目标&#xff1a;通过本文可以快速实现windows 网络问题定位。 ipconfig:查看本机网络配置情况 C:\Users\zzg>ipconfigWindows IP 配置以太网适配器 以太网:媒体状态 . . . . . . . . . . . . : 媒体已断开连接连接特定的 DNS 后缀 . . . . . . . :无线局域网适配器 本地…...

Springboot监听ConfigMap配置文件自动更新配置

背景&#xff1a; 最近调研使用k8s的ConfigMap来作为springboot项目的配置中心&#xff0c;需要实现热更新机制&#xff0c;避免pod重启影响业务。 ConfigMap作为挂载卷使用的时候可以更新pod中的配置内容&#xff0c;但是业务应用需要能监听并处理这些变更。我在测试的时候已…...

API安全机制

API安全机制包括两部分&#xff1a;数字签名、敏感信息加密。 一、数字签名 服务端使用客户端的消息签名验证客户端的身份。如果一个请求不包含签名或者签名验证失败&#xff0c;服务端将返回身份验证错误。它背后的技术是&#xff1a;数字签名技术。 1、待签参数准备 待签…...

接口性能测试 —— Jmeter并发与持续性压测!

接口压测的方式&#xff1a; 1、同时并发&#xff1a;设置线程组、执行时间、循环次数&#xff0c;这种方式可以控制接口请求的次数 2、持续压测&#xff1a;设置线程组、循环次数&#xff0c;勾选“永远”&#xff0c;调度器&#xff08;持续时间&#xff09;&#xff0c;这种…...

wordpress竞价单页/百度大搜推广

作者&#xff5c;王益、李响、张磊 编辑&#xff5c;木环 本月初&#xff0c;Kubernetes在其官网上宣布了百度的PaddlePaddle成为目前唯一官方支持Kubernetes的深度学习框架。PaddlePaddle是百度于2016年9月开源的一款深度学习平台&#xff0c;具有易用&#xff0c;高效&#x…...

西安做网站的公司电话/深圳优化公司哪家好

同步发表&#xff1a;http://blog.hacktons.cn/2017/12/13/shell-func-return/ 背景 通过shell编程&#xff0c;写一些工具批处理的时候&#xff0c;经常需要自定义函数。更复杂点的情况下&#xff0c;可能有需要返回一个值。 由于在shell的世界中&#xff0c;并不像其他编程语…...

企业标志logo/seo课堂

目录 一、String 对象 1、属性 2、常用方法 二、Array 对象 1、属性 2、常用方法 三、Date 日期对象 1、创建 Date 日期对象 2、常用方法 四、Math 对象 一、String 对象 1、属性 length&#xff1a;表示字符串的长度 2、常用方法 【1】与 HTML 相关的方法 bold(…...

网站开发移动端多少钱/网站平台如何推广

帧中继&#xff08; Frame Relay&#xff09;是一种用于连接计算机系统的面向分组的通信方法。它主要用在公共或专用网上的局域网互联以及广域网连接。大多数公共电信局都提供帧中继服务&#xff0c;把它作为建立高性能的虚拟广域连接的一种途径。1.实验器材3台思科路由器 3台…...

广州天河网站建设/私人做网站

后端统计函数 函数 返回类型描述pg_stat_get_backend_idset()int设置当前活动的后端ID号pg_stat_get_backend_activity(interger)text后端最近查询文本pg_stat_get_backend_activity_start(interger)timestamp with time zone最近查询开始时间pg_stat_get_backend_client…...

国企门户网站建设情况汇报/公司个人怎么做网络推广

分层组织计算机存储系统由高层到低层分别名之寄存器堆、高速缓存(cache)、主存(main memory)和外存(secondary memory)。那么为什么记忆系统要层次化呢?如果答案是效率&#xff0c;那么提效的原理又是什么呢?如果原理是传说中的局部性原理(principle of locality)&#xff0c…...