前言
由于微服务项目里包含了众多的服务,每个服务都有自己的IP地址和端口,当前端想要调用服务时极其不方便,需要知道每个服务的ip。如果在前端对每个请求地址都配置绝对路径,非常不利于系统维护。这时可以用网关解决问题,当然网关的作用不止解决服务调用问题,它还有路由转发,过滤器功能,集成断路器,集成服务发现,集成服务发现,请求转发等功能。
路由转发:Spring Cloud Gateway 可以根据请求的特定条件(如 URL路径、请求参数、请求头等)来将请求转发到后端的多个服务,并支持动态路由配置。
过滤器功能:Gateway 提供了一套过滤器机制,允许开发人员对请求进行修改和验证,以及应用各种策略,如认证、安全、监控/指标、限流、日志、请求转发/重试等。
集成断路器:可以集成断路器,比如 Netflix Hystrix,为微服务网关提供了容错处理的功能。
集成服务发现:Gateway 可以与服务注册中心集成,动态从服务注册中心获取服务信息并进行路由。
请求转发:Gateway 可以进行请求的协议转换,例如将 HTTP 请求转换成 WebSocket 请求。
请求限流:Gateway 支持通过配置限流规则,对请求进行限流,防止恶意请求或异常情况下的流量冲击。
一、SpringCloud Gateway 是什么?
SpringCloud Gateway 它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。Spring Cloud Gateway 底层使用了高性能的通信框架Netty。
二、搭建一个网关
1.引入依赖
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务发现中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 排除 Spring Boot 依赖的日志包冲突 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Boot 集成 log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
2.配置网关的bootstrap.yaml配置文件
#微服务配置
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.101.65:8848
discovery:
namespace: dev
group: XXXX-XX-project
config:
namespace: dev
group: XXXX-XX-project
file-extension: yaml
refresh-enabled: true
3.在nacos上配置网关路由策略
server:
port: 63010 # 网关端口
spring:
cloud:
gateway:
# filter:
# strip-prefix:
# enabled: true
routes: # 网关路由配置
- id: content-api # 路由id,自定义,只要唯一即可
uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
- id: system-api
uri: lb://system-api
predicates:
- Path=/system/**