在Spring Cloud中使用Zuul网关实现一个案例

本篇依旧是在Spring Cloud系列的博主已经搭建的Spring Cloud微服务模块上进行的,注意,本文依旧适合初学者和或者在Spring Cloud框架了解不是很深入的基础的开发者,本系列说不上有多高大上,博主坚持通过简单的案例,让开发者可以对Spring Cloud的组件进行了解和使用,并在一定程度上介绍这些组件在开发中充当什么样的成分。

依旧是回顾我们在搭建Zuul模块的时候的知识点。

Zuul网关是什么?
Zuul是Spring Cloud提供的一种基于JVM的动态路由和服务网关解决方案。它可以作为微服务架构中的入口点,用于路由和过滤请求,实现负载均衡、认证、授权、监控等功能。

  • 动态路由:Zuul可以根据配置的路由规则将请求动态路由到不同的后端服务。
  • 过滤器:Zuul提供了过滤器机制,可以在请求的不同生命周期中执行自定义逻辑,例如身份验证、请求日志记录等。
  • 负载均衡:Zuul集成了Ribbon负载均衡器,可以实现请求的负载均衡。
  • 容错机制:Zuul通过Hystrix实现了容错机制,可以在后端服务不可用时提供服务降级和熔断功能。
  • 监控和追踪:Zuul可以与Spring Cloud Sleuth和Zipkin等组件集成,提供请求的监控和追踪功能。

那么我们开始围绕我们的Zuul进行,首先我们创建一个名为ZuulFilter的过滤器类,用于实现自定义的请求过滤逻辑。你可以根据需要实现ZuulFilterrun()方法。我仅仅就是提供一个demo,方便我们在开发中进行改写。

目录结构:
在这里插入图片描述

hystrix模块:作为服务名字Application.name就是代表我们的服务名字
在这里插入图片描述

