网关服务spring cloud zuul
Zuul例子配置文件
spring.application.name=switch-gateway server.port=5555
请求路由
传统路由方式
zuul.routes.api-a-url.path=/api-a-url/** zuul.routes.api-a-url.url=http://localhost:8080
转发规则如下:
访问链接
http://localhost:5555/api-a-url/hello
转发到
http://localhost:8080/hello
上面是单实例配置,多实例配置如下
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service #没有eureka,所以置为false ribbon.eureka.enabled=false hello-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
面向服务的路由方式
结合eureka的发现服务功能,实现如下
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service zuul.routes.api-b.path=/api-b/** zuul.routes.api-b.serviceId=hello-client eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka
分别有服务hello-service和hello-client在eureka上注册
访问链接
http://localhost:5555/api-a/hello
会转发到服务hello-service的某个实例上去
服务路由默认配置规则
如果没有以下配置
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service
则会生成默认的配置如下
http://localhost:5555/hello-service/hello
即网关路径+服务实例名+访问路径
可通过设置如下取消默认配置规则
zuul.ignored-services=*
忽略表达式配置
如果设置了配置项如下
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service
所有访问路径/api-a/**都会被路由,但是如果有一个特定的路径/api-a/abc并不想被路由,则只需要配置如下
zuul.ignored-patterns=/**/abc/**
zuul路由时带上cookie和头部信息
zuul在默认情况下会过滤掉http请求头信息的一些敏感信息,防止传递到下游服务器。默认的敏感头信息通过zuul.sensitiveHeaders参数定义,包括Cookie、set-cookie、authorization三个属性。所以cookie在默认的zuul中是不会传递的,这样会影响到一些登录鉴权的场景。可以通过以下设置,让cookie可以传递:
zuul.routes.<router>.customSensitiveHeaders=true 或者 zuul.routes.<router>.sensitiveHeaders=
Hystrix和Ribbon支持
Zuul本身就有线程隔离和断路器的自我保护功能,以及负载均衡功能(前提是配置采用path和serviceId的方式)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=120000
该参数可以用来设置api网关中路由转发请求的hystrixCommand执行超时时间
ribbon.ConnectTimeout=60000
该参数用来设置路由转发请求的时候,创建请求链接的超时时间。如果该值小于第一个值如果链接超时会自动重试,重试失败会抛出错误。
ribbon.ReadTimeout=60000
该参数用来设置路由转发请求的超时时间。如果该值小于第一个值如果链接超时会自动重试,重试失败会抛出错误。
如果不想要重试机制,可以如下配置
zuul.retryable=false zuul.routes.<router>.retryable=false
第一个是关闭全局的,第二个是关闭指定的。
Zuul过滤器详解
过滤器的类别有
pre:可以在请求被路由之前调用
route:在路由被请求时调用
post:在route和error过滤器之后调用
error:处理请求时发生错误时被调用
路由请求时发生异常后自定义处理方法,可以定义个error类型的filter来实现。
可以通过以下配置项,来禁用过滤器
zuul.<SimpleClassName>.<filterType>.disable=true
请求过滤拦截
在路由转发前实现token、权限等鉴权验证(场景例如:普通操作人员oper可以访问/order/**,不可以访问/refund/**链接,超级管理人员admin可以访问所有)
@Component public class AccessControlFilter extends ZuulFilter { @Override public boolean shouldFilter() { //该过滤器是否需要被执行 return true; } @Override public Object run() throws ZuulException { //过滤器的具体逻辑 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest req = rc.getRequest(); //根据req参数做权限校验 String accessType = req.getParameter("accessType"); if(!StringUtils.equals("success", accessType)) { //拒绝通过 rc.setSendZuulResponse(false); rc.setResponseStatusCode(401); rc.setResponseBody("自定义返回内容"); return null; } //可以通过 return null; } @Override public String filterType() { //过滤器类型,pre代表会在请求被路由之前执行 return "pre"; } @Override public int filterOrder() { //过滤器的执行次序 return 0; } }
总结网关的有点如下:
1.屏蔽所有微服务的实现细节,提供统一入口
2.与微服务治理框架结合,实现自动化服务实例维护和负载均衡
3.鉴权功能和业务分离
最新文章
- Android开发之基于AndroidStudio环境搭建和工程创建
- 关于JS的prototype
- 【C语言学习】《C Primer Plus》第12章 存储类、链接和内存管理
- AJAX联想查询的例子
- javascript模块化编程(AMD规范的加载器)
- 观察者模式(Observer)
- 三栏布局的n种实现
- (转)实战p12文件转pem文件
- Roland钢琴开发中音符值、度、与音名之间的转换算法
- SecureCRT中vim乱码问题
- C#温故而知新系列 -- 闭包
- GO 基础
- Docker容器和本机之间的文件传输
- 浅探网络1---tcp协议详解(三次握手和四次挥手)
- python类型错误:can only concatenate list (not ";str";) to list
- vue-simple-uploader上传插件
- React Native(七)&mdash;&mdash;react-native-elements
- Pycharm模板添加默认信息
- linux系统下安装两个或多个tomcat
- UVA-1601 The Morning after Halloween(BFS或双向BFS)
热门文章
- 有个计算机专业的学妹问我:我这个zip文件密码破解运行起来为什么内存爆了?
- jmeter之聚合报告(Aggregate Report)
- quicksort 快速排序 quick sort
- requests接口自动化-动态关联text/html格式
- libcurl 概述(翻译)
- 在自己的项目中使用PCL
- [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统
- P6640-[BJOI2020]封印【SAM,二分】
- 通用JS七
- Dapr + .NET Core实战(十一)单机Dapr集群