一 、网关的基本概念
SpringCloud Gateway网关是所有微服务的统一入口。也可以理解为客户端和服务端中间的桥梁。
1.1 作用
-
反向代理(请求的转发)
-
路由和负载均衡
-
身份认证和权限控制
-
对请求限流
1.2 相比于Zuul的优势
SpringCloudGateway基于Spring5中提供的WebFlux,是一种响应式编程的实现,性能更加优越。
Zuul的实现方式比较老式,基于Servlet的实现,它是一种阻塞式编程,在高并发下性能性能不佳。
其实Nginx也可以作为网关,但是要使用Nginx自主实现网关的相关功能,还需要借助lua脚本语言,学习成本是比较高的,现在一般也不会使用它来做网关,但是只按性能来讲Nginx,性能是最高的。
1.3 SpringCloud GateWay架构图
微服务只接收来自网关的请求,而其它直接访问微服务本身的请求拒绝。
这样可以极大保护微服务免受不法侵害。
同时在请求压力激增时,可以实施服务限流,保护微服务集群。
二、SpringBoot中配置GateWay
2.1 引入GateWay的Maven依赖
<!--网关 起步依赖-->
<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>
2.2 编辑配置文件
2.2.1 properties写法
# nacos中注册的服务名
spring.application.name=gateway-server
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#使用服务发现路由,服务调用
spring.cloud.gateway.discovery.locator.enabled=true
#服务路由名小写
#spring.cloud.gateway.discovery.locator.lower-case-service-id=true
#设置路由id,下标从[0]开始
#理论随便写,建议写服务的名字
spring.cloud.gateway.routes[0].id=user-service
#设置路由的url
#格式lb://+nacos中注册的服务名
spring.cloud.gateway.routes[0].uri=lb://userservice
#设置路由断言(匹配规则),代理servicerId为auth-service的/auth/路径
#格式Path=
spring.cloud.gateway.routes[0].predicates= Path=/user/**
spring.cloud.gateway.routes[1].id=card-service
spring.cloud.gateway.routes[1].uri=lb://cardservice
spring.cloud.gateway.routes[1].predicates= Path=/card/**
2.2.2 application.yml写法
server:
port: 8080 # 网关端口,默认80
spring:
application:
name: gateway-server # 服务名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos注册中心地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 (直接写死地址的方式,不推荐)
uri: lb://userservice # 路由的目标地址 lb是负载均衡,后面跟服务名称(推荐)
predicates: # 路由断言,判断请求是否符合路由规则的条件
- Path=/user/**