网关
出国需要过海关
网关:网络的关卡
网关的作用
1:路由转发
2:安全控制 保护每个服务,不需要将每个暴露出去
3:负载均衡
1.没有网关:客户端直接访问我们的微服务,会需要在客户端配置很多的port,如果
user-service并发比较大,则无法完成负载均衡
2.有网关:客户端访问网关,网关来访问微服务,(网关可以和注册中心整合,通过服务名
称找到目标服务)这样只需要使用服务名称即可访问微服务,可以实现负载均衡,可
以实现token拦截,权限验证,限流等操作
网关的核心是一组过滤器,按照先后顺序来执行过滤操作
web三大组件 servlet、listener filter 过滤器
interceptor拦截器 springmvc主要拦截进入controller的请求
gateway的核心逻辑就是路由转发 +执行过滤器链
Gateway 和 zuul 的区别 ZuulFilter
Zuul 也是 web 网关,本质上就是一组过滤器,按照定义的顺序,来执行过滤操作 二者的区别:
1. 两者均是 web 网关,处理的是 http 请求
2. Gateway 是 springcloud 官方的组件,zuul 则是 netflix 的产品
springcloud,netflix ,alibaba(nacos,sentinel,dubbo zk,seata,rocketmq)
3. gateway 在 spring 的支持下,内部实现了限流、负载均衡等,扩展性也更强,但同时也 限制了仅适合于 Spring Cloud 套件。而 zuul 则可以扩展至其他微服务框架中,其内部没有 实现限流、负载均衡等。
4. Gateway(Netty NIO)很好的支持异步(spring5.x ,webFlux 响应式编程默认是异步的), 而 zuul1.0 仅支持同步 BIO zuul2.0 以后也支持异步了
Spring Cloud Gateway三大核心概念
Route(路由)(重点和eureka结合做动态路由)
路由信息的组成:
由一个ID、一个目的URL、一组断言工厂、一组Filter组成。
如果路由断言为真,说明请求URL和配置路由匹配。
Predicate(断言)(就是一个返回bool的表达式)
Java8中的断言函数。lambda|
四大接口供给形,消费性,
函数型,断言型
Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的
ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于
Http Request中的任何信息比如请求头和参数。
Filter(过滤)(重点)
一个标准的Spring WebFilter。
web三大组件(servlet listener filter)
mvc
interceptor
Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
一个是针对某一个路由的filter对某一个接口做限流
一个是针对全局的filter token ip黑名单
gateway网关是项目级别的,nginx是服务器级别的。
nginx就像医院的前台,gateway是一个科室的前台。
快速入门
先建一个module,再在module上建包
新建一个包
gateway-server的配置
直接访问80端口+path即可转发请求至对应controller
网关的集群
再改nginx配置文件
代码方式写路由
访问localhost/guochuang,会跳转对应uri
代码方式写路由,和配置文件不冲突,两者可以共存
动态路由
如果一个服务有100个路径,只用配置文件写就很麻烦
解决:结合eureka实现动态路由
1)在gatewayserver里添加配置,添加eureka。
改为用应用名称
2)将服务注册到eureka中
启动应用,访问 使用应用名称/路径即可。(再上线新服务,网关不用重启)
predicate断言工厂的使用
断言就是匹配规则,匹配上了,返回结果。匹配不上,404。
断言 after,在这个时间点之后,才能访问。可用于如双12零点之后才可以访问这种业务场景
过滤
黑名单拦截
token校验
gateway集成redis做限流
什么是限流
通俗的说,限流就是限制一段时间内,用户访问资源的次数,减轻服务器压力,限流大致分为 两种:
1. IP 限流(5s 内同一个 ip 访问超过 3 次,则限制不让访问,过一段时间才可继续访问) 2. 请求量限流(只要在一段时间内(窗口期),请求次数达到阀值,就直接拒绝后面来的访问了, 过一段时间才可以继续访问)(粒度可以细化到一个 api(url),一个服务)
本次限流模型
限流模型:漏斗算法 ,令牌桶算法,窗口滑动算法 计数器算法
入不敷出
1)、所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
2)、根据限流大小,设置按照一定的速率往桶里添加令牌;
3)、桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝; 4)、请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完 业务逻辑之后,将令牌直接删除; 5)、令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令 牌,以此保证足够的限流;
Spring Cloud Gateway 已经内置了一个 RequestRateLimiterGatewayFilterFactory,我们 可以直接使用。 目前 RequestRateLimiterGatewayFilterFactory 的实现依赖于 Redis,所以我们还要引入 spring-boot-starter-data-redis-reactive。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
创建配置类 RequestRateLimiterConfig
配置文件
IP地址限流
连续访问,会被限流。429是请求限制的意思。
按照路径限制
总结
网关可以实现跨域,路由(动态路由,负载均衡)ip 黑名单拦截,Token 的校验,对请求进行过滤(请求 参数校验) 对响应做处理(状态码,响应头) 熔断 限流
微服务的网关,可以很好地将具体的服务和浏览器隔离开,只暴露网关的地址给到浏览器 在微服务网关中,可以很好的实现校验认证,负载均衡(lb),黑名单拦截,限流等