概述简介
了解地址官网:
1.上一代zuul1.x :https://github.com/Netflix/zull/wiki
2.gatway https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/
是什么?
cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用zuul网关,但是2.x版本中,zuul一直处于维护中,后来springcloud自己研发了一个网关代替zuul。
就是springcloud gateway一句话:gateway是原来zuul1.x版本的替代。
springcloud gateway是基于webflux框架实现的,而webflux框架底层则是使用了高性能的Reactor模式通信框架Netty
springcloud gateway的目标是提供统一的路由方式且基于Fileter链的方式提供了网关基本的功能,例如:安全,监控/指标和限流。
一句话:springcloud gateway使用的时Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。在高并发、非阻塞式响应式通讯中非常有优势。
能干啥
2.鉴权
3.流量控制
4.熔断
5.日志监控
6.。。。
为什么选择gateway?
1.zuul迟迟不发布新版本。
比zuul更简单,而且是springcloud团队研发,亲儿子值得信赖;gateway是基于异步非阻塞模型上进行研发,性能方面不需要担心,虽然zuul2.x早就发布了,但是springcloud模式没有整合计划。
2.springcloud gateway具有如下特性:
(1)基于spring framework 5,project reactor和springboot2.0进行构建。
(2)动态路由,能够匹配任何请求属性
(3)可以对路由进行Predicate(断言)和Filter(过滤)
(4)集成springcloud服务发现功能
(5)集成Hystrix的断路由器功能
(6)易于编写Predicate(断言)和Filter(过滤)
(7)请求限流功能
(8)支持路径重新。
1.Route(路由)
路由是构建网关的基本模块,它是由ID,目标URL,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
2.Predicate(断言)
参考java8的java.util.function.Predicate
开发人员可以再匹配HTTP请求中的所有内容(例如请求头、请求参数),如果请求与断言相匹配,则进行路由。
3.Filter(过滤)
指的是spring框架中GatewayFiltere的实例,使用过滤器,可以再请求被路由前或者后对请求进行修改。
4.总体
web请求,通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行一些精细化的控制。
predicate就是我们的匹配条件;
filter就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标uri,就可以实现一个具体的路由了
环境搭建
(1)创建名为cloud-gateway-gateway9527的module
(2)修改POM文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.seegot.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-gateway-gateway9527</artifactId> <dependencies> <!--引入gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--gateway也是需要注册到服务中心的--> <!--注入eureka client 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--网关依赖中,不需要这些配置--> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>--> <!--引入热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
(2)编写application.yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_routh #路由的ID,没有固定规则,但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址 没有进行负载均衡
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2 #payment_routh #路由的ID,没有固定规则,但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client: # 服务提供者provider注册金eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
(3)修改主入口程序
package com.atguigu.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * @program: cloud2020 * @description: * @author: PP Zhang * @create: 2020-06-18 13:19 */ @SpringBootApplication @EnableEurekaClient public class GatewayMain9527 { public static void main(String[] args) { SpringApplication.run(GatewayMain9527.class,args); } }
(4)测试
需要注意的是,我提前已经创建了注册中心模块和服务生产者模块。
http://localhost:9527/payment/lb