【SpringCloud学习笔记】zuul网关

news2024/12/26 10:50:24

【SpringCloud学习笔记】

  • 为什么需要网关
  • zuul网关
  • 搭建zuul网关服务
  • 网关过滤器

为什么需要网关

微服务项目一般有多个服务,每个服务的地址都不同,客户端如果直接访问服务,无疑是增加客户端开发难度,项目小还好,如果项目比较大,有几十上百个地址,怎么办?此时就用到了微服务网关
在这里插入图片描述
微服务网关是介于客户端,服务之间,所有请求先经过网关,具体调用什么服务由微服务网关去转发需要调用的服务,这样客户端就只需要知道网关的地址即可,做到了统一入口,方便管理
在这里插入图片描述

zuul网关

zuul是Netflix开源的微服务网关,它可以跟eureka、Ribbon、Hystrix等组件配合使用,zuul的核心是过滤器,下面是基于zuul1.0版本

现在有一个用户服务user-service提供了一些查询用户信息的基础能力,该服务注册到eureka服务中心

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @GetMapping(value = "/getAllUserInfo")
    public List<UserInfo> getAllUserInfo(){
        List<UserInfo> list = new ArrayList<>();
        list.add(new UserInfo(1,"张三",20,"杭州市滨江区"));
        list.add(new UserInfo(2,"李四",21,"杭州市西湖区"));
        return list;
    }
}

配置文件信息

server:
  port: 9001
spring:
  application:
    name: user-service
eureka:
  instance:
    hostname: 127.0.0.1
  client:
    register-with-eureka: true #默认值是true,是否将自己注册到注册中心
    fetch-registry: false # 默认值是true,是否从注册中心拉取服务
    service-url: #注册中信对外暴露的注册中心地址
      defaultZone: http://localhost:8761/eureka/

搭建zuul网关服务

  • pom.xml引入网关依赖
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
 </dependency>
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>
  • 启动类上添加zuul注解依赖
@EnableZuulProxy
@SpringBootApplication
public class ZuulServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }
}
  • 路由配置
