官方git:https://github.com/spring-cloud/spring-cloud-gateway
Spring Cloud Gateway网关是用来代替zuul1.x作为微服务架构中的网关组件,zuul1.x是最早的网关组件,由于使用单线程阻塞式链接,所以性能有问题,gateway是搭建在webflux框架之上的响应式网关服务,底层使用Netty框架作为通讯框架。zuul2.x也使用了Netty。性能上gateway是zuul1.x的1.5~2倍,与zuul2.x相当。
我们使用的是spring-cloud-alibaba的2021.1版本,还踩了一个小小的坑,下面说。
什么是gateway
我个人理解gateway就是一个业务nginx,它支持请求转发,负载均衡,统一埋点,限流降级、安全认证等等很多功能,gateway收集所有请求根据路由规则转发请求,使用统一的过滤器处理请求参数等,是不是听起来有点像nginx,但是比nginx拥有更多功能。
gateway三大组件
如何使用
springcloud 提供了gateway的springboot版本启动器,我们可以很方便的创建一个网关项目
首先创建一个springboot项目,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
修改application.yml配置
server:
port: 9000
spring:
application:
name: gateway-web
cloud:
gateway:
discovery:
routes:
- id: demo-1
uri: 127.0.0.1:9004
predicates:
- Path=/demo/** ##基于Path匹配的路由规则 还有其他的路由规则
集成Nacos 实现动态路由
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Cloud 2020 中重磅推荐的负载均衡器 Spring Cloud LoadBalancer 不引用无法实现动态路由 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
修改application.yml配置
server:
port: 9000
spring:
application:
name: gateway-web
cloud:
gateway:
discovery:
routes:
- id: demo-1
uri: lb://demo-web ##'lb://'代表发现注册中心的服务 'demo-web'服务提供方的name
predicates:
- Path=/demo/**
nacos:
discovery:
server-addr: 127.0.0.1:8848
password: nacos
username: nacos
启动类增加服务发现注解
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayWebApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayWebApplication.class, args);
}
}
可以自nacos中发现该gateway服务
基于约定的服务动态路由 自动配置routes
修改application.yml配置
server:
port: 9000
spring:
application:
name: gateway-web
cloud:
gateway:
discovery:
locator:
enabled: true ##开启自动发现
lower-case-service-id: true ##转小写
# routes:
# - id: demo-1
# uri: lb://demo-web
# predicates:
# - Path=/demo/**
nacos:
discovery:
server-addr: 127.0.0.1:8848
password: nacos
username: nacos
注意这里在访问服务的时候需要添加一级以服务名称为路径的资源
比如:http://127.0.0.1:9004/demo/userinfo
要访问 http://127.0.0.1:9004/d