一、微服务网关GateWay
1、 Gateway简介
(1) 简介
(2) 核心概念
二、入门案例
1、入门案例
(1)创建工程导入依赖
(2) 配置启动类
(3) 编写配置文件
(4)运行测试
三、路由规则
1、动态路由(面向服务的路由)
(1)添加注册中心依赖
(2)配置动态路由
2、 过滤器
(1)案例改造
1)重写转发路径
2)微服务名称转发
(2)过滤器概述
1) 过滤器基础
01)过滤器的生命周期
02)过滤器类型
2) 局部过滤器
3) 全局过滤器
01)全局过滤器代码实现
02)运行测试
4)统一鉴权
01)鉴权逻辑
02)代码实现
3、网关限流
(1) 常见的限流算法
1) 计数器
2) 漏桶算法
3) 令牌桶算法
(2)基于Filter的限流
1)环境搭建
2)修改application.yml配置文件
3)配置KeyResolver
01)基于请求IP的 127.0.0.1
02) 基于请求参数的限流(规定访问路径的参数)
(3) 基于Sentinel的限流
1)环境搭建
2) 编写配置类
3) 网关配置
4) 自定义异常提示
5)自定义API限流分组
四、 网关高可用
1、 准备多个GateWay工程
2、配置ngnix 1909
1、 Gateway简介
(1) 简介
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式,统一访问接口。
SpringCloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
它是基于Nttey的响应式开发模式。
上表为Spring Cloud Gateway与Zuul的性能对比,从结果可知,Spring Cloud Gateway的RPS是Zuul的1.6倍
路由(route) 路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。
断言(predicates) Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自Http Request中的任何信息,比如请求头和参数等。
过滤器(filter) 一个标准的Spring webFilter,Spring Cloud Gateway中的Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器Filter可以对请求和响应进行处理。
二、入门案例
1、入门案例
(1)创建工程导入依赖
在项目中添加新的模块 gateway_server
,并导入依赖
org.springframework.cloud
spring-cloud-starter-gateway
注意SpringCloud Gateway使用的web框架为webflux,和SpringMVC不兼容。引入的限流组件是hystrix。redis底层不再使用jedis,而是lettuce。
(2) 配置启动类
————————————————
package cn.itbleubox.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayServerApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServerApplication.class, args);
}
}
(3) 编写配置文件
创建 application.yml 配置文件
————————————————
server:
port: 8080 #服务端口
spring:
application:
name: api-gateway-server #指定服务名
#配置SpringCloud Gateway的路由
cloud:
gateway:
routes:
#配置路由: 路由id路由到微服务的uri,断言(判断条件)
id: product-service
uri: http://127.0.0.1:9001
predicates:
Path=/product/**
id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
filters:过滤规则,暂时没用。
(4)运行测试
运行报错
————————————————
SpringCloneGateWay内部是通过netty + webflux 实现的
webflux 实现和SpringMVC存在冲突
我们将父工程的web依赖移动到需要的工程当中,
移动到、
重新运行
运行成功
其他的也重新运行一下
访问:http://localhost:8080/product/1
三、路由规则
Spring Cloud Gateway 的功能很强大,前面我们只是使用了 predicates 进行了简单的条件匹配,其实Spring Cloud Gataway 帮我们内置了很多 Predicates 功能。
在 Spring Cloud Gateway 中 Spring 利用Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。
1、动态路由(面向服务的路由)
和zuul网关类似,在SpringCloud GateWay中也支持动态路由:即自动的从注册中心中获取服务列表并访问。
(1)添加注册中心依赖
在工程的pom文件中添加注册中心的客户端依赖(这里以Eureka为例)
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
(2)配置动态路由
server:
port: 8080 #服务端口
spring:
application:
name: api-gateway-server #指定服务名
#配置SpringCloud Gateway的路由
cloud:
gateway:
routes:
#配置路由: 路由id路由到微服务的uri,断言(判断条件)
id: product-service
#uri: http://127.0.0.1:9001
uri: lb://service-product # lb://代表的是根据微服务名称从注册中心拉取服务请求
predicates:
Path=/product/**
eureka注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
uri : uri以 lb: //开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称
运行测试