springcloudAlibaba API网关SpringcloudGateway学习笔记
共 3888字,需浏览 8分钟
·
2020-12-04 15:49
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
一、概述
服务发现,让内容中心总能找到与用户中心
内容中心整合ribbon,实现负载均衡
使用feign,让HTTP的远程调用更加优雅
使用sentinel,提升应用的可用性以及容错性
使用spring消息编程模型、stream消息编程模型,实现了基于rocketMQ的通信
下图为小程序直接调用微服务:
认证复杂,登录需要验证,若使用此模式,则需要在内容中心、用户中心上做登录认证
导致客户端难以重构,随着项目迭代,可能需要重新划分微服务,若微服务域名什么都变了,则客户端就要做大量的改动
其他微服务使用了某种浏览器不友好协议,直接访问访问不了
使用服务(API)网关:
可以在API网关做统一认证,再将请求进行转发到后端微服务
采用这样的方式,对外暴露的永远是一个域名,不论内部微服务如何拆分,域名都不会变,这样客户端重构成本大大降低
其他微服务为浏览器不友好协议,可以在网关上边转换为有好的协议,如HTTP、websocket
二、spring cloud gateway
是spring cloud的网关(第二代),未来取代Zuul(第一代)
基于Netty、Reactor以及WebFlux构建
① Netty:网络通信框架,可以实现高性能的服务端以及客户端
② Reactor:是一个Reactive模型的编程实现优点:
① 性能强劲,是zuul的1.6倍 性能PK
② 功能强大,内置了很多实用功能,比如转发、监控、限流等
③ 设计优雅,易扩展缺点:
① 依赖Netty与Webflux,不是Servlet编程模型,有一定的学习成本
② 不能在Servlet容器中工作,无法构建war包(只能打成jar包),部署到tomcat
③ 不支持spring boog 1.x
三、网关搭建
新建spring boot项目
加依赖
org.springframework.cloud
spring-cloud-starter-gateway
加注解:无
写配置:
server:
port: 8040
# 应用程序名称
spring:
application:
name: gateway
cloud:
# 服务发现
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
# 让gateway通过服务发现找到其他的微服务
enabled: true
# actuator
management:
# 展示详细信息
endpoint:
health:
show-details: always
# 暴露所有端点
endpoints:
web:
exposure:
include: '*'
以上,已通过spring cloud gateway实现了对微服务的反向代理,并且还能总结转发规律
四、核心概念
route(路由):spring cloud gateway 基础元素,可简单理解成一条转发规则。包含如下
id
目标url
predicate(谓词):即java.util.function.predicate,spring cloud gateway使用predicate实现路由的匹配条件
filter(过滤器):修改请求即响应
配置示例:
1、架构
gateway client:不是严格意义上的客户端,泛指外部请求
proxied service:被代理的微服务
gateway mapping:会判断请求的路径是否匹配路由的配置
gateway Handler:如果mapping匹配成功,Handler会读取这个路由上的所有过滤器,然后把请求交给过滤器处理
2、内置路由谓词工厂详解
(route predicate factories)使用手记
3、自定义路由谓词工厂
写配置
代码示例
@Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {
public TimeBetweenRoutePredicateFactory() {
super(TimeBetweenConfig.class);
}
@Override
public Predicate apply(TimeBetweenConfig config) {
LocalTime start = config.getStart();
LocalTime end = config.getEnd();
return serverWebExchange -> {
LocalTime now = LocalTime.now();
return now.isAfter(start) && now.isBefore(end);
};
}
@Override
public List shortcutFieldOrder() {
return Arrays.asList("start","end");
}
}
@Data
class TimeBetweenConfig {
private LocalTime start;
private LocalTime end;
}
配置不生效问题解决:对 url:lb://user-center 使用理解错误
错误理解是带user-center都会匹配此规则
正确理解是http://localhost:8040将会被转发到http://user-center 通过nacos自动获取地址
4、内置过滤器工厂
Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)
5、自定义过滤器工厂
写配置
代码示例
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
public PreLogGatewayFilterFactory() {
}
public GatewayFilter apply(NameValueConfig config) {
GatewayFilter filter = (((exchange, chain) -> {
log.info("请求进来了...{}={}",config.getName(),config.getValue());
ServerHttpRequest modifiedRequest = exchange.getRequest().mutate().build();
ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
return chain.filter(modifiedExchange);
}));
return new OrderedGatewayFilter(filter,1000);
}
}
6、全局过滤器
Spring Cloud Gateway-全局过滤器(Global Filters)
过滤器顺序
order越小越靠前执行
局部过滤器的order,会按照配置顺序,按1开始递增
若配置了默认过滤器,会按照配置顺序,按1开始递增,默认过滤器会比局部过滤器优先
如需自行控制order,可返回OrderedGatewayFilter
五、整合容错服务
1、gateway默认整合Hystrix,配置如下
六、监控
Spring Cloud Gateway监控
排错、调试技巧总结
七、限流
Spring Cloud Gateway限流详解
Unable to find GatewayFilterFactory with name RequestRateLimiter报错:
要添加redis依赖
添加了还报错,仔细检查,是否写错位置,写到节点下
八、总结
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/lzf2284466/article/details/109895210
粉丝福利:实战springboot+CAS单点登录系统视频教程免费领取
???
?长按上方微信二维码 2 秒 即可获取资料
感谢点赞支持下哈