@Component
public class CustomFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre"; // 过滤器类型,可以是pre、route、post、error}@Overridepublic int filterOrder() {return 1; // 过滤器执行顺序,数值越小越先执行}@Overridepublic boolean shouldFilter() {return true; // 是否启用该过滤器}@Overridepublic Object run() {// 过滤器逻辑RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();System.out.println("Request Method : " + request.getMethod() + " Request URL : " + request.getRequestURL().toString());return null;}
}
server:port: 2379
spring:application:name: zuul-demo#路由前缀
zuul:prefix: /apiroutes:hystrix-demo:path: /api/**serviceId: hystrix-demo# eureka客户端注册到Eureka注册中心,切记需要启动eureka服务
eureka:client:service-url:defaultZone: http://localhost:1000/eureka

在这里插入图片描述
配置完毕后,我们去前端执行一下:

http://localhost:2379/api/hystrix-demo

对照一下,我们发现出现了两次,这是因为我触发了两次。

2023-12-19 20:24:44.036  INFO 10376 --- [nio-2379-exec-3] o.apache.tomcat.util.http.parser.Cookie  : A cookie header was received [1691633835; NMTID=00OfgHFpVoe_XqS7E1MrMltkHSaK-8AAAGKqC2m5Q; Hm_lvt_fadc1bd5db1a1d6f581df60a1807f8ab=1699003649,1699405659] that contained an invalid cookie. That cookie will be ignored.Note: further occurrences of this error will be logged at DEBUG level.
Request Method : GET Request URL : http://localhost:2379/api/hystrix-demo
2023-12-19 20:24:44.118  INFO 10376 --- [nio-2379-exec-3] c.netflix.config.ChainedDynamicProperty  : Flipping property: hystrix-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-12-19 20:24:44.132  INFO 10376 --- [nio-2379-exec-3] c.n.u.concurrent.ShutdownEnabledTimer    : Shutdown hook installed for: NFLoadBalancer-PingTimer-hystrix-demo
2023-12-19 20:24:44.133  INFO 10376 --- [nio-2379-exec-3] c.netflix.loadbalancer.BaseLoadBalancer  : Client: hystrix-demo instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=hystrix-demo,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2023-12-19 20:24:44.136  INFO 10376 --- [nio-2379-exec-3] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2023-12-19 20:24:44.146  INFO 10376 --- [nio-2379-exec-3] c.netflix.config.ChainedDynamicProperty  : Flipping property: hystrix-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-12-19 20:24:44.148  INFO 10376 --- [nio-2379-exec-3] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client hystrix-demo initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=hystrix-demo,current list of Servers=[danfoo:2383],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:danfoo:2383;	Zone:defaultZone;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@359a4984

在这里插入图片描述

这就是一个简单的Zuul网关实现案例了。你可以根据实际需求进行更复杂的配置和修改,反正其实在zuul中,我们就采用此种方式进行相关配置。

提及一下,你可能看到我

在这里插入图片描述

这里我介绍一下:这个配置主要是围绕:
zuul.routes.user-service.path=/user-service/**

zuul.routes.user-service.url=http://localhost:8080/

以上的user-service就是我写的hystrix-demo,这个代表你需要指向的路由服务名称,或者说我们可以改写成:
zuul.routes.<route>.pathzuul.routes.<route>.url

这样配置主要是围绕对符号/user-service/**规则的请求路径转发到http://localhost:端口号/地址的路由规则,比如有一个请求http://localhost:2379/user-service/hello被发送到API网关上,由于/user-service/hello能够被上述配置的path规则匹配,所以API网关会转发请求到http://localhost:8080/hello地址。

这一般是我们的单实例配置方式。

我上边就是采用的单实例配置。

接下来提及一下多实例配置:

zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-serviceribbon.eureka.enabled=false
user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/

该配置实现了对符合/user-service/**规则的请求路径转发到http://localhost:8080/http://localhost:8081/两个实例地址的路由规则。它的配置方式与服务路由的配置方式一样,都采用了zuul.routes.<route>.pathzuul.routes.<route>.serviceId参数对的映射方式,只是这里的serviceId是由用户手工命名的服务名称,配合<serviceId>.ribbon.listOfServers参数实现服务与实例的维护。由于存在多个实例,API网关在进行路由转发时需要实现负载均衡策略,于是这里还需要Spring Cloud Ribbon的配合。

  • ribbon.eureka.enabled:由于zuul.routes.<route>.serviceId指定的是服务名称,默认情况下Ribbon会根据服务发现机制来获取配置服务名对应的实例清单。但是,该示例并没有整合类似Eureka之类的服务治理框架,所以需要将该参数设置为false,不然配置的serviceId是获取不到对应实例清单的。
  • user-service.ribbon.listOfServers:该参数内容与zuul.routes.<route>.serviceId的配置相对应,开头的user-service对应了serviceId的值,这两个参数的配置相当于在该应用内部手工维护了服务与实例的对应关系。

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

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

相关文章

嵌入式中GPIO的工作原理-面试工作必会技能

GPIO工作方式 1、4种输入模式 输入浮空输入上拉输入下拉模拟输入 如下图为GPIO的基本结构&#xff0c;它主要由4部分组成&#xff0c;其中我们所看到的的最右边的I/O引脚&#xff0c;也就是芯片外接可看到的引脚&#xff0c;其它的部分都是GPIO内部的结构。 ①保护二极管 保护…

【新版HI3559AV100开发注意事项(二)】

#新版HI3559AV100开发注意事项&#xff08;二&#xff09; 十一、请问海思HI3559AV100 SPC030资料里面的HI3559ADMEB_VER_C_PCB.pcb是用什么软件打开啊&#xff1f; 答&#xff1a;PADS VX 2.2 Altium designer 十二、hi3559级联问题请教 在SDK的文档中只看到了两块Hi3559板…

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台emc某型号存储服务器&#xff0c;存储服务器上组建了一组raid5磁盘阵列&#xff0c;阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线&#xff0c;但是只有一块热备盘激活&#xff0c;最终导致该ra…

【️如何理解Java中的多态】

✅如何理解Java中的多态&#xff1f; ✅理解Java中的多态 ✅ 扩展知识仓✅方法的重载✅方法的重写✅重载和重写的区别区分 ✅理解Java中的多态 多态的概念比较简单&#xff0c;就是同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执行结果。 如果…

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

vue3表格导入导出.xlsx

在这次使用时恰好整出来了&#xff0c;希望大家也能学习到&#xff0c;特此分享出来 使用前确保安装以下模块&#xff0c;最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

自动化测试工具选择指南

随着软件开发周期的不断缩短和需求的增加&#xff0c;自动化测试变得愈发重要。然而&#xff0c;选择适合项目的自动化测试工具并非易事。以下是一些指导原则&#xff0c;帮助你在众多自动化测试工具中做出明智的选择。 1. 项目需求分析 在选择自动化测试工具之前&#xff0c;首…

海康威视对讲广播系统 RCE漏洞复现(CVE-2023-6895)

0x01 产品简介 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 0x02 漏洞概述 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞,该漏洞源于文件/php/ping.php的参数jsonda…

阿里云k8s集群搭建

文章目录 一、安装前准备1.环境2.k8s集群规划 二、k8s 安装1. centos基础设置2. docker 安装3. k8s安装3.1 添加阿里云 yum 源3.2 安装 kubeadm、kubelet、kubectl3.3 部署 Kubernetes Master3.4 加入 Kubernetes Node3.5 部署 CNI 网络插件3.6 测试 kubernetes 集群 一、安装前…

Python | Flask测试:发送post请求的接口测试

HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 几种。POST通常用来向服务端提交数据&#xff0c;主要用于提交表单、上传文件。 HTTP 协议是以ASCII码传输&#xff0c;建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为…

浅析:智能化视频安全监管系统的设计与实现步骤

关于智能化视频监管方案&#xff0c;小编已经和大家分享了很多&#xff0c;今天就和大家来探讨一下关于智能化视频安全监管系统的设计与实现步骤。 首先需要分析需求。要与使用者和业务部门合作&#xff0c;明确系统的功能和需求&#xff0c;例如&#xff0c;确定监控区域、安…

MyBatis——MyBatis的原始Dao开发(了解)

MyBatis的原始Dao开发-了解 使用Mybatis开发Dao&#xff0c;通常有两个方法&#xff0c;即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式&#xff0c;这种方式总体上更加简便。在之前的文章已经给大家介绍了基于代理方式的dao开发&#x…

在scrapy 使用selenium模拟登录获取cookie

前言 最近有一点点爬虫需求&#xff0c;想总结一下scrapy框架的一些基本使用方法&#xff0c;加深印象&#xff0c;自己一直习惯使用一些脚本文件运行爬虫&#xff0c;面对数据量非常大&#xff0c;稳定性要求比较高的&#xff0c;效率需求比较高的情况下还是用scrapy较为合适…

Azure Machine Learning - 提示工程高级技术

本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c…

Python MySQL数据库连接实现增删改查

一、应用场景 python项目连接MySQL数据库时&#xff0c;需要第三方库的支持。这篇文章使用的是PyMySQL库&#xff0c;适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 1.导入模块 import pymysql2.连接数据库 db pymysql.connect(hostlocalhost,usercode_s…

【Linux 驱动】Linux设备树(四)—— 设备树驱动LED

有了设备树以后&#xff0c;我们可以将寄存器信息保存到设备树&#xff0c;即便是更换了一个设备&#xff0c;我们也无需修改驱动文件&#xff0c;只需要修改设备树文件并重新编译。 下面介绍两种通过设备树驱动 LED 的最简单的方式&#xff0c;这两种方式的主要是设备树中 re…

什么是触控芯片?触控芯片有哪些?

一、什么是触控芯片&#xff1f; 触控芯片是一种用于感知人机交互行为的电子元器件&#xff0c;通过感应人体肌肉、电容电场和压力等多种信号&#xff0c;实现触摸屏幕、手势操作、手写输入等功能。二、触控芯片的工作原理 触控芯片的工作原理基于电容原理&#xff0c;当人体肌…

一文读懂PMP项目管理

PMP项目管理是什么 PMP&#xff08;Project Management Professional&#xff09;指项目管理专业人员资格认证&#xff0c;由美国项目管理协会&#xff08;Project Management Institute&#xff0c;简称PMI&#xff09;发起&#xff0c;目前已在全球206个国家和地区进行认证&…

小黑南京归来,参加部里的公务员培训,有点儿社死认识了好多小伙伴的leetcode之旅13. 罗马数字转整数

小黑代码 class Solution:def romanToInt(self, s: str) -> int:chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]map_ dict((k, v) for k,v in zip(chars, nums))# 字符串长度n len(s)# 结果变量res …

Java集合转int数组

集合通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c; 【但是】这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 可以通过stream流处理&#xff1a; Set<Integer> set new HashSet<>(); int[] result interSet…