一。 zuul介绍
路由是微服务架构的不可或缺的一部分。例如:”/” 可能映射到你应用主页,/api/users映射到用户服务,/api/shop映射到购物服务。Zuul。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器
当一个UI应用想要代理调用一个或者多个后台服务的时候,Sping cloud创建了一个嵌入的Zuul proxy很方便的开发一个简单的案例。这个功能对于代理前端需要访问的后端服务非常有用,避免了所有后端服务需要关心管理CORS和认证的问题.
zuul路由 虽然方便了前端应用 依然带来其他问题 所有的请求和响应都经过zuul路由 zuul的带宽需要是后台服务所有请求流量的总和 并发量的过大
也可能导致zuul路由的崩溃 同时考虑zuul路由的高可用性
二 。zuul反向代理
1>实现反向代理
实现反向代理 给多个服务添加路由
演示环境 代码沿用springcloud记录篇4环境
添加一个新项目 名称为zuul 添加zuul的maven依赖 zuul需要发现eurekaserver上的服务 必须包含eureka发现组件
zuul包含了 web组件 无需额外添加
添加 application.yml 默认配置如下
添加运行类 ZuulApplication 该类 如果需要启用反向代理 必须添加注解@EnableZuulProxy 该注解是个混合注解 源代码上 被注解了断路器和自动发现
主类代码如下:
依次启动 eurekaserver eurekapub eurekaconsume,zuul
默认情况 zuul给所有被发现的服务都提供了默认的路由 路由名称为服务id小写 访问路由的方式是
比如访问eurekaconsume(serviceid是myclient)的getUser方法:
访问eurekapub(service是idserver)的getId方法
2>使用不同的路径映射
假设需要给 eurekaconsume服务 添加一个路由 所有的资源访问 通过 /ec/ 路由访问
eurekapub服务 添加一个路由 所有资源访问 通过 /ep/路由访问
以下两种方式(application.yml配置)都可
方式1:
比如可以配置eurekaconsume(注册服务id是MYCLIENT)如下
就可以通过zuul来访问 http://localhost:8890/zuul/ec/所有eurekaconsume提供的服务方法
比如http://localhost:8890/zuul/ec/getUser?id=1 成功访问
方式2:
可以实现更加细粒度的控制 可以给每组映射取一个别名
通过地址访问 http://localhost:8890/zuul/ep/getId 正常访问
如果需要忽略其他的service路由 只允许配置的 可以通过ignoredServices
如果按照以上配置 默认的通过serviceid的路由都失效了 只能访问 myclient服务 通过 /ec
如果需要使用正则表达式 映射特定规则的服务id 使用特定规则的地址 可以使用 java代码进行定义 添加配置类
在扫描环境下
访问 http://localhost:8890/zuul/my/lient/getUser?id=1 成功
窒息模式和本地跳转(Strangulation Patterns and Local Forwards)
常见的迁移旧应用或者旧接口的方式,就是逐步的替换它的实现。 Zuul代理是一种很有用的工具, 因为你可以使用这种方式处理所有客户端到旧接口的请求. 只是重定向了一些请求到新的接口.
实例
修改eurekaconsume 添加一个Controller的类
重启 eurekaconsume
配置 zuul项目
最后一个legacy表示 serviceid是myclient应用所有路径 都可以直接通过 /zuul/路径访问
consume的controller类暴露了以下方法
假设/my 这个路径迁移到了 http://blog.youkuaiyun.com/liaomin416100569
当 访问 http://localhost:8890/zuul/my/arcticle/detail/78179404
不在显示之前的内容 会被重定向到 http://blog.youkuaiyun.com/liaomin416100569/arcticle/detail/78179404
假设 /p下所有路径都迁移到/p1下
http://localhost:8890/zuul/p/getUser/1 应该被转发到同一个应用的 http://localhost:8890/zuul/p1/getUser/1下
以上yml配置可以实现以上两种情况
三 。zuul上传文件
参考官方文档(http://cloud.spring.io/spring-cloud-static/Dalston.SR4/single/spring-cloud.html#_uploading_files_through_zuul)
四 。zuul过滤器
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
(1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
(2) ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
(3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
(4) ERROR:在其他阶段发生错误时执行该过滤器。
。
实例演示一个简单的pre过滤器
比如 zuul需要定义一个路由 http://localhost:8890/zuul/cli/getUser?id=1
application.xml中定义了
但是没有定义举例的serviceId 希望当用户访问时 添加参数来决定 具体的serviceId
http://localhost:8890/zuul/cli/getUser?id=1&serviceId=myclient
具体实现
application.yml定义
http://localhost:8890/zuul/cli/getUser?id=1&serviceId=myclient 成功
http://localhost:8890/zuul/cli/getUser?id=1 失败 报错(没有serviceId)
其他filter可以参考ZuulFilter子类
如果希望禁用某些filter
比如