Zuul技术分享

简介: ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:动态路由:动态将请求路由到不同后端集群压力测试:逐渐增加指向集群的流量,以了解性能负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求静态响应处理:边缘位置进行响应,避免转发到内部集群身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。Spring Cloud对Zuul进行了整合和增强。Spring Cloud对Zuul进行了整合和增强

1 Zuul简介


ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:


  • 动态路由:动态将请求路由到不同后端集群
  • 压力测试:逐渐增加指向集群的流量,以了解性能
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
  • 静态响应处理:边缘位置进行响应,避免转发到内部集群
  • 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。Spring Cloud对Zuul进行了整合和增强。Spring Cloud对Zuul进行了整合和增强


2 搭建Zuul网关服务器


创建工程导入依赖


<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>


编写启动类


@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class ZuulServerApplication {
  public static void main(String[] args) {
    SpringApplication.run(ZuulServerApplication.class, args);
  }
}


@EnableZuulProxy : 通过 @EnableZuulProxy 注解开启Zuul网管功能


编写配置


创建配置文件 application.yml ,并添加相应配置


server:
  port: 8080 #服务端口
spring:
  application:
    name: api-gateway #指定服务名


3 Zuul中的路由转发


最直观的理解:“路由”是指根据请求URL,将请求分配到对应的处理程序。在微服务体系中,Zuul负责接收所有的请求。根据不同的URL匹配规则,将不同的请求转发到不同的微服务处理。


zuul:
  routes:
    product-service: # 这里是路由id,随意写
      path: /product-service/** # 这里是映射路径
      url: http://127.0.0.1:9002 # 映射路径对应的实际url地址
      sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务


只需要在application.yml文件中配置路由规则即可:


  • product-service:配置路由id,可以随意取名
  • url:映射路径对应的实际url地址
  • path:配置映射路径,这里将所有请求前缀为/product-service/的请求,转发到http://127.0.0.1:9002处理


配置好Zuul路由之后启动服务,在浏览器中输入 http://localhost:8080/product/service/product/1 ,即可访问到订单微服务。


3.1 面向服务的路由


微服务一般是由几十、上百个服务组成,对于一个URL请求,最终会确认一个服务实例进行处理。如果对每个服务实例手动指定一个唯一访问地址,然后根据URL去手动实现请求匹配,这样做显然就不合理。


Zuul支持与Eureka整合开发,根据ServiceID自动的从注册中心中获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例的时候不用修改Zuul的路由配置。


(1)添加Eureka客户端依赖


<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


(2)开启Eureka客户端发现功能


@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
@EnableDiscoveryClient
public class ZuulServerApplication {
  public static void main(String[] args) {
    SpringApplication.run(ZuulServerApplication.class, args);
  }
}


(3)添加Eureka配置,获取服务信息


eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
      registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
  instance:
    preferIpAddress: true
    ip-address: 127.0.0.1


(4)修改映射配置,通过服务名称获取


因为已经有了Eureka客户端,我们可以从Eureka获取服务的地址信息,因此映射时无需指定IP地址,而是通过服务名称来访问,而且Zuul已经集成了Ribbon的负载均衡功能。


#配置路由规则
zuul:
  routes:
    product-service: # 这里是路由id,随意写
      path: /product-service/** # 这里是映射路径
      serviceId: shop-service-product #配置转发的微服务名称

serviceId: 指定需要转发的微服务实例名称


3.2 简化的路由配置


在刚才的配置中,我们的规则是这样的:


zuul.routes.<route>.path=/xxx/** : 来指定映射路径。 是自定义的路由名

zuul.routes.<route>.serviceId=/product-service :来指定服务名。

而大多数情况下,我们的 路由名称往往和服务名会写成一样的。因此Zuul就提供了一种简化的配置语法: zuul.routes.<serviceId>=<path>

上面的配置可以简化为一条:

zuul:
  routes:
    shop-service-product: /product-service/**


3.3 默认的路由规则


在使用Zuul的过程中,上面讲述的规则已经大大的简化了配置项。但是当服务较多时,配置也是比较繁琐的。因此Zuul就指定了默认的路由规则:


默认情况下,一切服务的映射路径就是服务名本身,例如服务名为: shop-service-product ,则默认的映射路径就是: /shop-serviceproduct/**


相关文章
|
安全 Java API
互联网并发与安全系列教程(15) - 基于Zuul实现API网关
互联网并发与安全系列教程(15) - 基于Zuul实现API网关
303 0
|
11月前
|
SQL 关系型数据库 MySQL
《理解MySQL数据库》查询优化器深度解析 智能查询优化的核心引擎
MySQL查询优化器是数据库性能核心,通过成本估算、查询重写与执行计划选择,将SQL转换为高效操作。支持索引优化、连接算法选择及子查询转化,结合统计信息与提示机制,提升查询效率。
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
2007 0
|
Dubbo Java 应用服务中间件
Dubbo第二讲:深入理解dubbo分布式服务框架/负载/容错/调优/高可用/dubbo网关/面试/技术选型
Dubbo第二讲:深入理解dubbo分布式服务框架/负载/容错/调优/高可用/dubbo网关/面试/技术选型
1062 0
|
人工智能 自然语言处理 测试技术
苹果一篇论文得罪大模型圈?Transformer不会推理,只是高级模式匹配器!所有LLM都判死刑
苹果公司发布论文《GSM-Symbolic: Understanding the Limitations of Mathematical Reasoning in Large Language Models》,质疑大型语言模型(LLM)在数学推理方面的能力。尽管LLM在GSM8K等测试中表现良好,但在新基准测试GSM-Symbolic中,其准确率随数值变化而显著下降,表明LLM可能依赖于记忆和模式匹配而非真正的数学理解。这一发现引发了AI领域的广泛讨论。
491 5
|
传感器 安全 测试技术
全球宕机:CrowdStrike事件始末
CrowdStrike是一家领先的网络安全公司,但在2024年7月因一次软件更新失误引发了全球大规模宕机事件。此次更新导致数百万台Windows设备蓝屏,影响了航空、金融等关键行业,造成巨额经济损失和企业运营中断。技术分析显示,故障源自CrowdStrike终端检测与响应Sensor的一个逻辑错误,使得系统尝试访问无效内存区域而崩溃。CrowdStrike迅速采取措施,停止并回滚问题更新,同时启动第三方安全审查以加强质量保证流程。此次事件不仅重创CrowdStrike的股价和声誉,也让业界深刻反思软件更新和系统弹性的重要性。
1193 0
全球宕机:CrowdStrike事件始末
|
运维 监控 物联网
使用API网关降低API管理成本
       随着企业的发展,开放了大批量的API,用于衔接内部系统,用于链接移动、智能设备,用于链接我们的供应商、代理商和合作伙伴,打通了企业企业的上下游。API承载了企业的关键业务、连接了企业的重要客户,随着API数量的增多,API的管理成本不断提升,从而大大影响了开发效率。
10430 154
|
Serverless C语言 Python
学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?
在标准库inspect 中,它提供了两个自省的函数,即 ismethod() 和 isfunction(),可以用来判断什么是方法,什么是函数。
620 0
学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?

热门文章

最新文章