网关服务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.鉴权功能和业务分离
网关服务spring cloud zuul的更多相关文章
- SpringCloud---API网关服务---Spring Cloud Zuul
1.概述 1.1 微服务架构出现的问题 及 解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...
- 网关服务Spring Cloud Gateway(二)
上一篇文章服务网关 Spring Cloud GateWay 初级篇,介绍了 Spring Cloud Gateway 的相关术语.技术原理,以及如何快速使用 Spring Cloud Gateway ...
- 网关服务Spring Cloud Gateway(一)
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- 网关服务Spring Cloud Gateway(三)
上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...
- Consul集群加入网关服务(Spring Cloud Gateway)
Consul集群加入网关服务 架构示意图 外部的应用或网站通过外部网关服务消费各种服务,内部的生产者本身也可能是消费者,内部消费行为通过内部网关服务消费. 一个内部网关和一个外部网关以及一个Consu ...
- Spring Cloud Zuul 1(API 网关服务)
API网关是一个更为智能的应用服务器,它的存在就像是整个微服架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤. 它实现的功能包括:请求路由.负载均衡.校验过滤等功能. Spring ...
- Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...
- 第七章 API网关服务:Spring Cloud Zuul
API网关是一个更为智能的应用服务器, 它的定义类似于面向对象设计模式中的Facade模式, 它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实现 ...
- Spring Cloud 微服务二:API网关spring cloud zuul
前言:本章将继续上一章Spring Cloud微服务,本章主要内容是API 网关,相关代码将延续上一章,如需了解请参考:Spring Cloud 微服务一:Consul注册中心 Spring clou ...
随机推荐
- EcShop首页显示特定分类的精品新品热销特价等推荐商品
EcShop首页显示特定分类的精品新品热销特价等推荐商品 很多大型的B2C商城都有特定分类专区,该分类下的[分类名称].[推荐子分类 或 推荐品牌].[大图片/推荐单品].[推荐商品].[促销商品]. ...
- centos7.5离线安装Docker及容器运行报OCI runtime create failed 问题定位与解决
前言 接上篇 <记一次centos挂载ceph存储的坑> 服务器重做了centos7.5版本的操作系统,剩下就是安装docker,考虑yum安装耗时较长,我一般都是直接安装二进制版本doc ...
- 单机百万连接调优和Netty应用级别调优
作者:Grey 原文地址:单机百万连接调优和Netty应用级别调优 说明 本文为深度解析Netty源码的学习笔记. 单机百万连接调优 准备两台Linux服务器,一个充当服务端,一个充当客户端. 服务端 ...
- Dart 中的final 和 const
Dart 常量和常量值 final 和 const 两个关键字用来定义常量,有什么区别呢? final 声明的是运行时常量,const声明的是编译时常量 const 可以声明常量值 举个例子: imp ...
- null与undefined到底有啥区别?
话不多说,直接先上结论: null 和 undefined 基本相同,只有细微差别 null 是表示缺少的标识,指示变量未指向任何对象,转为数值为 0 undefined 表示 "缺少值&q ...
- display:none、visibility:hidden,opacity:0三者区别
1. display:none 设置display:none,让这个元素消失 消失不占据原本任何位置 连带子元素一起消失 元素显示:display:block 2. visibility:hidden ...
- Bert文本分类实践(二):魔改Bert,融合TextCNN的新思路
写在前面 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,博主水平有限,只能将平时用到的方法和trick在此做个记录和分享 ...
- javascriptRemke之原型的重要性
前言:JavaScript的原型对象一直是新人学习js的一大重大阻碍,但是原型的知识往往又是面试中常常会被深挖的一个点,为什么会这样呢?本文带你揭秘JavaScript原型的重要性,了解重要性之后再进 ...
- GIS应用|快速开发REST数据服务
随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...
- NX Open 图层说
我也是偶然发现的,在一次调试下,竟然会报警. 所以我写了测试代码,进行测试:结果如下 纳尼???还有271层?还能设置大于256层?NX open可以的.