💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
Spring Cloud创建了一个嵌入式Zuul代理,以简化UI应用程序想要对一个或多个后端服务进行代理调用的常见用例的开发。 此功能对于用户界面代理其所需的后端服务非常有用,从而无需为所有后端独立管理CORS(全称是"跨域资源共享"Cross-origin resource sharing)和身份验证问题。 要启用它,请使用`@EnableZuulProxy`注解Spring Boot主类。 这样做会导致本地呼叫转发到适当的服务。 按照惯例,具有用户ID的服务从位于`/users`的代理接收请求(带有前缀剥离)。 代理使用Ribbon 来定位发现的实例,并转发请求。 所有请求都在hystrix命令中执行,因此Hystrix指标中会出现故障。 断路发生后,代理不会尝试联系该服务。 >Zuul启动器不包含发现客户端,因此,对于基于服务ID的路由,您还需要在类路径中提供其中一个(Eureka是一种选择)。 要跳过自动添加的服务,请将`zuul.ignored-services`设置为服务ID模式列表。 如果服务与忽略模式匹配但仍包含在显式配置的路由映射中,则它是不忽略的,如以下示例所示: ``` zuul: ignoredServices: '*' routes: users: /myusers/** ``` 以上示例所有服务都将忽略,除了`users` 要扩充或更改代理路由,可以添加外部配置,如下所示: ``` zuul: routes: users: /myusers/** ``` 前面的示例意味着对`/myusers`的HTTP调用被转发到`users `服务(例如`/myusers/101`被转发到`/101`)。 要对路由进行更细粒度的控制,可以单独指定路径和serviceId,如下所示: ``` zuul: routes: users: path: /myusers/** serviceId: users_service ``` 前面的示例意味着对`/myusers`的HTTP调用将转发到`users_service`服务。 路径必须具有可以指定为ant样式模式的路径,因此`/myusers /*`仅匹配一个级别,但`/myusers /**`是分层匹配的。 后端的位置可以指定为`serviceId`(用于发现服务)或`url`(用于物理位置),如以下示例所示: ``` zuul: routes: users: path: /myusers/** url: http://example.com/users_service ``` 这些简单的url-routes不会作为`HystrixCommand`执行,也不会使用Ribbon对多个URL进行负载均衡。 要实现这些目标,您可以使用静态服务器列表指定`serviceId`,如下所示: ``` zuul: routes: echo: path: /myusers/** serviceId: myusers-service stripPrefix: true hystrix: command: myusers-service: execution: isolation: thread: timeoutInMilliseconds: ... myusers-service: ribbon: NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList listOfServers: http://example1.com,http://example2.com ConnectTimeout: 1000 ReadTimeout: 3000 MaxTotalHttpConnections: 500 MaxConnectionsPerHost: 100 ``` 另一种方法是指定服务路由并为serviceId配置Ribbon客户端(这样做需要在Ribbon中禁用Eureka支持 - 请参阅上面的更多信息),如以下示例所示: ``` zuul: routes: users: path: /myusers/** serviceId: users ribbon: eureka: enabled: false users: ribbon: listOfServers: example.com,google.com ``` 您可以使用`regexmapper`在`serviceId`和路由之间提供约定。 它使用正则表达式命名组从`serviceId`中提取变量并将它们注入路由模式,如以下示例所示: ``` @Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); } ``` 上面的示例表示`myusers-v1`的`serviceId`映射到`route / v1 / myusers / **`。 接受任何正则表达式,但所有命名组必须同时出现在`servicePattern`和`routePattern`中。 如果`servicePattern`与`serviceId`不匹配,则使用默认行为。 在前面的示例中,`myusers`的`serviceId`映射到`“/ myusers / **”`路由(未检测到版本)。 默认情况下禁用此功能,仅适用于已发现的服务。 要为所有映射添加前缀,请将`zuul.prefix`设置为值,例如`/api`。 默认情况下,在转发请求之前,会从请求中删除代理前缀(您可以使用`zuul.stripPrefix = false`关闭此行为)。 您还可以关闭从各个路由中剥离特定于服务的前缀,如以下示例所示: ``` zuul: routes: users: path: /myusers/** stripPrefix: false ``` >`zuul.stripPrefix`仅适用于`zuul.prefix`中设置的前缀。 它对给定路径的路径中定义的前缀没有任何影响。 在前面的示例中,对`/ myusers / 101`的请求将转发到用户服务上的`/ myusers / 101`。 `zuul.routes`条目实际上绑定到`ZuulProperties`类型的对象。 如果查看该对象的属性,可以看到它还具有`retryable`标志。 将该标志设置为`true`以使Ribbon客户端自动重试失败的请求。 当您需要修改使用功能区客户端配置的重试操作的参数时,也可以将该标志设置为`true`。 默认情况下,`X-Forwarded-Host`标头会添加到转发的请求中。 要将其关闭,请设置`zuul.addProxyHeaders = false`。 默认情况下,前缀路径被剥离,对后端的请求选择`X-Forwarded-Prefix`标头(前面显示的示例中为/ myusers)。 如果设置默认路由(`/`),则具有`@EnableZuulProxy`的应用程序可以充当独立服务器。 例如,`zuul.route.home:/`会将所有流量(“/ **”)路由到“home”服务。 如果需要更细粒度的忽略,则可以指定要忽略的特定模式。 这些模式在路径定位过程开始时进行评估,这意味着前缀应包含在模式中以保证匹配。 忽略的模式跨越所有服务并取代任何其他路由规范。 以下示例显示如何创建忽略的模式: ``` zuul: ignoredPatterns: /**/admin/** routes: users: /myusers/** ``` 上面例子说明请求 `/myusers/101`会转发到users 服务的` /101` 然而 请求包含`/admin/ `不会处理 >如果您需要保留其路由顺序,则需要使用YAML文件,因为使用属性文件时排序会丢失。 以下示例显示了这样的YAML文件: ``` zuul: routes: users: path: /myusers/** legacy: path: /** ``` 如果您要使用属性文件,则`legacy`路径可能最终位于`users`路径前面,从而导致`users`路径无法访问。