1、简介
路由转发 + 执行过滤器链。
网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。
基本功能如下:
- 统一入口:暴露出网关地址,作为请求唯一入口,隔离内部微服务,保障了后台服务的安全性
- 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
- 动态路由:动态的将请求路由到不同的后端集群中
2、gateway核心概念
-
路由(Route):由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义。如果断言为真,则路由匹配。
-
断言(Predicate):通过断言匹配http请求中的任何内容(请求头、请求参数等),如果匹配成功,则匹配断言所在路由。
-
过滤器(Filter):在请求前后执行业务逻辑,比如鉴权、日志监控、流量控制、修改请求头、修改响应等。
3、路由
yaml
spring:
cloud:
gateway:
routes:
- id: manager # 路由唯一标识
uri: lb://manager_server # 路由指向目的地URL或服务名,客户端请求最终被转发到的微服务
predicates:
- Path=/manager/** # 断言:以manager开头的请求都负载到manager_server服务
filters:
- RewritePath=/manager/(?<segment>.*), /$\{segment} # 过滤器:过滤掉url里的manager,例如http://ip:port/manager/test -> http://ip:port/test
order: 5 # 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高
4、实战练习
1、项目结构
2、依赖
1、父依赖
xml
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dubbo.version>3.2.0-beta.4</dubbo.version>
<spring-boot.version>2.6.11</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloudalibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、服务提供者依赖(provider)
xml
<dependencies>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
3、网关依赖(gateway)
xml
<dependencies>
<!--gateway-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.2</version>
</dependency>
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--客户端负载均衡loadbalancer-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
3、配置文件
1、服务提供者1配置(provider)
yaml
server:
port: 9002
spring:
application:
name: SpringBoot-Nacos-Dubbo-provider #Nacos注册中心服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #Nacos注册中心地址
服务提供者2复制修改端口即可
2、gateway配置(路由配置方式1)
yaml
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册到nacos中
gateway:
routes:
- id: gateway1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:9002 #匹配后提供服务的路由地址
predicates:
- Path=/provider/** # 断言,路径相匹配的进行路由
4、服务提供者Controller
java
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Value("${server.port}")
private String post;
@GetMapping("/getpost")
public String getPost(){
return "当前端口:"+post;
}
}
5、项目启动
启动服务提供者9002 浏览器访问localhost:8080/provider/getpost
6、gateway配置(路由配置方式2(动态配置))
负载均衡
传统模式
gateway
1、配置文件
yaml
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册到nacos中
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: gateway1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: lb://SpringBoot-Nacos-Dubbo-provider #匹配后提供服务的名称 用于负载均衡
predicates:
- Path=/provider/** # 断言,路径相匹配的进行路由
分别启动服务提供者9002、9001 浏览器访问localhost:8080/provider/getpost 实现负载均衡