一、什么是微服务网关?
网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做。
微服务网关是一个系统,通过暴露该微服务网关系统,方便我们进行相关的鉴权,安全控制,日志统一处理,易于监控的相关功能。
二、关于gateway的一些操作。
- 跨域配置
spring:cloud:gateway:globalcors:cors-configurations:'[/**]':# 匹配所有请求allowedOrigins:"*"#跨域处理 允许所有的域allowedMethods:# 支持的方法- GET- POST- PUT- DELETE
- 路径匹配过滤配置
假如请求以/user/路径开始的请求都直接交由
http://localhost:8081
(用户微服务)处理,则当请求为http://localhost:8001/user
时,会转发到用户微服务上进行处理。
routes:-id: changgou_goods_routeuri: http://localhost:8081predicates:- Path=/user/**
- PrefixPath过滤配置
加上前缀/user,比如请求
http://localhost:8001
,实际是请求http://localhost:8081/user
的结果。
routes:-id: changgou_goods_routeuri: http://localhost:8081predicates:- Path=/**filters:- PrefixPath=/user
- StripPrefix过滤配置
请求路径为/api/user,而真实的路径是/user。即去掉api,才是真实路径,可以使用StripPrefix来过滤。
routes:-id: changgou_goods_routeuri: http://localhost:8081predicates:- Path=/**filters:- StripPrefix=1
- LoadBalancerClient路由过滤器(负载均衡)
路由配置每次都会将请求给指定的
URL
处理,若在生产环境中,并发量较大的时候,则需要根据服务的名称判断来做负载均衡操作,可以使用LoadBalancerClientFilter
来实现负载均衡调用。
LoadBalancerClientFilter
会作用在url以lb开头的路由,然后利用loadBalancer
来获取服务实例,构造目标requestUrl
,设置到GATEWAY_REQUEST_URL_ATTR
属性中,供NettyRoutingFilter
使用。
routes:-id: changgou_goods_routeuri: lb://user#微服务服务名
- 网关限流(令牌桶算法)
(1)所有请求前需要先拿到一个可用的令牌才会被处理。
(2)根据限流大小,按照一定速率往桶里添加令牌。
(3)桶设置最大令牌数,当桶满时,新添加的令牌则被丢弃或拒绝。
(4)请求达到后首先获取令牌桶里的令牌,拿着令牌才可进行其他业务逻辑处理,处理完成之后,将令牌直接删除。
(5)令牌桶有最低限额,当令牌达到最低限额时,请求处理之后不会删除令牌,以保证足够的限流。
spring cloud gateway 默认使用redis的RateLimter限流算法来实现。
- 6.1 引入redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.1.3.RELEASE</version></dependency>
- 6.2 定义KeyResolver
(在引导类中添加代码,KeyResolver用于计算某一个类型的限流的KEY也就是说,可以通过KeyResolver来指定限流的Key。比如:可以根据IP来限流,每个IP每秒钟只能请求一次,在GatewayWebApplication定义key的获取,获取客户端IP,将IP作为key。)
/***
* IP限流
* @return
*/@Bean(name="ipKeyResolver")publicKeyResolveruserKeyResolver(){returnnewKeyResolver(){@OverridepublicMono<String>resolve(ServerWebExchange exchange){//获取远程客户端IPString hostName= exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();System.out.println("hostName:"+hostName);returnMono.just(hostName);}};}
- 6.3 指定限制流量的配置
routes:-id: changgou_goods_routeuri: lb://userpredicates:- Path=/api/user**filters:- StripPrefix=1-name: RequestRateLimiter#请求数限流 名字不能随便写 ,使用默认的facatoryargs:#指定使用哪一个KeyResolverkey-resolver:"#{@ipKeyResolver}"#这是令牌桶填充的速率redis-rate-limiter.replenishRate:1#指令牌桶的容量redis-rate-limiter.burstCapacity:1#表示一秒内,允许一个请求通过,#令牌桶的填充速率也是一秒钟添加一个令牌。#最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。