为什么需要使用网关

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 学习的更多相关文章

  1. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  2. 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性

    2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...

  3. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  4. Spring security 学习 (自助者,天助之!)

    自己努力,何必要强颜欢笑的求助别人呢?  手心向下不求人! Spring security学习有进展哦: 哈哈! 1.页面都是动态生产的吧! 2.设置权限:  a:pom.xml配置jar包 b:cr ...

  5. 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...

  6. 【转】Spring 注解学习手札(超好的springmvc注解教程)

    Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...

  7. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  8. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  9. Spring.NET学习

    Spring.NET学习笔记——目录(原)   目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) ...

  10. Spring.net 学习IOC------属性注入

    我们就完成我们的第一个spring.net学习IOC的"hello world!". 1> 我们新建一个C# 的控制台项目名为Spring,然后引入Spring.Core.d ...

随机推荐

  1. mongo 副本集rs 理解和使用小结

    转载请注明出处: 在MongoDB中,rs(通常指的是"replica set"的缩写)是复制集(Replica Set)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本 ...

  2. ShardingSphere系列(二)——ShardingSphere-JDBC绑定表

    完整的项目示例地址:https://gitee.com/learnhow/shardingsphere/tree/v1.1/jdbc 紧接上一篇文章,这次我们介绍绑定表的概念. 绑定表指分片规则一致的 ...

  3. std::variant快速上手

    std::variant 是 C++17 引入的一种类型安全的联合体,用来存储多个可能类型中的一种值,且保证使用时的类型安全.相比于传统的 union,std::variant 不仅能够存储不同类型的 ...

  4. 逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header

    逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header 搜索示例 搜索 123,网页地址为:https://www.virustotal.com/gui/search/12 ...

  5. DWC3和XHCI的区别

    DWC3(DesignWare USB 3.0 Controller)和XHCI(eXtensible Host Controller Interface)都是与USB控制器相关的技术,但它们的作用和 ...

  6. Java日期时间API系列32-----Jdk8中java.time包中的新的日期时间API类应用,时间工具包 xk-time 1.0.0 版本完成。

    从Java日期时间API系列第一篇博客开始,利用业余时间对Java日期时间API源码进行了系统的.多次的阅读实践,包括Date.LocalDate.LocalDateTime.LocalTime.In ...

  7. 数据库排行榜|当 DB-Engines 遇见墨天轮国产数据库排行

    提到数据库排名,此时脑海里浮现出的是什么?是 DB-Engines,还是墨天轮数据库排行?两者间有什么区别?下面来聊一下业内这两个知名数据库排名平台. 本篇文章约有 3000 字,预计阅读时间 7 分 ...

  8. 在 Azure CNI 中启用 Calico WireGuard

    作者:Peter Kelly 译者:Wendi Wang 注:本文已取得作者本人的翻译授权! 去年6月,Tigera 宣布首次在 K8s 上支持用于集群内加密传输的开源 VPN - WireGuard ...

  9. centos下搭建php开发环境(lamp)

    由于个人非常喜欢爱linux系开发php项目. 因为某些原因,经常需要手动搭建环境 经常在网上找到的教程经常不太一样 虽然最终都能完成搭建,但是总是觉得不太爽 还不如自己写一篇,需要的时候肯定能找到 ...

  10. 哈希(C语言)

    文章目录 1.数据结构--哈希表 1.1哈希表的工作原理 1.2哈希表的代码实现 2.哈希算法 2.1 哈希算法介绍 2.2C语言实现示例 本文介绍一个常用的算法--哈希算法,哈希算法依赖于哈希表来实 ...