首页 文章资讯内容详情

Zuul(SpringCloud学习笔记一)

2026-06-01 2 花语

本文内容纲要:

路由是微服务架构中必须(integral)的一部分,比如,“/”可能映射到你的WEB程序上,”/api/users“可能映射到你的用户服务上,“/api/shop”可能映射到你的商品服务商。(注解:我理解这里的这几个映射就是说通过Zuul这个网关把服务映射到不同的服务商去处理,从而变成了微服务!)

Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器.

Zuul功能:

认证 压力测试 金丝雀测试 动态路由 负载削减 安全 静态响应处理 主动/主动交换管理

Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器,支持基于Java和Groovy的构建。

配置属性zuul.max.host.connections已经被两个新的配置属性替代,zuul.host.maxTotalConnections(总连接数)和zuul.host.maxPerRouteConnections,(每个路由连接数)默认值分别是200和20.

一.Zuul做反向代理

当一个UI应用调用一个或更多的后端服务的时候,我们可以用SpringCloud创建一个Zuul代理减少开发是非常常见的例子。使用代理服务来避免必须的跨域资源共享(Cross-OriginResourceSharing)和所有的后端需要分别认证的问题。

在SpringBoot主函数上通过注解@EnableZuulProxy来开启,这样可以让本地的请求转发到适当的服务.按照约定,一个ID为"users"的服务会收到/users请求路径的代理请求(前缀会被剥离).Zuul使用Ribbon定位服务注册中的实例,并且所有的请求都在hystrix的command中执行,所以失败信息将会展现在Hystrixmetrics中,并且一旦断路器打开,代理请求将不会尝试去链接服务.

Zuulstarter没有包含服务发现的客户端,所以对于路由你需要在classpath中提供一个根据serviceIDs做服务发现的服务.(例如,eureka是一个不错的选择)

在服务ID表达式列表中设置zuul.ignored-services,可以忽略已经添加的服务.如果一个服务匹配表达式,则将会被忽略,但是对于明确配置在路由匹配中的,将不会被忽略,例如:

application.yml

zuul:

``ignoredServices:*

routes: users:/myusers/** 在这个例子中,除了"users",其他所有服务都被忽略了.这个意味着http请求"/myusers"将被转发到"users"服务(比如"/myusers/101"将跳转到"/101") 为了更细致的控制一个路由,你可以直接配置路径和服务ID: zuul: routes: users: path:/myusers/** serviceId:users_service 这个意味着HTTP调用"/myusers"被转发到"users_service"服务.路由必须配置一个可以被指定为ant风格表达式的"path",所以“/myusers/*”只能匹配一个层级, 但"/myusers/**"可以匹配多级. 后端的配置既可以是"serviceId"(对于服务发现中的服务而言),也可以是"url"(对于物理地址),例如: zuul: routes: users: path:/myusers/** url:http://example.com/users_service 这个简单的"url-routes"不会按照 HystrixCommand 执行,也无法通过Ribbon负载均衡多个URLs.为了实现这一指定服务路由和配置Ribbon客户端(这个必须在 Ribbon中禁用Eureka:具体参考更多信息),例如: zuul: routes: users: path:/myusers/** serviceId:users ribbon: eureka: enabled:false users: ribbon: listOfServers:example.com,google.com//所使用的Ribbon列表 你可以使用regexmapper提供serviceId和routes之间的绑定.它使用正则表达式组来从serviceId提取变量,然后注入到路由表达式中. ApplicationConfiguration.java @Bean publicPatternServiceRouteMapperserviceRouteMapper(){ returnnewPatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); } 这个意思是说"myusers-v1"将会匹配路由"/v1/myusers/**".任何正则表达式都可以,但是所有组必须存在于servicePattern和routePattern之中. 如果servicePattern不匹配服务ID,则使用默认行为.在上面例子中,一个服务ID为“myusers”将被映射到路径“/myusers/**”(没有版本被检测到) ,这个功能默认是关闭的,并且仅适用于服务注册的服务。 设置 zuul.prefix 可以为所有的匹配增加前缀,例如 /api,代理前缀默认会从请求路径中移除(通过 zuul.stripPrefix=false 可以关闭这个功能). #反响代理配置 #这里的配置类似nginx的反响代理 #当请求/api/**会直接交给listOfServers配置的服务器处理 #当stripPrefix=true的时候(http://127.0.0.1:8181/api/user/list->http://192.168.1.100:8080/user/list) #当stripPrefix=false的时候(http://127.0.0.1:8181/api/user/list->http://192.168.1.100:8080/api/user/list) zuul.routes.api.path=/api/** zuul.routes.api.stripPrefix=false api.ribbon.listOfServers=192.168.1.100:8080,192.168.1.101:8080,192.168.1.102:8080

你也可以在指定服务中关闭这个功能:

zuul: routes: users: path:/myusers/** stripPrefix:false 在这个例子中,请求"/myusers/101"将被跳转到"users"服务的"/myusers/101"上. zuul.routes的键值队实际上绑定到类型为 ZuulProperties 的对象上.如果你查看这个对象你会发现一个叫"retryable"的字段,设置为"true"会 使Ribbon 客户端自动在失败时重试(如果你需要修改重试参数,直接使用Ribbon客户端的配置) X-Forwarded-Host 请求头默认在跳转时添加.通过设置 zuul.addProxyHeaders=false 关闭它.前缀路径默认剥离,并且对于后端的请求通过请 求头"X-Forwarded-Prefix"获取(上面的例子中是"/myusers") 通过 @EnableZuulProxy 应用程序可以作为一个独立的服务,如果你想设置一个默认路由("/"),比如 zuul.route.home:/将路由所有的请求(例如:"/**") 到"home"服务.

本文内容总结:

原文链接:https://www.cnblogs.com/xd03122049/p/6036318.html