四、API网关与Zuul
一、初识API网关
1.
服务对外暴露
通过网关隐藏后端服务
2.使用网关的优点
统一访问出入口,微服务对前台透明
安全、过滤、流控等API管理功能
易于监控、方便管理
二、Spring Cloud API网关
1、API网关
2、API网关产品
Netflix Zuul
Spring Cloud Gateway
3、Netflix Zuul
Zuul 是Netflix开源的一个API网关, 核心实现是Servlet
Spring Cloud内置Zuul 1.x
Zuul 1.x 核心实现是Servlet,采用同步方式通信
Zuul 2.x 基于Netty Server,提供异步通信
4、Netflix Zuul架构演化
Netflix Zuul架构演化
5、Netflix Zuul的功能
认证和安全
性能监测
动态路由
负载卸载
静态资源处理
压力测试
6、Spring Cloud Gateway
Spring Cloud Gateway,是Spring“亲儿子”
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
Gateway基于Spring 5.0与Spring WebFlux开发,采用Reactor响应式设计
7、Netflix Zuul使用入门
1.使用三部曲
依赖spring-cloud-starter-netflix-zuul
入口增加 @EnableZuulProxy
application.yml 增加微服务映射
2.微服务映射
zuul: routes: book-service-api: #网关别名 path: /bs/** #映射路径 serviceId: book-service #微服务ID member-service-api: path: /ms/** serviceId: member-service ...
8、Zuul负载均衡与服务降级
Zuul负载均衡配置 Spring Cloud Zuul内置Ribbon,与标准配置相同 @Bean #全局配置 public IRule ribbonRule(){ return new RandomRule(); } 局部配置 book-service: #目标微服务id ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
9、Zuul配置服务降级
Spring Cloud Zuul内置Hystrix
服务降级实现接口:FallbackProvider
10、基于RateLimit实现网关限流
1.微服务网关流量控制
微服务网关是应用入口,必须对入口流量进行控制
RateLimit是Spring Cloud Zuul的限流组件
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
RateLimit采用“令牌桶”算法实现限流
2.什么是令牌桶
令牌桶示意图
3.RateLimit使用步骤
依赖spring-cloud-zuul-ratelimit
配置存储组件(关系数据库、redis、缓存...)
配置限流策略
11、Zuul的执行过程
1.Zuul的执行过程
Zuul的执行过程
2.Http请求生命周期
image.png
3.Zuul内置过滤器
image.png
12、自定义过滤器
1.需要实现ZuulFilter接口
shouldFilter() - 是否启用该过滤器
filterOrder() - 设置过滤器执行次序
filterType() - 过滤器类型:pre|routing|post
run() - 过滤逻辑
2.Zuul内置过滤器
Zuul内置过滤器
3.Zuul+JWT跨域身份验证
image.png
4.自定义Zuul过滤器
package com.itlaoqi.springcloud.zuul.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class SecurityFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 6; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { //从RequestContext获取上下文 RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String token = request.getHeader("token"); if (token == null || token.trim().equals("")) { //对该请求禁止路由,也就是禁止访问下游服务 ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(403); ctx.setResponseBody("{\"status\":403,\"message\":\"Token not found\"}"); return null; }else{ //校验Token正确性代码 //... ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); return null; } } }
五、springCloud配置中心
一、配置中心的分类
1.Spring Cloud Config
2.携程 Apollo
3.阿里巴巴Nacos
二、微服务改造步骤
1.依赖"spring-cloud-starter-config"
2.删除application.yml,新建bootstrap.yml
3.配置"配置中心"服务地址与环境信息
三、运行时刷新配置参数
1、微服务依赖"spring-boot-starter-actuator";
2、动态刷新类上增加@RefreshScope注解
3、通过/actuator/refresh刷新配置
四、Spring-Retry重试机制
1、通过加入重试机制、提高应用启动的可靠性;
2、重试触发条件1:配置中心无法与仓库正常通信
3、重试触发条件2:微服务无法配置中心正常通信