在使用@EnableZuulProxy注解Spring Boot主类之后,可以继续进行路由配置,该配置在application.yml文件中提供。默认情况下,Zuul启动工件不包括服务发现客户端。路由是静态配置的,url属性将被设置为服务的网络地址。现在,如果启动所有微服务和网关应用程序,则可以尝试通过网关调用它们。每个服务在每个路由的配置属性path中设置的路径下可用,如htt:olho/t:8/0/account/地址将被转发到htp:/😮/ahost:.091/。
server:
port: ${PORT:8080)
zuu1:
routes:
account:
path: /account/**
url: http://1ocalhost:8091
customer:
path: /customer/**
url: http://localhost:8092
order:
path: /order/**
url: http://loca1host :8090
product:
path: /product/**
url: http://1ocalhost:8093
与服务发现集成
=======
上一个示例中提供的静态路由配置对于基于微服务的系统来说是不够的。API 网关的主要需求是与服务发现的内置集成。要为Zuul启用在使用Eureka情况下的服务发现,开发人员必须在项目依赖项中包含spring- cloud starter-eureka启动器,并通过@EnableDiscoveryClient来注解应用程序的main类,然后再启用客户端。实际上,让网关在发现服务器中注册它自已是没有意义的,它必须仅获取注册服务的当前列表。因此,开发人员可以将
eureka.client.registerWithEureka 属性设置为false, 以这种方式来禁用该注册。至于plicatin.yml 文件中的路由定义则非常简单。每个路由的名称都将映射到Eureka中的应用程序服务名称。
zuul :
routes:
account-service:
path: /account/**
customer-service:
path: /customer/**
order-service:
path: /order/**
product-service:
path: /product/**
自定义路由配置
=======
有若千个配置设置均允许开发人员自定义Zuul代理的行为。其中一些与服务发现集成有非常密切的关联。
1.忽略已注册的服务
默认情况下,Spring Cloud Zuul会公开在Eureka服务器中注册的所有服务。如果要跳过自动添加每项服务,则必须使用与发现服务器中所有被忽略的服务名称相匹配的模式设置zulignored-services 属性。那么它在实践中是如何运作的呢?即使开发人员没有使用zuul.routes.*属性 提供任何配置,Zuul 也会从Eurcka获取服务列表并自动将它们绑定到具有服务名称的路径上。例如,account-service服务将在网关地址
htp:/ocalhost:8080/0account-service/**下可用。现在,如果在application.yml文件中设置以下配置,那么它将忽略account-service服务并以HTTP 404状态响应。
zuul :
ignoredservices: ’ account-service’
也可以通过将zuulignored-services 设置为*来忽略所有已注册的服务。如果某服务匹配了被忽略的模式,但它也包含在路由映射配置中,那么它将包含在Zuul中。例如, 在以下情况下,将仅处理customer-service服务。
zuul :
ignoredservices: ‘★’
routes:
customer-service: /customer/t★★
2.明确设置服务名称
开发人员还可以使用serviceld 属性在配置中设置发现服务器的服务名称。这种方式可以提供对路径的细粒度控制,因为这样意味着可以单独指定路径和serviceld.以下是路由的等效配置。
zuul :
routes :
accounts :
path: /account/★*
serviceId: account-service
Cus tomers :
path: /customer/**
serviceId: customer-service
orders:
path: /order/★★
serviceId: order-service
products :
path: /product/**
serviceId: product-service
3.使用Ribbon客户端进行路由定义
还有另一种配置路由的方法。开发人员可能会禁用Eureka发现,以便仅依赖Ribbon客户端的listOfServers属性提供的网络地址列表。默认情况下,可以通过Ribbon客户端在所有服务实例之间对网关的所有传入请求进行负载均衡。即使启用或禁用服务发现,此规则也适用,示例代码如下。
zuul :
routes:
accounts:
path: /account/**
serviceId: account- service
ribbon:
eureka:
enabled: false
account- service :
ribbon:
listofservers: http://localhost:8091,http://1ocalhost:9091
4.在路径中添加前缀
有时需要为通过网关调用的服务设置不同的路径,而不是允许它们直接可用。在这种情况下,Zuul提供了为所有定义的映射添加前缀的功能。这可以使用zulprefx 属性轻松配置。默认情况下,Zuul 会在将请求转发给服务之前去掉该前缀。
但是,也可以通过将zul.stripPrefix属性设置为false来禁用该行为。stripPrefx 属性不仅可以为所有已定义的路由全局配置,还可以为每个路由配置。
以下就是一个为所有转发的请求添加/api 前缀的示例。举例来说,现在开发人员如果想调用account-service 服务的GET /{id} 端点,则应该使用的地址是
htp:/localhostr8080/api/account/1。
zuul:
prefix: /api
routes:
accounts:
path: /account/**
serviceId: account-service
customers:
path: /customer/**
serviceId: customer-service
如果此时提供了将stripPrefix属性设置为fale的配置,会出现什么问题呢?在这种情况下,Zuul 会尝试在上下文路径lapi/account和/apicustomer下查找目标服务中的端点。
zuul:
prefix: /api
stripPrefix: false
5.连接设置和超时
Spring Cloud Netflix Zuul的主要任务是将传入请求路由到下游服务。因此,它必须使用HTTP客户端实现来与这些服务进行通信.Zuul使用的默认HTTP客户端现在由Apache HTTP Client支持,而不是已经不推荐使用的Ribbon RestClient.如果要使用Ribbon,则应该将rbbon.restclient. enabled的属性设置为true.或者也可以通过将ribbon, okhttp enabled属性设置为true来尝试OkHttpClient.
开发人员可以配置HTTP客户端的基本设置,如连接或读取超时,以及最大连接数。根据是否使用了服务发现,此类配置有两个可用选项。如果已通过url属性定义了具有指定网络地址的Zuul 路由,则应设置zuul
host.ononect-timeut-millis和zul.host .socket-timeut-illis.为了控制最大连接数,开发人员应该覆盖zuul.host.maxTotalConections 属性的默认值,该属性的默认设置为200。还可以通过设置zul.host maxerRouteConnections属性定义每个路由的最大连接数,该属性的默认值为20。
如果Zuul已经被配置为从发现服务器获取服务列表,则需要使用Ribbon客户端属性ribbon. ReadTimeout和ribbon SocketTimeout配置与以前相同的超时值。还可以使用
ribbon.MaxTotalConnections和ribbon.MaxConnectionsPerHost属性自定义最大连接数。
6.保护标头的安全
如果在请求中已经设置了诸如Authorization之类的HTTP标头,但是它未被转发到下游服务,你是否会感到有些疑惑?其实这是因为Zuul定义了敏感标头的默认列表,这些标头在路由过程中将被删除。这个默认列表中的标头包括Cookie. Set-Cookie 和Authorization。此功能是站在与外部服务器进行通信的角度进行设计的。虽然不反对在同一系统中的服务之间共享标头,但出于安全原因,不建议与外部服务器共享标头。如果有必要,可以通过覆盖sensitiveHeaders属性的默认值来自定义此方法。它可以为所有路由全局设置,也可以仅针对单个路由设置。sensitiveHeaders 不是一个空的黑名单,所以,要让Zuul转发所有标头,则应该明确地将它设置为空列表。
zuul :
routes:
accounts :
path: /account/
sensitiveHeaders:
serviceId: account- service
管理端点
=====
Spring Cloud Nettlix Zuul公开了两个额外的管理端点用于监控。
口Routes (路由) :打印已经定义的路由的列表。
口Filters (过滤器) :打印已经实现的过滤器的列表(可以从Spring Cloud Netlix的1.4.0版本获得)。
要启用管理端点功能,必须在项目依赖项中包含spring-boot starter-actuator,这和前文介绍的方法是一样的。另外,考虑到测试需要,最好能禁用端点安全性设置,方法是将management security .enabled属性设置为false.现在可以调用GET /routes 方法,它将为我们的示例系统打印以下JSON响应。
"/api/account/++.: “account-service”,
"/ap1/customer/t: “customer-service” 。
“/api/order/**”: “order-service”,