出国需要过海关
网关:网络的关卡
1:路由转发
2:安全控制 保护每个服务,不需要将每个暴露出去
3:负载均衡
1.没有网关:客户端直接访问我们的微服务,会需要在客户端配置很多的port,如果
user-service并发比较大,则无法完成负载均衡
2.有网关:客户端访问网关,网关来访问微服务,(网关可以和注册中心整合,通过服务名
称找到目标服务)这样只需要使用服务名称即可访问微服务,可以实现负载均衡,可
以实现token拦截,权限验证,限流等操作
网关的核心是一组过滤器,按照先后顺序来执行过滤操作
web三大组件 servlet、listener filter 过滤器
interceptor拦截器 springmvc主要拦截进入controller的请求
gateway的核心逻辑就是路由转发 +执行过滤器链
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 以后也支持异步了
路由信息的组成:
由一个ID、一个目的URL、一组断言工厂、一组Filter组成。
如果路由断言为真,说明请求URL和配置路由匹配。
Java8中的断言函数。lambda|
四大接口供给形,消费性,
函数型,断言型
Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的
ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于
Http Request中的任何信息比如请求头和参数。
一个标准的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中
启动应用,访问 使用应用名称/路径即可。(再上线新服务,网关不用重启)
断言就是匹配规则,匹配上了,返回结果。匹配不上,404。
断言 after,在这个时间点之后,才能访问。可用于如双12零点之后才可以访问这种业务场景
通俗的说,限流就是限制一段时间内,用户访问资源的次数,减轻服务器压力,限流大致分为 两种:
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。
org.springframework.boot
spring-boot-starter-data-redis-reactive
IP地址限流
按照路径限制
网关可以实现跨域,路由(动态路由,负载均衡)ip 黑名单拦截,Token 的校验,对请求进行过滤(请求 参数校验) 对响应做处理(状态码,响应头) 熔断 限流
微服务的网关,可以很好地将具体的服务和浏览器隔离开,只暴露网关的地址给到浏览器 在微服务网关中,可以很好的实现校验认证,负载均衡(lb),黑名单拦截,限流等