Spring Cloud【Finchley】-16 Zuul的路由配置

简介: Spring Cloud【Finchley】-16 Zuul的路由配置

20190806093230928.jpg


概述


Spring Cloud【Finchley】-14 微服务网关Zuul的搭建与使用中我们搭建了zuul的微服务,对所有注册在Eureka Server上的服务进行了代理。 当然了,zuul也支持更加细粒度的支持,比如对某些特定的微服务,或者特定的URL等,这里我们继续来学习下zuul更加丰富的路由配置。


官方指导: https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#netflix-zuul-reverse-proxy


路由配置


1.忽略指定的微服务


在application.yml中通过 zuul.ignored-services属性指定忽略的微服务 ,多个服务使用,分隔

zuul:
  ignored-services: microservice-provider-user,micorservice-consumer-movie-ribbon



测试下:


启动注册中心Eureka Server 项目 microservice-discovery-eureka

启动服务提供者micorservice-provider-user

启动服务消费者 micorservice-consumer-movie-ribbon

启动zuul网关microservice-gateway-zuul

访问zuul的端口 http://localhost:4534/microservice-provider-user/user/2


20190113171057342.png

同时查看 http://localhost:4534/actuator/routes



20190113171118672.png

说明配置生效了。


2.自定义微服务的访问路径

在application.yml中通过配置zuul.routes.微服务的ServiceId :指定路径