#路由规则
zuul:
  routes:
    user-service: #路由id,自定义
      path: /user-service/** #请求url的映射路径
      url: http://localhost:9001 #映射路径对应的微服务地址,也就是将path路径拼到url型成一个完整的请求路径
通配符含义例如
/?匹配任意单个字符/user/a、/user/b
/*匹配任意数量字符,不包括子路径/user/abc、/user/def
/**匹配任意数量字符和路径/user/abc/def、/user/abc/def/bbb

上面的路由配置有个不好的地方就是每个路由的映射地址都需要手动去维护,那该如何自动获取服务的地址信息,那就是个网关服务接入到注册中心,下面在网关服务配置文件中添加eurake配置中的配置

eureka:
  instance:
    hostname: 127.0.0.1
  client:
    register-with-eureka: true #默认值是true,是否将自己注册到注册中心
    fetch-registry: true # 默认值是true,是否从注册中心拉取服务
    service-url: #注册中信对外暴露的注册中心地址
      defaultZone: http://localhost:8761/eureka/

路由规则配置修改为如下

#路由规则
zuul:
  routes:
    user-service: #路由id,自定义
      path: /service/** #请求url的映射路径
      serviceId: user-service #服务名称

serviceId就是服务名称也就是注册中心注册的名称,上面的路由规则也是zuul网关默认配置,该配置你就是不写也是一样的,只要保证网关服务注册到注册中心即可

  • 路由排除,请求地址排除,服务名排除
ignored-patterns: /**/user/** #请求地址排除所有包含user路径
ignored-services: user-service #服务名称排除,多个使用逗号隔开,如果配置 * 是排除所有
  • 路由前缀,也就是请求的地址必须都要加上改前缀才可以访问
prefix: /api
  • 网关限流

网关服务需要引入redis和ratelimit依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.marcosbarbero.cloud</groupId>
    <artifactId>spring-cloud-zuul-ratelimit</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

项目的配置文件中添加redis服务的地址,端口等信息,另外添加网关限流配置

ratelimit:
  repository: redis #存储类型
  enabled: true #启用开关
  policy-list:
    user-service:
      - limit: 5 #在一个单位时间窗口的请求数量
        #quota: 1000 #在一个单位时间窗口的请求时间限制
        refresh-interval: 60 #单位时间窗口
        type:
          - user #可指定用户粒度
          - origin #可指定客户端地址粒度
          - url #可指定url粒度

可以配置不同服务的限流规则,还可以配置全局限流

default-policy-list: #全局配置
  - limit: 5
    quota: 5
    refresh-interval: 60
    type:
      - url

网关过滤器

zuul网关的核心就是过滤器,当我们需要使用网关来实现一些特定的业务处理,如请求日志打印,请求鉴权等。我们只需要继承zuulFilter抽象类实现其中的抽象方法即可,需要我们实现的方法有四个,filterType(),filterOrder(),shouldFilter(),run()

  • filterType(): 过滤器的类型,pre,routing,post,error
  • filterOrder(): 过滤器的执行顺序,当有多个过滤器时,通过指定返回值来依次执行,数值越小优先级越高
  • shouldFilter(): 判断该过滤器是否需要执行,true 执行,false 不执行
  • run(): 过滤器具体执行的逻辑

执行流程:
在这里插入图片描述

  • 正常流程是 pre -> route -> post
  • 如果在 pre 过滤器阶段抛出异常,那么流程是: pre -> error -> post
  • 如果在 route 过滤阶段抛出异常,那么流程是: pre -> route -> error -> post
  • 如果在post 过滤阶段抛出异常,最终流程是:pre -> route -> post -> error

实例:

@Component
public class PreFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        System.out.println("请求的url: " + request.getRequestURL());
        return null;
    }

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

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

相关文章

【图像任务】Transformer系列.1

介绍几篇改进Transformer模型实现亮度增强、图像重建的任务&#xff1a;LLFormer&#xff08;AAAI2023&#xff09;&#xff0c;DLSN&#xff08;TPAMI2023&#xff09;&#xff0c;CAT&#xff08;NeurIPS2022&#xff09;。 Ultra-High-Definition Low-Light Image Enhanceme…

Linux | 进程控制

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a; 《 C G o d 的个人主页》 \color{Darkorange}{《CGod的个人主页》} 《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a; 《编程成神技术交流社区》 \color{Darkorange}{《编程成神技术…

Redis的内存策略

过期Key处理: 1)Redis之所以性能强大&#xff0c;最主要的原因就是基于内存来存储&#xff0c;然而单节点的Redis内存不宜设置的过大&#xff0c;否则会影响持久化或者是主从复制的性能&#xff0c;可以通过修改配置文件来设置redis的最大内存&#xff0c;通过maxmemory 1gb&am…

javaScript蓝桥杯-----粒粒皆辛苦

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 俗话说“民以食为天”&#xff0c;粮食的收成直接影响着民生问题&#xff0c;通过对农作物产量的统计数据也能分析出诸多实际问题。 接下来就让我们使用 ECharts 图表&#xff0c;完成 X 市近五年来的农作物产量的统…

Python批量下载参考文献|基于Python的Sci-Hub下载脚本|Python批量下载sci-hub文献|如何使用sci-hub批量下载论文

本篇博文将介绍如何通过Python的代码实现快速下载指定DOI号对应的文献&#xff0c;并且使用Sci-Hub作为下载库。 一、库函数准备 在开始之前&#xff0c;我们需要先安装一些必要的库&#xff0c;包括&#xff1a; requests&#xff1a;发送HTTP请求并获取响应的库&#xff1…

南山城市更新--向南村(一期,二期)项目详情

向南村&#xff08;一期&#xff09;城市更新单元项目简介 项目于2010年被列入《深圳城市更新单元规划制定计划第一批计划》中&#xff0c;申报主体为向南实业股份有限公司&#xff0c;后与恒大合作开发。 项目位于南山区桂庙路南侧&#xff0c;毗邻前海、衔接后海&am…

经典算法:Fenwick Tree

经典算法&#xff1a;Fenwick Tree 1. 算法简介2. 原理介绍3. 算法实现4. 例题说明 1. 解题思路2. 代码实现 5. 参考链接 1. 算法简介 Fenwick Tree又称为Binary Indexed Tree&#xff0c;也算是一种常见的数据结构了。 他其实某种意义上来说算是Segment Tree的一种变体&…

克隆虚拟机

上一篇我们已经讲过了启动虚拟机并安装Linux系统&#xff0c;下面我们来讲一下如何通过已经创建好的虚拟机spark01克隆出spark02和spark03来&#xff0c;从而满足搭建大数据集群环境需要多台虚拟机的需求。 首先我们要理解两个概念&#xff1a; 1.完整克隆 完整克隆的虚拟机可…

【算法证明 三】计算顺序统计量的复杂度

计算顺序统计量&#xff0c;在 c 标准库中对应有一个函数&#xff1a;nth_element。其作用是求解一个数组中第 k 大的数字。常见的算法是基于 partition 的分治算法。不难证明这种算法的最坏复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)。但是其期望复杂度是 Θ ( n ) \Theta(n) …

从源码全面解析 dubbo 服务暴露的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

SpringBoot配置 -- SpringBoot快速入门保姆级教程(二)

文章目录 前言二、SpringBoot配置1. 了解配置文件的3种格式2.yaml格式语法规则3.读取yaml数据的3种方式4.多环境开发配置5.多环境命令行启动参数设置6. 多环境开发兼容问题7.配置文件分类 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&am…

vcruntime140.dll如何修复

VCRUNTIME140.dll是Windows操作系统上一个非常重要的动态链接库文件&#xff0c;它是由Microsoft Visual C Runtime提供的运行时库文件之一&#xff0c;被许多应用程序用来进行编译和运行。如果该文件丢失或损坏&#xff0c;很多应用程序就无法正常运行&#xff0c;这可能会带来…

三分钟了解SpringBoot配置优先级底层源码解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是冰点&#xff0c;从业11年&#xff0c;目前在物流独角兽企业从事技术方面工作&#xff0c;&#x1f342;博主正在努力完成2023计划中&#xff1a;以梦为马&#xff0c;扬帆起航&#xff0c;2023追梦人&#x1f4dd;联系…

关于性能测试平台的一些想法,想跟大家聊一下

目录 一、任务管理 二、用例管理 三、环境管理 四、压测机管理 五、数据管理 六、监控管理 七、日志管理 八、报表管理 九、配置管理 十、系统管理 组织架构 这里我按照每个不同系统归属的项目组为横向&#xff0c;性能测试团队作为职能部门为纵向的矩阵式组织架构为…

JUC学习(二)

目录 Doug Lea — JUC并发包的作者锁框架Lock和Condition接口可重入锁公平锁与非公平锁读写锁锁降级和锁升级队列同步器AQS底层实现公平锁一定公平吗&#xff1f;Condition实现原理 ——————————————————————————————— 在前面&#xff0c;我们了解…

ICV报告:乘光伏新能源汽车之势,功率器件蓄势待发

前言&#xff1a; 电力电子器件&#xff08;Power Electronic Device&#xff09;&#xff0c;又称为功率半导体器件&#xff0c;用于电能变换和电能控制电路中的大功率(通常指电流为数十至数千安&#xff0c;电压为数百伏以上)电子器件。功率器件能够承受和控制较大电流、电压…

无限阳光、自动收集阳光CALL、阳光产生速度

简单实现无限阳光 本次实验内容&#xff1a;通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移&#xff0c;从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据&#xff0c;最后我们将通过使用C语言编写通用辅助实现简单的无限阳光外挂&#xff0c;在教程开始…

Vue Router路由管理器

目录&#xff1a; 相关理解基本路由几个注意事项嵌套&#xff08;多级&#xff09;路由路由的query参数命名路由路由的params参数路由的props配置路由跳转的replace方法编程式路由导航缓存路由组件activated和deactivated路由守卫路由器的两种工作模式 相关理解 vue-route…

博学谷学习记录】超强总结,用心分享 | 架构师 敏捷开发 学习总结

文章目录 敏捷开发1. 概述2. 敏捷开发 敏捷开发 1. 概述 随着软件开发技术的不断发展&#xff0c;现在出现了很多种不同的开发模式&#xff0c;其实敏捷开发已经成为现在很多企业开发应用程序都想要选择的开发方案&#xff0c;那么什么是敏捷开发呢&#xff1f;1.1 四种开发模…

Linux 配置Java环境(一)

Linux 配置Java环境 一、配置Java环境1、查看系统是否有java环境2、卸载系统自带的jdk3、创建一个文件夹用于存放java的压缩包4、包下载好的jdk拖到java文件夹5、安装jdk6、配置环境变量7、让配置生效8、验证是否配置成功 一、配置Java环境 1、查看系统是否有java环境 输入指…