zuul路由配置详解

Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作。

简单路由(SimpleHostRoutingFilter)

该过滤器运行后,会将 HTTP 请求全部转发到"源服务器",简单路由的配置如下:

#zuul路由配置
zuul:
  routes:
  #person为路由名
  person:
    path:/person/**
    url:http://localhost:8080

该配置访问 http://localhost:9100/person/speak 会将请求转发到 http://localhost:8080/speak ,为了配置简化,可以省略 path 属性,简化配置如下:

#zuul路由配置
zuul:
  routes:
 #表示http://localhost:9100/person/speaks地址,路由到http://localhost:8080/speaks
    person:
      url:http://localhost:8080

url 的值必须以 http: 和 https: 字符串开头,否则不会触发简单路由。

简单路由使用了 HttpClient 进行转发,该过滤器会将 HttpServletRequest 的相关数据(HTTP方法,参数、请求头等)转换为 HttpClient 的请求实体,再使用 CloseableHttpClient 进行转发,为了保证性能,使用了 HttpClient 的连接池功能,因此,在使用简单路由时,可以配置 HttpClient 连接池的属性:

zuul.host.maxTotalConnections:目标主机的最大连接数,默认值 200。配置该属性,相当与调用了 PoolingHttpClientConnectionManager 的 setMaxTotal 方法。
zuul.host.maxPerRouteConnections:每个主机的初始连接数,默认值 20。配置该属性,相当与调用了PoolingHttpClientConnectionManager 的 setDefaultMaxPerRoute 方法。

跳转路由(SendForwardFilter)

跳转路由时当外部访问网关的 A 地址时,会跳转到 B 地址,处理跳转的过滤器为 SendForwardFilter,跳转路由的配置如下:

#zuul路由配置
zuul:
  routes:
    #路由名
    testRoute:
      path:/test/**
      url:forward:/hello

表示访问 http://localhost:9100/test 地址时会自动跳转到 http://localhost:9100/hello 地址,注意,这个不是客户端跳转,在浏览器上是无法看到地址变化的,只能根据返回信息来验证,并且不能跨域名,只能在当前站点进行跳转,创建一个简单的 REST 服务验证跳转路由,如下:

package org.lixue.zuul;

   

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

   

@RestController

public class HelloWorldController{

@RequestMapping(value="/hello/{name}",method=RequestMethod.GET)

	publicStringhello(@PathVariable("name")Stringname){
	
	return"hello"+name;

}

}

跳转路由实现比较简单,实际上是调用了RequestDispatcher 的 forward 方法进行跳转。

Ribbon 路由(RibbonRoutingFilter)

当网关作为 Eureka 客户端注册到 Eureka 服务器时,可以通过配置 serviceId 将请求转发到集群的服务中,使用以下配置,可以执行 Ribbon 路由过滤器:

#zuul路由配置
zuul:
  routes:
  	 #表示http://localhost:9100/hello/speaks地址,路由到http://HELLOWORLD-   PROVIDER/speaks,其中具体地址是通过eureka获取
     hello:
       path:/hello/**
       # 注册在eureka的服务名
       serviceId:HELLOWORLD-PROVIDER

与简单路由一样,serviceId 也可以被省略,当省略时,将会使用 routeId 作为 serviceId,简化配置如下:

#zuul路由配置
zuul:
  routes:
    HELLOWORLD-PROVIDER:
      path:/hello/**

如果配置了 serviceId 或者 url 的配置项不是简单的路由格式(不以 http: 或 https:开头),也不是跳转路由格式(forward:开头),那么就会执行 ribbon 路由过滤器,配置如下:

#zuul路由配置
zuul:
  routes:
    #表示http://localhost:9100/hello/speaks地址,路由到http://HELLOWORLD-PROVIDER/speaks,其中具体地址是通过eureka获取
    hello:
      path:/hello/**
      url:HELLOWORLD-PROVIDER

如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,spring cloud zuul 已经帮我们做了默认配置,默认情况下,Zuul 会代理所有注册到Eureka Server的微服务,并且 Zuul 的路由规则如下:
http://ZUUL_HOST:PORT/serviceId/**

如果想让一个或多个服务被不路由,可以使用 zuul.ignoredServices 属性来配置,如果设置 ‘*’ 则表示所有服务被忽略,配置如下:

zuul:
	#不被路由的serviceId,多个使用逗号分割
	ignored-services:HELLOWORLD-PROVIDER

忽略路由

除了使用 zuul.ignoredServices 来忽略路由服务外,还可以使用 zuul.ignoredPatterns 来设置不进行路由的 Url,配置如下:

#zuul路由配置
zuul:
  routes:
    #表示http://localhost:9100/hello/speaks地址,路由到http://HELLOWORLD-PROVIDER/speaks,其中具体地址是通过eureka获取
	hello:
	  path:/hello/**
	  #或者使用url:HELLOWORLD-PROVIDER含义一样
	  serviceId:HELLOWORLD-PROVIDER
	  ignored-patterns:/hello/noRoute

访问/hello会被路由到HELLOWORLD-PROVIDER服务,但是/hello/noRoute不会被路由。

请求头配置

在集群的服务间共享请求头并没有什么问题,但是如果请求会被转发到其他系统,那么对于敏感的请求头信息,就需要进行处理。在默认情况下,HTTP 请求头的 Cookie、SetCookie、Authorization 属性不会传递到"源服务",可以使用 sensitiveHeaders 属性来配置敏感请求头,下面的配置全局生效:

#zuul路由配置
zuul:
  #HTTP请求头不进行转发
  sensitive-headers:Cookie,Set-Cookie,Authorization

#如果只希望针对一个路由生效,可以在路由下进行配置,如下:
zuul:
  routes:
    #表示http://localhost:9100/hello/speaks地址,路由到http://HELLOWORLD-PROVIDER/speaks,其中具体地址是通过eureka获取
	hello:
	  path:/hello/**
	  #或者使用url:HELLOWORLD-PROVIDER含义一样
	  serviceId:HELLOWORLD-PROVIDER
	  #HTTP请求头不进行转发
	  sensitive-headers:Cookie,Set-Cookie,Authorization

如果每一个路由都需要配置一些额外的敏感Header时,那你可以通过 zuul.ignoredHeaders来统一设置需要忽略的HTTP请求头,默认情况下,是没有配置的,如果项目中引入了Spring Security,那么Spring Security会自动加上这个配置,默认值为: Pragma、Cache-Control、X-Frame-Options、X-Content-Type-Options、X-XSS-Protection、Expries。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个开源的微服务框架,提供了一系列的组件来简化微服务的开发和管理。其中包括了五大组件,分别为:服务注册与发现组件Eureka、分布式配置中心Config、服务消费者组件Feign、断路器组件Hystrix、网关组件Zuul。下面是这五大组件的相关配置详解。 1. 服务注册与发现组件Eureka Eureka是一个基于REST的服务注册与发现组件,用于管理服务的注册和发现。Eureka提供了高可用性、动态扩展、故障转移等特性。在Spring Cloud中,Eureka作为服务注册中心,可以让微服务之间互相发现和调用。 Eureka的相关配置如下: ```yaml eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true # 是否使用IP注册到Eureka,默认为false instance-id: ${spring.cloud.client.hostname}:${server.port} # 设置服务实例ID,默认为主机名:端口 ``` 2. 分布式配置中心Config Config是一个分布式配置中心,用于管理应用程序的配置。Config提供了集中式管理配置的功能,可以让应用程序动态地获取配置信息。在Spring Cloud中,Config可以作为配置中心,让微服务获取配置信息。 Config的相关配置如下: ```yaml spring: cloud: config: uri: http://localhost:8888 profile: dev # 配置文件的环境标识,如dev、prod等 label: master # Git仓库的分支名或标签名,用于多人协作 ``` 3. 服务消费者组件Feign Feign是一个基于HTTP的RESTful服务客户端,用于调用服务。Feign可以让开发人员更方便地调用其他微服务,它将服务接口定义为Java接口,并使用注解进行配置。在Spring Cloud中,Feign可以作为服务消费者组件,让微服务之间进行调用。 Feign的相关配置如下: ```yaml feign: hystrix: enabled: true # 是否启用Hystrix断路器,默认为true ``` 4. 断路器组件Hystrix Hystrix是一个断路器组件,用于处理分布式系统中的延迟和故障。Hystrix可以让服务之间更加健壮,它通过监控服务调用的状态,自动地打开或关闭断路器,从而防止故障在整个系统中扩散。在Spring Cloud中,Hystrix可以作为断路器组件,让微服务更加稳定。 Hystrix的相关配置如下: ```yaml hystrix: command: default: execution: isolation: strategy: SEMAPHORE # Hystrix隔离策略,默认为THREAD,可设置为SEMAPHORE circuitBreaker: enabled: true # 是否启用断路器,默认为true requestVolumeThreshold: 20 # 在时间窗口内的最小请求数,默认为20 errorThresholdPercentage: 50 # 错误百分比阈值,默认为50% sleepWindowInMilliseconds: 5000 # 断路器打开后的休眠时间,默认为5000ms ``` 5. 网关组件Zuul Zuul是一个网关组件,用于路由和过滤微服务请求。Zuul可以让微服务之间更加灵活,它可以对请求进行路由、过滤、转发、聚合等操作。在Spring Cloud中,Zuul可以作为网关组件,让微服务之间的请求更加安全、高效。 Zuul的相关配置如下: ```yaml zuul: routes: user-service: /user-service/** # 定义路由规则,将/user-service/**的请求转发到user-service服务 ignored-patterns: /**/hystrix.stream # 忽略/hystrix.stream请求,避免被Hystrix监控 host: connect-timeout-millis: 20000 # 连接超时时间,默认为20000ms socket-timeout-millis: 20000 # 套接字超时时间,默认为20000ms ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值