目录
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Gateway网关是我们服务的守门神,所有微服务的统一入口。

什么是网关的呢?
像上图的工作流程,用户将请求发送到微服务中,项目中的所有服务用户都可访问,一个项目中可是有些服务不能暴露出去访问的或者说有一定权限才能访问的,如果都可以访问,那势必会存在一定的安全性问题!那么怎么解决这个问题呢!则就引入了springCloud的组件,gateway(网关)进行解决!
网关的核心功能特性:
身份认证,权限控制(请求来了网关进行判断你是谁进行权限的判断,判断通过,网关放行到微服务中 !网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。)
服务路由,负载均衡(比如有个请求功能到网关了,网关能处理业务吗?肯定不能,网关需要把请求转发到微服务当中,比如user-service服务中去,这时网关就需要进行判断了,根据你的请求网关处理给你转接到具体的哪个服务这个过程被称为路由。
同样一个服务可能有多个实例,网关同样会做负载均衡)
请求限流(比如说一个游乐场,场区规定容纳两万人,结果到双休日了一下子来了四万人,这时守门员出手了,你们两万人先等等,里面已经达到容纳量了!类比于,微服务中每个服务可能每小时只能接收一万次请求,双十二突然增多,这些服务因为承载不了垮掉了,网关出手了,把多出请求的拦截下来,避免服务压力过大,保证程序的正常运转,这就是限制流量)
架构图:

在SpringCloud中网关的实现包括两种:
gateway
zuul
Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。
下面,我们就演示下网关的基本路由功能。基本步骤如下:
创建SpringBoot工程gateway,引入网关依赖
编写启动类
编写基础配置和路由规则
启动网关服务进行测试
创建服务:

引入依赖
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-gatewayartifactId>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- @SpringBootApplication
- @EnableDiscoveryClient
- public class TestGetwayApplication {
- public static void main(String[] args) {
- SpringApplication.run(TestGetwayApplication.class,args);
- }
- }
创建application.yml文件,内容如下:
- #端口号
- server:
- port: 10010
- spring:
- application:
- name: test-gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 #nacos服务地址
- gateway:
- discovery:
- locator:
- enabled: true #开启服务注册和发现的功能,自动创建router以服务名开头的请求路径转发到对应的服务
- routes: # 网关路由配置
- - id: consumer #自定义,路由id,只要唯一即可
- uri: lb://service-consumer #访问路径,路由的目标地址 lb是负载均衡,后面跟着服务名称
- predicates: #断言,也就是判断请求是否复合路由规则的条件
- - Path=/consumer/** #这个是按照路径匹配,只要以/consumer/开头就符合要求
我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。
本例中,我们将 /consumer/**开头的请求,代理到lb://service-consumer,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。
重启网关,访问http://localhost:10010/consumer/user/login时,符合/consumer/**规则,请求转发到uri:http://service-consumer/user/login/爱吃豆的土豆,得到了结果:

-
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @GetMapping("/login/{loginname}")
- @SentinelResource(value = "login" , blockHandler = "loginBlockHandler")
- public String login(@PathVariable("loginname") String str){
- return "登录成功"+ str;
- }
整个访问的流程如下:

总结:
网关搭建步骤:
创建项目,引入nacos服务发现和gateway依赖
配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:
路由id:路由的唯一标示
路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
路由断言(predicates):判断路由的规则,
路由过滤器(filters):对请求或响应做处理