上一篇已经讲了微服务组件中的 分布式配置中心,本章讲述 由JAVA编写的服务路由网关
Zuul
…
- Zuul
路由是微服务体系结构的一个组成部分。例如 /
可以映射到您的Web应用程序,/api/users映射到用户服务,/api/shop映射到商店服务。Zuul是Netflix的基于JVM的开发的路由和服务器端负载均衡器。
为什么需要服务网关?
如果没有服务网关,多个服务提供给前端调用地址管理错综复杂,增加了客户端的复杂性,认证也相对麻烦,每个服务都需要编写相同的认证….
画图工具:https://www.processon.com/
Zuul 可以做什么?
- 身份认证
- 审查与监控
- 压力测试
- 金丝雀测试
- 动态路由
- 服务迁移
- 负载分配
- 安全
- 静态响应处理
- 主动/主动流量管理
Zuul的规则引擎允许基本上写任何JVM语言的规则和过滤器,内置Java和Groovy的支持。
注意:配置属性
zuul.max.host.connections
已被取代的两个新的属性,zuul.host.maxTotalConnections
并且zuul.host.maxPerRouteConnections
它的缺省值分别200和20。
注意:所有路线的默认Hystrix隔离模式(ExecutionIsolationStrategy)为
SEMAPHORE
。zuul.ribbonIsolationStrategy
如果此隔离模式是首选,可以更改为THREAD
。
官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_router_and_filter_zuul
- 准备工作
1.启动Consul
2.创建 battcn-gateway-service
和 battcn-hello-service
- battcn-gateway-service
1.在项目 pom.xml 中添加 ZUUL 依赖
1
|
<dependencies>
|
2.App.java中开启 zuul 代理
1
|
|
3.zuul.routes.routesName.ZuulProperties.ZuulRoute
配置的方式,详细可以参考源码org.springframework.cloud.netflix.zuul.filters.ZuulProperties
1
|
server:
|
- battcn-hello-service
hello-service 只需要以下依赖,能注册到consul中就行(单纯的一个服务)
1
|
<dependencies>
|
1
|
|
1
|
server:
|
- 测试一把
访问:http://localhost:9000/api-hello/hello 从地址中可以看出我们访问的是 battcn-gateway-service
,且满足 zuul.routes.routesName.path
规则,因此实际请求地址是http://localhost:9001/hello
1
|
hello:battcn-hello-service #表示请求成功
|
- 自定义过滤器
1
|
import com.netflix.zuul.ZuulFilter;
|
实际开发中
token
应该从请求头中获取,该处只是为了方便演示效果
访问:http://localhost:9000/api-hello/hello?token=1
1
|
hello:battcn-hello-service
|
访问:http://localhost:9000/api-hello/hello
1
|
token cannot be empty
|
- 路由映射流程
图不是很严谨,凑合着看看吧…
初次启动项目我们可以看到
1
|
2017-08-14 17:19:06.090 INFO 11544 --- [nio-9000-exec-1] o.s.c.n.zuul.web.ZuulHandlerMapping : Mapped URL path [/api-hello/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]
|
有兴趣的还可以阅读下
com.netflix.loadbalancer.LoadBalancerContext
,通过它可以发现每次请求的IP和端口,需要在application.yml
中配置
1
|
logging:
|
1
|
2017-08-14 17:32:16.793 DEBUG 14316 --- [nio-9000-exec-7] c.n.zuul.http.HttpServletRequestWrapper : Path = null
|
- Zuul Fallback
定义
GatewayZuulFallback
实现ZuulFallbackProvider
接口
1
|
/**
|
步骤:停掉 battcn-hello-service
启动 battcn-gateway-service
访问:http://localhost:9000/api-hello/hello?token=1
显示:
1
|
Internal Server Error # 代表Fallback成功
|
- 路由配置详解
zuul 相关的官方文档还是比较其全了,本文也是参考官方然后简单讲述应用场景,具体开发请结合自身业务扩展….
1.自定义指定微服务路径,以下两种配置方式结果相同
1
|
zuul:
|
2.忽略指定服务,多个服务逗号分隔,Set<String> ignoredServices
这样一来zuul就会忽略service1和service2,只会代理其它的
1
|
zuul:
|
3.指定Path和Url
1
|
zuul:
|
4.使用Zuul但不指定Url(该方式在Eureka有效,Consul还未找到解决方法…)
1
|
zuul:
|