springCloud(14):使用Zuul构建微服务网关-路由端点与路由配置详解

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

一、Zuul的路由端点

当@EnableZuulProxy与SpringBoot Actuator配合使用时,Zuul会暴露一个路由管理端点/routes。借助这个端点,可以方便、直观地查看以及管理Zuul的路由。

/routes端点的使用非常简单,使用GET方法访问该端点,即可返回Zuul当前映射的路由列表;使用POST方法访问该端点就会强制刷新Zuul当前映射的路由列表(尽管路由会自动刷新,Spring Cloud依然提供了强制立即刷新的方式)。


由于spring-cloud-starter-zuul已经包含了spring-boot-starter-actuator,因此之前编写的microservice-gateway-zuul已具备路由管理的能力。


测试:

 1、依次启动eureka-server(4010)、eureka-server-2(5010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)

 2、访问http://localhost:5016/routes,结果报401

   wKiom1mb7yqx4WhnAABaxJ8lMvI356.png

   解决:配置management.security.enabled=false

    wKioL1mb757gJcpcAABgwt7jkjQ519.png

从中可以直观地看出路径到微服务的映射。

二、路由配置详解

前面已经编写了一个简单的Zuul网关,并让该网关代理了所有注册到Eureka Server的微服务。但在现实中可能只想让Zuul代理部分微服务,又或者需要对URL进行更加精确的控制。

2.1、自定义指定微服务的访问路径

配置zuul.routes.指定微服务的serverId = 指定路径即可。例如:

1
2
3
zuul:
   routes:
     hystrix-consumer-movie: /movie/**

效果:

  wKioL1mb8f7AXmvAAABDrim09uU285.png

2.2、忽略指定微服务

使用zuul.ignored-services配置需要忽略的服务,多个用逗号分隔,例如:

1
2
zuul:
   ignored-services: provide-user

效果:

  wKioL1mb85_wsI5PAABJQdh4oqo014.png

2.3、忽略所有微服务,只路由指定微服务

将zuul.ignored-services设为'*',routes配置指定的微服务,例如:

1
2
3
4
zuul:
   ignored-services:  '*'
   routes:
     hystrix-consumer-movie: /movie/**

效果:

  wKiom1mb9H-wKCpDAAAYNgu-ZBE372.png

2.4、同时指定微服务的serviceId和对应的路径

1
2
3
4
5
zuul:
   routes:
     user-route:  # user-route只是给路由一个名称,可以随便命名
      service-id: hystrix-consumer-movie
      path: /movie/**   # service-id对应的路径

效果与2.1一样。

2.5、同时指定path和URL

1
2
3
4
5
zuul:
   routes:
     user-route:  # user-route只是给路由一个名称,可以随便命名
      url: http://localhost:5200/  #指定URL
      path: /movie/**   # URL对应的路径

说明:当访问http://localhost:5016/movie/user/1时,则会转发至http://localhost:5200/user/1

效果:

  wKiom1mb9q_Q0q0OAABCOErrr7s599.png

注意:使用这种方式配置的路由不会作为HystrixCommand执行,同时也不能使用Ribbon来负载均衡多个URL

2.6、同时指定path和URL,并且不破坏Hystrix、Ribbon特性

1
2
3
4
5
6
7
8
9
10
11
zuul:
   routes:
     user-route: 
      path: /user/** 
      service-id: provide-user
ribbon: 
   eureka: 
     enabled: false   # 为Ribbon禁用Eureka
provide-user:  # 这边是serviceId
   ribbon: 
     listOfServers: http://localhost:4011,http://localhost:4012

2.7、使用正则表达式指定Zuul的路由匹配规则

借助PatternServiceRouteMapper,实现从微服务到映射路由的正则配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootApplication
@EnableZuulProxy
public  class  Application {
     public  static  void  main(String[] args) {
         SpringApplication.run(Application. class , args);
     }
     
     /*正则表达式指定Zuul的路由匹配规则**/
     @Bean
     public  PatternServiceRouteMapper serviceRouteMapper() {
         return  new  PatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)" "${version}/${name}" );
     }
}

