Spring Cloud之GateWay(跨域,限流,鉴权)
2020-06-29 04:40
531 查看
一、概念
不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微服务,增加了客户端的复杂性。 存在跨域请求,在一定场景下处理相对复杂。 认证复杂,每个服务都需要独立认证。 难以重构,随着项目的迭代,可能需要重新划分微服务。 例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。 以上这些问题可以借助网关解决。 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多 的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性。 优点如下: 安全 ,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护。 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。 易于统一认证授权。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。 减少了客户端与各个微服务之间的交互次数。 总结:微服务网关就是一个系统,通过暴露该微服务网关系统,方便我们进行相关的鉴权,安全控制,日志统一处理,易于监控的相关功能。 实现微服务网关的技术有很多: nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。 spring-cloud-gateway, 是spring 出品的 基于spring 的网关项目,集成断路器,路径重写,性能比Zuul好。 //使用gateway这个网关技术,无缝衔接到基于spring cloud的微服务开发中来。 gateway官网: https://spring.io/projects/spring-cloud-gateway
二、跨域(配置即可)
spring: application: name: gateway cloud: gateway: globalcors: cors‐configurations: '[/**]': # 匹配所有请求 allowedOrigins: "*" #跨域处理 允许所有的域 allowedMethods: # 支持的方法 - GET - POST - PUT - DELETE
三、限流
1.实现方案
限流方案有多种:令牌桶算法、漏桶算法、技术算法等等; 这里采用令牌桶算法: 1)所有的请求在处理之前都需要拿到一个可用的令牌才会被处理; 2)根据限流大小,设置按照一定的速率往桶里添加令牌; 3)桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝; 4)请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑, 处理完业务逻辑之后,将令牌直接删除; 5)令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除 令牌,以此保证足够的限流
2.图解
3.代码及配置:
filters: - StripPrefix= 1 # 过滤掉一个前缀路径 - name: RequestRateLimiter #请求数限流 名字不能随便写 args: key-resolver: "#{@ipKeyResolver}" # 令牌解析器 redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率 redis-rate-limiter.burstCapacity: 1 #令牌桶总容量;一般总容量为填充速率的2倍或3倍
@SpringBootApplication @EnableEurekaClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } //在GatewayApplicatioin引导类中添加如下代码,KeyResolver用于计算某一个类型的限 //流的KEY也就是说,可以通过KeyResolver来指定限流的Key @Bean public KeyResolver ipKeyResolver(){ return new KeyResolver() { @Override public Mono<String> resolve(ServerWebExchange exchange) { return Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); } }; } }
四、鉴权
1.方案
鉴权即权限校验,这里采用JWT实现 执行流程: 1. 用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录 2. 用户登录成功,后台管理微服务签发JWT TOKEN信息返回给用户 3. 用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN 4. 网关过滤器解析TOKEN ,判断是否有权限,如果有,则放行,如果没有则返回未认证错误
2.图解
3.测试代码
pom文件中引入相关依赖 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency>
public class JwtTest { public static void main(String[] args) { //获取系统的当前时间 long currentTimeMillis = System.currentTimeMillis(); Date date = new Date(currentTimeMillis+10000); //生成jwt令牌 JwtBuilder jwtBuilder = Jwts.builder() .setId("66")//设置jwt编码 .setSubject("JWT主题")//设置jwt主题 .setIssuedAt(new Date())//设置jwt签发日期 .setExpiration(date) //过期时间设置 .signWith(SignatureAlgorithm.HS256, "irong") .claim("username","admin") .claim("password","123456"); //生成jwt String jwtToken = jwtBuilder.compact(); System.out.println(jwtToken); /*eyJhbGciOiJIUzI1NiJ9 .eyJqdGkiOiI2NiIsInN1YiI6Ium7kemprOeoi-W6j- WRmCIsImlhdCI6MTU4MzI4Nzc3NiwiZXhwIjoxNTgzMjg3Nzc2LCJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIxMjM0NTYifQ .x9ljHiu856h5FQCKNJeu--k2eQV0P4KtntKuHLm9G2A*/ //解析jwt,得到其内部的数据 Claims claims = Jwts.parser().setSigningKey("irong").parseClaimsJws(jwtToken).getBody(); System.out.println(claims); } }
相关文章推荐
- Spring Cloud Gateway——(三)微服务网关实现JWT鉴权
- Spring Cloud Gateway——(二)微服务网关过滤器和网关限流
- Spring Cloud Gateway——(一)微服务网关搭建以及微服务网关跨域
- springcloud-gateway 中对服务的降级、熔断、限流遇见的一个问题
- springcloud gateway 限流
- 【MS】springcloud-gateway 中实现服务之间鉴权,只能从网关访问,禁止直接访问服务
- springcloud gateway使用sentinel进行限流
- Spring Cloud 学习笔记(六)--Gateway 关于IE跨域的坑及实现
- springcloud项目网关升级:gateway替代zuul以及解决gateway跨域访问问题
- 【MS】网关 springcloud-gateway 基于Token限流
- springcloud gateway基于redis令牌桶算法进行微服务的限流保护
- spring cloud gateway请求跨域问题解决方案
- spring cloud Gateway 处理跨域问题
- 微服务SpringCloud之GateWay熔断、限流、重试
- Spring Cloud Gateway 原生的接口限流该怎么玩
- spring cloud gateway 实现接口限流
- 详解Spring Cloud Gateway 限流操作
- SpringCloud gateway跨域配置
- spring cloud gateway整合sentinel实现网关限流
- 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)