spring gateway 学习
为什么需要使用网关
1.实现统一认证
2.统一一个域名,解决调用困难。
3.协议转换 将不友好的协议转成友好的协议。
spring cloud gateway 是什么
是spring cloud 的第二代网关,会替代zuul 第一代网关。
基于 netty,reactor,webflux 构建。
优点:
1.性能强劲 是 zuul 的1.6倍
2.功能强大
内置 监控,限流,转发等
3.设计优雅,容易扩展。
编写spring cloud gateway
增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
网关配置
server:
port: 8040
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务
enabled: true
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
这样网关就编写好了
通过网关访问为微服务
http://网关地址/user-center/user/1
这个将会将请求转发到 http://用户微服务/user/1 的地址。
- id: sytem
uri: lb://jpaas-system
predicates:
- Path=/api-system/**
filters:
- StripPrefix=1
这个作用是,当路径为
/api-system/ 开头的路径,转发到 jpaas-system 的微服务,并将URL 去掉前缀。
spring gateway 的核心概念
1.路由
spring clound gateway 的基础元素,可以理解成为一条转发规则:
包含ID ,目标URL ,Predicate 集合和 Filter 集合。
2.Predicate (谓词)
即 java.util.function.Predicate ,spring cloud gateway 使用谓词实现路由匹配条件
3.Filter 过滤器
修改请求 以及响应
典型的路由配置:
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务
enabled: true
routes:
- id: user_route
uri: lb://user-center
predicates:
- Path=/users/**
- id: content_route
uri: lb://content-center
predicates:
- Path=/shares/**,/admin/**
filters:
- AddRequestHeader=token,0001
包括:
id,uri,predicates,filtres 等
spring gateway 架构图

1. gateway client 是浏览器
2. proxied service 表示 被代理的微服务
3. handler maping 判断路径是否和路由配置匹配。
4.webhandler 会读取这个路由的过滤器,交给过滤器处理。
内置路由谓词工厂

参考文档
http://www.imooc.com/article/290804
自定义谓词工厂
比如限制在 9-17 点才允许访问某个路径
import lombok.Data; import java.time.LocalTime; @Data
public class TimeBeweenConfig {
private LocalTime start;
private LocalTime end;
}
配置代码
自定义谓词工厂代码
@Component
public class TimeBetweenRoutePredicateFactory
extends AbstractRoutePredicateFactory<TimeBeweenConfig> {
public TimeBetweenRoutePredicateFactory() {
super(TimeBeweenConfig.class);
} @Override
public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) {
LocalTime start = config.getStart();
LocalTime end = config.getEnd(); return new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
LocalTime now = LocalTime.now();
return now.isAfter(start) && now.isBefore(end);
}
};
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("start", "end");
}
}
类使用 RoutePredicateFactory 结束,这个是约定。
在配置文件中进行配置。
predicated:
-TimeBetween=上午8:00,下午17:00
网关过滤器配置
http://www.imooc.com/article/290816
内置过滤器介绍。
编写自定义过滤器代码。
@Component
public class PreLogGatewayFilterFactory
extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("请求进来了...{},{}", config.getName(), config.getValue());
ServerHttpRequest modifiedRequest = exchange.getRequest()
.mutate()
.build();
ServerWebExchange modifiedExchange = exchange.mutate()
.request(modifiedRequest)
.build(); return chain.filter(modifiedExchange); }
};
}
}
配置编写为
filters:
-PreLog:a,b
filters:
- StripPrefix=1
StripPrefix 过滤器的作用
当我们访问
/api-user/user/org/osUser/current
配置这个过滤器后,访问路径会被修改为
/user/org/osUser/current
会将前缀进行截取。
全局过滤器介绍
https://www.cnblogs.com/yinjihuan/p/10474768.html
GATEWAY 监控
使用 springboot actuator 进行监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加配置到pom.xml
修改 配置文件:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
配置好后,访问路径都在 /actoator/gateway 下面
在这里我们可以通过 actuator 增加或更新路由。
调试方法
http://www.imooc.com/article/290824
限流
http://www.imooc.com/article/290828
spring gateway 学习的更多相关文章
- Spring MVC 学习 -- 创建过程
Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...
- 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性
2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- Spring security 学习 (自助者,天助之!)
自己努力,何必要强颜欢笑的求助别人呢? 手心向下不求人! Spring security学习有进展哦: 哈哈! 1.页面都是动态生产的吧! 2.设置权限: a:pom.xml配置jar包 b:cr ...
- 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...
- 【转】Spring 注解学习手札(超好的springmvc注解教程)
Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...
- Spring.NET学习
Spring.NET学习笔记——目录(原) 目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) ...
- Spring.net 学习IOC------属性注入
我们就完成我们的第一个spring.net学习IOC的"hello world!". 1> 我们新建一个C# 的控制台项目名为Spring,然后引入Spring.Core.d ...
随机推荐
- 痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法. Keil MDK 想必是嵌入式开发者最熟悉的工具之一了,自 2005 年 Ar ...
- GANF: 用于多时间序列异常检测的图增广归一化流《GRAPH-AUGMENTED NORMALIZING FLOWS FOR ANOMALY DETECTION OF MULTIPLE TIME SERIES》(异常检测、多时间序列、DAG、贝叶斯网络、归一化流)
今天是2022年7月12日,差不多小半个月没看论文了,因为模型一直运行不起来+系统搭建的一塌糊涂,今天干脆摆烂,本咸鱼要去看新的论文了(逃避旧工作,bushi). 对了,我们放暑假了,可是我没放暑假. ...
- Identity – User Login, Forgot Password, Reset Password, Logout
前言 这篇来聊聊常见操作. 会讲到: Create Account Login Logout Change Password Reset Password (by email) External Lo ...
- dfs 验证搜索二叉树——leetcode98
代码来自leetcode官方 一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久...... /** * Definition for a bin ...
- 画布canvas基础 01
1. 什么是canvas canvas是用来绘制图形的.它可以用于动画.游戏画面.数据可视化.图片编辑以及实时视频处理等方面. <canvas width="500" hei ...
- otdolist 案例
1. 渲染默认任务 2. 回车添加任务 3. 删除任务 4. 底部任务数量 5. tab栏切换 6. tab切换显示不同任务 7. 清除已完成的任务 8. 头部全选 9. 删除任务
- 13 Multi-Head Self-Attention(从空间角度解释为什么做多头)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- HttpUtils 详解
一.详解 1.1 介绍 现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见! 传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnect ...
- 什么是前后端分离应用(Full-stack Separation),想当然就会理解错
前后端分离应用指的是将应用的前端部分(用户界面与交互逻辑)和后端部分(业务逻辑.数据处理.服务器响应)拆分成独立的模块,各自通过 API 进行通信.这种架构设计的目的是提高开发效率.增强可扩展性和灵活 ...
- 学习JavaScript第六天
文章目录 1. JavaScript 中的垃圾回收机制(GC) 1.1 垃圾回收相关概念 ① 什么是垃圾 ② 什么是垃圾回收 ③ 垃圾没有及时回收的后果 ④ JavaScript 垃圾回收的常见算法 ...