说明:上面将如provide-user-v2这个微服务,映射到/v2/provide-user/**这个路径上

 例:我们队微服务的serviceId命名为provide-user-v2,那么我们可以这么来访问http://localhost:5017/v2/provide-user/1

2.8、路由前缀

设置 zuul.prefix 可以为所有的匹配增加前缀, 例如 /api,代理前缀默认会从请求路径中移除(通过zuul.stripPrefix=false可以关闭这个功能),zuul.stripPrefix默认为true.

如:配置全局的,与prefix一起使用

1
2
3
zuul:
   prefix: /api
   strip-prefix: true

当strip-prefix=true的时候 (http://localhost:5016/api/provide-user/1 -> http://localhost:4011/1)  

当strip-prefix=false的时候(http://localhost:5016/api/provide-user/1 -> http://localhost:4011/api/1)  

说明上面为true的配置,当访问zuul的/api/provide-user/1路径,请求将会被转发到provide-user微服务的/1路径


如:配置局部的,与path一起使用

1
2
3
4
5
zuul:
   routes:
     provide-user: 
       path: /user/**
       strip-prefix: false

当strip-prefix=true的时候 (http://localhost:5016/user/1 -> http://localhost:4011/1)  

当strip-prefix=false的时候(http://localhost:5016/user/1 -> http://localhost:4011/user/1)

说明上面为true的配置,当访问zuul的/user/1路径,请求将会被转发到provide-user微服务的/1路径

2.9、忽略某些路径

2.2中有讲有忽略微服务,但是有时需要更细粒度的路由控制。如,想让Zuul代理某个微服务,同时又想保护该微服务的某些敏感路径。此时,可使用ignored-patterns指定忽略的正则,如:

1
2
zuul:
   ignored-patterns: /**/provide-user/**  # 忽略所有包含/provide-user/的路径

本文转自我爱大金子博客51CTO博客,原文链接http://blog.51cto.com/1754966750/1958422如需转载请自行联系原作者

我爱大金子
相关文章
|
2天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
3天前
|
负载均衡 Java 网络架构
在SpringCloud2023中快速集成SpringCloudGateway网关
本文主要简单介绍SpringCloud2023实战中SpringCoudGateway的搭建。后续的文章将会介绍在微服务中使用熔断Sentinel、鉴权OAuth2、SSO等技术。
27 2
在SpringCloud2023中快速集成SpringCloudGateway网关
|
1天前
|
监控 数据库 开发者
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第11天】在当今软件开发的世界中,微服务架构已经成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了设计、部署和维护微服务系统时面临的挑战,并提出了一系列实用的策略和最佳实践。我们将从服务的划分原则出发,讨论如何确保每个微服务的自治性,以及如何通过容器化和编排技术实现服务的高效运行。文章还将涉及监控、日志记录和故障恢复的策略,旨在帮助开发人员构建一个既高效又可靠的微服务环境。
|
1天前
|
Kubernetes API 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第11天】 在现代软件开发的快速演变中,微服务架构已成为企业追求敏捷性、可扩展性和技术多样性的关键解决方案。本文旨在探讨如何构建高效的微服务架构,并分析其对后端开发的影响。我们将通过一系列最佳实践和策略,展示如何优化服务的独立性、弹性和性能,同时确保系统的整体稳定性和安全性。文章还将介绍容器化、API网关、服务发现和分布式追踪等关键技术的应用,为后端开发者提供一份全面的微服务实施指南。
|
1天前
|
设计模式 监控 API
构建高效的微服务架构:后端开发的新范式
【5月更文挑战第11天】 在当今的软件开发领域,微服务架构已经成为一种流行的设计模式。它通过将应用程序分解为一组小型、松散耦合的服务来提供高度可扩展和灵活的解决方案。本文将探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计原则以及应对常见挑战的策略。我们将深入讨论如何确保系统的可维护性、可靠性和性能,同时考虑到安全性和监控的需求。
|
2天前
|
缓存 负载均衡 API
微服务架构下的API网关性能优化实践
【5月更文挑战第10天】在微服务架构中,API网关作为前端和后端服务之间的关键枢纽,其性能直接影响到整个系统的响应速度和稳定性。本文将探讨在高并发场景下,如何通过缓存策略、负载均衡、异步处理等技术手段对API网关进行性能优化,以确保用户体验和服务的可靠性。
|
2天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第10天】在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序拆分为一组小型、独立和松散耦合的服务来提供更高的可伸缩性和灵活性。本文深入探讨了微服务架构的设计理念、实施步骤以及面临的挑战,并提出了一套实用的策略和最佳实践,帮助后端开发者构建和维护高效的微服务系统。
|
3天前
|
监控 API 持续交付
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第8天】在当今快速演进的软件开发领域,微服务架构已经成为实现敏捷开发、持续交付和系统弹性的关键模式。本文将探讨构建一个高效且可靠的微服务系统所必须的策略和最佳实践。我们将从服务的划分与设计原则出发,讨论如何通过容器化、服务发现、API网关以及断路器模式来优化系统的可伸缩性和鲁棒性。此外,我们还将涉及监控、日志管理以及CI/CD流程在确保微服务架构稳定运行中的作用。
|
3天前
|
XML SQL Java
SpringCloud 基础配置
SpringCloud 基础配置
10 0
|
3天前
|
Kubernetes 持续交付 开发者
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第8天】 随着现代软件开发的不断演进,微服务架构已成为众多企业解决复杂系统问题的首选方案。本文深入探讨了微服务架构的核心概念、设计原则以及实施策略,旨在为后端开发者提供一种清晰、高效的技术路径。通过分析微服务的优势与挑战,结合具体的应用实例,文章将展示如何通过容器化、服务网格和持续集成/持续部署(CI/CD)等先进技术手段,实现后端服务的高可用性、可扩展性和敏捷性。