61.微服务保姆教程 (四) Gateway---SpringCloud微服务网关组件
Gateway—SpringCloud微服务网关组件
一、Spring Cloud Gateway简介
1.为什么要用Gateway?
在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢?
-
每个服务都需要鉴权、限流、跨域访问、权限验证等操作,如果每个微服务各自为战,会很麻烦。
-
对于客户端来说,每个微服务都分配一个域名的话,客户端代码会很难维护,而且连接数也会有瓶颈.
-
随着一个项目的微服务的增多,后期对微服务进行重构的话,也会变的非常麻烦,需要客户端配合一起修改。
2、Spring Cloud Gateway 的定义
为了解决上面的问题,微服务引入了 网关 的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。
简单来说:Gateway相当于医院大厅的挂号台,对病人进行引流。
加入网关后结构图:
3.Spring Cloud Gateway三大组成部分
Route(路由): 是构建网关的基本模型, 由ID ,URI 一系列的断言和过滤器组成。
Predicate (断言): 可以匹配Http 请求中所有的内容(请求头 参数等等) 请求与断言,相匹配则通过当前断言。
Filter(过滤器): 包括全局和局部过滤器 ,可以在请求被路由钱后对请求进行更改。
二、Spring Cloud Gateway快速入门
前面我们学习过Nacos,可以帮助我们管理我们的服务,学习Spring Cloud Gateway时,我们可以直接将Nacos整合进来。
1.项目项目
复制之前的Sentinel项目,在此基础上添加api-gateway子模块
添加入口类
2.添加Jar包
<!--gateway网关-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><!--由于springcloud2020弃用了Ribbon,因此Alibaba在2021版本nacos中删除了Ribbon的jar包,因此无法通过lb路由到指定微服务,会出现503情况。需要引入springcloud loadbalancer包-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency><!--其它包-->
<!-- 服务注册与发现 jar包 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency><!-- nacos配置中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- 识别bootstrap.yml文件-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.2</version>
</dependency>
3.添加配置文件
GATEWAY-dev.yml
server:port: 9000
spring:application:name: GATEWAYcloud:loadbalander: #注意这里要排除ribbonribbon:enable: falsegateway:routes:- id: search_routeuri: lb://SEARCHpredicates:- Path=/search-service/**filters:- StripPrefix=1
注解: http://localhost:9000/search-service/goods http://localhost:8083/goods
routes: 路由/路由数组 当请求满足指定的条件后转发到哪个微服务上id: 当前路由唯一的标识符 ,有默认值,也可以自定义uri: 请求最终要被转到的地址 ,lb为load balance,表示负载均衡,比如lb://SEARCH表示请求最终会转发到SEARCH服务,注意 lb://后面的<clientName>一定不要使用下划线,即不要使用比如:my_service这种形式,否则LoadBanancer不会起作用。predicates:断言,也就是条件判断,- Path=/search-service/表示当客户端访问