zuul:
  routes: 
     microservice-provider-user: /userprovider/**


这样microservice-provider-user就会被映射到/userprovider/**路径


测试一下:


启动注册中心Eureka Server 项目 microservice-discovery-eureka

启动服务提供者micorservice-provider-user

启动服务消费者 micorservice-consumer-movie-ribbon启动zuul网关microservice-gateway-zuul

先访问 http://localhost:4534/microservice-provider-user/user/4

20190113211656628.png


再放问下设置的映射路径: http://localhost:4534/userprovider/user/4


20190113211721492.png

发现两个路径都可以访问的通,那我们看下zuul的路由映射呢

http://localhost:4534/actuator/routes


20190113211815642.png

格式化如下:


20190113211839355.png


3.忽略所有微服务,只用路由指定微服务


如果只想让zuul代理指定的微服务,可以将zuul.ignored-services设置为'*' ,然后再routes中设置指定的微服务

zuul:
  ignored-services: '*'
  routes: 
     microservice-provider-user: /userprovider/**


测试一下:


启动注册中心Eureka Server 项目 microservice-discovery-eureka

启动服务提供者micorservice-provider-user

启动服务消费者 micorservice-consumer-movie-ribbon

启动zuul网关microservice-gateway-zuul

访问下映射后的路径,

20190113212404672.png


那试试原来的地址还能访问吗?

http://localhost:4534/microservice-provider-user/user/4

20190113212438563.png

看下 zuul的路由情况 http://localhost:4534/actuator/routes


20190113212342720.png

发现原来的地址没有被zuul代理, ignored-services: ‘*’ 生效了。


4.同时指定微服务的serviceId和对应路径


20190113213753286.png


效果同效果同自定义微服务的访问路径 ,只不过这里用的是电影微服务

zuul:
  routes:
    movie-route:  # 该配置方式中,这个名称是路由名称,可自定义
      service-id: micorservice-consumer-movie-ribbon
      path: /movie/**  #与service-id对应的微服务的路径


测试下:


启动注册中心Eureka Server 项目 microservice-discovery-eureka

启动服务提供者micorservice-provider-user

启动服务消费者 micorservice-consumer-movie-ribbon

启动zuul网关microservice-gateway-zuul

zuul的路由情况:


20190113213536108.png

访问 movie微服务映射后的地址 http://localhost:4534/movie/movie/2


2019011321361027.png


5.同时指定微服务的URL和对应路径

20190113213807804.png

zuul:
  routes:
    movie-route:  # 该配置方式中,这个名称是路由名称,可自定义
      url: http://localhost:7902/ # 指定的url  7902 为 该微服务的启动端口
      path: /movie/**  #与service-id对应的微服务的路径


如上配置可以实现将/movie/** 映射到 http://localhost:7902/**


测试


启动注册中心Eureka Server 项目 microservice-discovery-eureka

启动服务提供者micorservice-provider-user

启动服务消费者 micorservice-consumer-movie-ribbon

启动zuul网关microservice-gateway-zuul


zuul的路由情况:


20190113215516867.png

访问 movie微服务映射后的地址:


20190113215534390.png

但是这种配置方式的路由不会作为HystrixCommand执行,同时不能使用Ribbon来负载均衡多个URL。 可以使用下面的的配置来使用Zuul的Hystrix 、Ribbon特性


6.同时指定微服务的URL和对应路径,并且不破坏Zuul的Hystrix 、Ribbon特性


方式一:

20190113220321129.png


根据官网的指导,我们来改造下

zuul:
  routes:
    movie-route:  # 该配置方式中,这个名称是路由名称,可自定义
      service-id: micorservice-consumer-movie-ribbon
      path: /movie/**  #与service-id对应的微服务的路径
ribbon:
  eureka:
    enabled: false # 为Ribbon禁用Eureka
micorservice-consumer-movie-ribbon:  # 上面的service-id
  ribbon:
    listOfServers: http://localhost:7901,http://localhost:7902


方式二:


20190113220255964.png

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

20190113220714203.png



@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
    return new PatternServiceRouteMapper(
        "(?<name>^.+)-(?<version>v.+$)",
        "${version}/${name}");
}

看下 PatternServiceRouteMapper


20190113220810198.png


构造函数两个参数 servicePattern 和 routePattern


servicePattern 微服务正则

routePattern 路由正则


上述的规则含义是 将 microservice-provider-user-v1这种微服务,映射到/v1/microservice-provider-user/**这个路径


8.设置路由前缀


20190113223519177.png


20190114232156845.png



示例一:

zuul:
  prefix: /api
  strip-prefix: false
  routes:
    microservice-provider-user: /userprovider/**


microservice-provider-user的控制层增加如下方法用作测试

20190113224932406.png


访问 : http://localhost:4534/api/userprovider/3


20190113224859277.png


访问zuul的 http://localhost:4534/api/userprovider/3 被转发到 microservice-provider-user的 /api/{id} 方法 。


查看zuul的路由规则 http://localhost:4534/actuator/routes


2019011322530648.png


示例二:

zuul:
  routes:
    microservice-provider-user:  # 微服务的serviceId
       path: /user/**
       strip-prefix: false


访问zuul的 /user/2 将被转发到microservice-provider-user的/user/2

20190113225653905.png

microservice-provider-user日志:20190113225716690.png



查看下zuul的路由 http://localhost:4534/actuator/routes


20190113225758175.png

9.忽略某些路径


如果需要更加细粒度的路由控制,比如想让zuul代理某个服务,同时又想保护该微服务的某些敏感路径,这个时候 ignored-patterns属性就派上用场了。


20190113230407640.png


zuul:
  routes:
    microservice-provider-user:  /userprovider/**
  ignored-patterns: /**/admin/**  # 忽略包含admin的路径


小提示

如果想看更多zuul的转发细节,请将 com.netflix包的日志设置为debug级别。

application.yml中增加


logging:
  level:
    com.netflix: DEBUG  # 将 com.netflix包的日志级别设置为debug

举个例子:

server:
  port: 4534
spring:
  application:
    name: microservice-gateway-zuul
eureka:
  client:
    service-url:
      defaultZone: http://artisan:artisan123@localhost:8761/eureka
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
#actuator  启用所有的监控端点 “*”号代表启用所有的监控端点,可以单独启用,例如,health,info,metrics
#  spring boot 升为 2.0 后,为了安全,默认 Actuator 只暴露了2个端点,heath 和 info
management:
  endpoints:
    web:
      exposure:
        include: "*" 
  endpoint:
      health:
        show-details: ALWAYS
zuul:
  prefix: /api
  strip-prefix: false
  routes:
    microservice-provider-user: /userprovider/**
logging:
  level:
    com.netflix: DEBUG  # 将 com.netflix包的日志级别设置为debug,将打印zuul的转发细节


调用 http://localhost:4534/api/userprovider/3 ,观察zuul的日志如下

20190113231447476.png

然后去对应的微服务看是否有匹配的路径即可。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
8月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
8月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2812 0
|
10月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1319 0
|
7月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
8月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1576 5
|
8月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
462 0
探索Spring Boot的@Conditional注解的上下文配置
|
9月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1502 10
|
10月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1613 1
|
10月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
763 0