- 1,什么是Gateway网关:
- 2,* Gateway网关的搭建/入门:
- 2.1,导入依赖:
- 2.2,编写启动类:
- 2.3,* 编写基础配置和路由规则:
- 2.4,测试:
- http://localhost:10010/user/1时,符合/user/**规则,请求转发到uri:http://userservice/user/1,得到了结果:">2.4.1,启动网关,访问http://localhost:10010/user/1时,符合/user/**规则,请求转发到uri:http://userservice/user/1,得到了结果:
- 2.5,*网关路由的流程图:
- 3,* 路由断言工厂:(Route Predicate Factory)
- 4,* 路由过滤器工厂:(Gateway Filter)
服务网关要和远程服务调用(Feign)配合使用;
1,什么是Gateway网关:
Gateway网关是SpringCloud自家的组件技术;
1.1,网关的功能:
1. **身份验证和权限校验;**
1. **将用户请求路由到微服务,负载均衡;**
1. **请求限流;**
在网关路由规则不符合,就会拒绝访问;
1.2,Gateway和Feign的宏观架构:
1.3,在SpringCloud中的两种网关实现:
1. **Gateway;(推荐)**
1. **Zuul;**
1.3.1,这两种的网关组件区别:
- Zuul是基于Servlet的实现,属于阻塞式编程;而SpringCloudGateway是基于Spring5中提供的WebFlux,属于响应式编程,比Zuul具有更好的性能;
2,* Gateway网关的搭建/入门:
- **Gateway的最佳使用也是和Feign同理,将Gateway单独抽取为一个模块:**
- **结构如下:**
- ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1652607176111-2b7c69b9-2c90-482f-b3a4-049269c6efa4.png#clientId=u41c82a6b-1cec-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=184&id=u7385d299&margin=%5Bobject%20Object%5D&name=image.png&originHeight=237&originWidth=382&originalType=binary&ratio=1&rotation=0&showTitle=false&size=68698&status=done&style=none&taskId=u5e395dc5-636e-4290-8583-fe21f8206f9&title=&width=297)
2.1,导入依赖:
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
2.2,编写启动类:
- SpringBoot创建步骤;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
2.3,* 编写基础配置和路由规则:
2.3.1,在网关路由中可以配置的内容:
- **路由id:路由唯一的标识;**
- **uri:路由目的地,支持 lb 和 http 两种,主要使用 http;**
- **predicate:路由断言,判断请求是否符合要求,符合则转发到路由目的地;**
- **filters:路由过滤器,处理请求或响应;**
- **在模块中的resources目录下编写 application . yml 文件:**
# 网关端口
server:
port: 10010
# 服务名称
spring:
application:
name: gateway
# nacos地址
cloud:
nacos:
server-addr: localhost:80
# 网关的配置
gateway:
routes: # 网关路由配置
- id: userservice # 路由id,自定义,只要唯一即可
# 方式一:路由的目标地址 http就是固定地址
# uri: http://127.0.0.1:8081
# 方式二:lb就是负载均衡(load balancing),后面跟服务名称,表示对这个服务进行路由
uri: lb://userservice
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件,结果通常是真或假
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。 本例中,我们将 /user/开头的请求,代理到lb://userservice,lb是LoadBalanced负载均衡的缩写,根据服务名拉取服务列表,实现负载均衡。注:Path后面是等于,不是冒号,这只是一个字符串**
2.4,测试:
2.4.1,启动网关,访问http://localhost:10010/user/1时,符合/user/**规则,请求转发到uri:http://userservice/user/1,得到了结果:
2.5,*网关路由的流程图:
3,* 路由断言工厂:(Route Predicate Factory)
3.1,在网关路由中可以配置的内容:
- **路由id:路由唯一的标识;**
- **uri:路由目的地,支持 lb 和 http 两种,主要使用 http;**
- **predicate:路由断言,判断请求是否符合要求,符合则转发到路由目的地;**
- **filters:路由过滤器,处理请求或响应;**
application.yml 文件:
spring:
# 网关的配置
gateway:
routes: # 网关路由配置
- id: userservice # 路由id,自定义,只要唯一即可
# 方式一:路由的目标地址 http就是固定地址
# uri: http://127.0.0.1:8081
# 方式二:lb就是负载均衡(load balancing),后面跟服务名称,表示对这个服务进行路由
uri: lb://userservice
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件,结果通常是真或假
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
Path=/user/ # 这个是按照路径匹配,只要以/user/开头就符合要求**
3.2,* 路由断言工厂的介绍:
- **在我们配置文件中写的断言规则仅仅只是字符串,这些字符串必须经过Predicate Factory的处理,才能转变为路由判断的条件;**
- **就如上述的**Path=/user/****是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来进行处理;**
- **其中,像这样的断言工厂在SpringCloudGateway中还有十多种;**
- **作用:读取用户定义的断言条件,对请求做出判断;**
3.2.1,Spring提供的11种基本的断言工厂:
- **官方网站:**[https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#the-after-route-predicate-factory](https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#the-after-route-predicate-factory);到时候要用直接查;
常用:Path; RemoteAddr :被墙的原理;
4,* 路由过滤器工厂:(Gateway Filter)
4.1,什么是过滤器工厂:
- **过滤器工厂是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做出处理:**
- **流程如下:**
- ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1652610956906-d82c6b26-ab19-40cb-8a0d-1707f476dcb7.png#clientId=uba5d6abe-1ef4-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=293&id=uab029141&margin=%5Bobject%20Object%5D&name=image.png&originHeight=293&originWidth=838&originalType=binary&ratio=1&rotation=0&showTitle=false&size=47515&status=done&style=none&taskId=u1921fe46-d4d9-455d-b47b-8ee9b81a41b&title=&width=838)