在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,一经查实,立即删除!

相关文章

JavaFX实现简单下雨动效

下雨动效可以使用JavaFX的动画功能来实现。下面是一个简单的示例代码,实现了一个下雨的动画效果: import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.application…

嵌入式中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…

力扣:204. 计数质数(Python3)

题目&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 示例&#xff1a; 示例 1&#xff1a; 输…

【️如何理解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;首…

0x25 广度优先搜索

0x25 广度优先搜索 在0x21节中&#xff0c;我们介绍了图的广度优先遍历&#xff0c;在0x22节中&#xff0c;我们又定义了深度优先搜索过程产生的“搜索树”结构。如果我们把问题状态空间类比成一张图&#xff0c;那么广度优先搜索就是相当于对这张图的广度优先遍历。类似地&am…

海康威视对讲广播系统 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 集群 一、安装前…

配置应用到k8s

配置应用到k8s&#xff0c;前置条件是安装了Docker&#xff0c;Minikube&#xff0c;kubectl 应用已经通过Docker生成本地镜像文件 1&#xff0c;创建godemo-deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:name: godemo-deploymentspec:replicas: 3 #启动三个…

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;帮助读者更好地理解和掌握数据仓库中的拉链表技术。 场景问题 在数据仓库的…

解决Edge浏览器问题的实用教程

学习目标&#xff1a; 掌握解决Edge浏览器常见问题的方法。提升对浏览器故障排除的能力。 学习内容&#xff1a; 常见Edge浏览器问题的识别和解决方法。例如页面加载慢、无法访问特定网站、崩溃或无响应等。更新Edge浏览器和操作系统&#xff0c;以确保拥有最新的安全补丁和功…

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

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

使用Vue customRef创建防抖 ref

customRef 用于创建一个自定义的ref&#xff0c;显式声明对其依赖追踪和更新触发的控制方式。 function customRef<T>(factory: CustomRefFactory<T>) : Ref<T>// customRef接受一个工厂函数作为参数&#xff0c;这个工厂函数接受track、trugger两个函数 //…

Tomcat介绍及使用:构建强大的Java Web应用服务器

引言&#xff1a; 在现代软件开发中&#xff0c;Web应用已经成为了不可或缺的一部分。而为了构建高效、稳定的Web应用服务器&#xff0c;选择合适的工具和技术至关重要。Tomcat作为一款开源的Java Web应用服务器&#xff0c;凭借其丰富的功能和灵活的配置&#xff0c;成为了开发…

C #define宏展开#与##

#include<stdio.h> //宏展开后解释成字符串&#xff1a;# #define fprint(expr) printf(#expr "%.1f\n",expr) #define strprint(expr) printf("%s\n",#expr) //宏展开后拼接变量&#xff1a;## #define strconcatprint(expr1,expr2) printf("%…