1.网关
1.1 概述
网关本质上要提供一个各种服务访问接口,并提供服务接收并转发所有内外部的客户端调用,还有就是权限认证,限流控制等等。Spring Cloud Gateway是Spring公司开发的一个网关组件,它旨在为微服务架构提供一种简单有效的统一的API接口,负责请求路由,组合及协议转换,并且基于Filter链的方式提供了权限认证,监控,限流等功能。
1.2 Spring Cloud Gateway优缺点
优点:
- 性能强劲:是第一代网关Zuul的1.6倍
- 功能强大:内置了很多的功能,例如转发,监控,限流等等
- 设计优雅,容易扩展
缺点:
- 依赖Netty与WebFlux,不是传统的Servlet模型
- 需要Spring Boot2.0及以上的版本才支持
1.3 入门案例
通过网关作为服务的访问接口,对系统中的服务进行访问,例如通过网关服务去访问sca-provider服务
1.3.1 创建sca-gateway模块,其pom.xml文件如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1.3.2 创建application.yml,添加相关的配置
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes: #配置网关路由规则,是gateway中最基本的组件之一,表示一个具体的路由信息载体
- id: route01 #路由id,自己指定一个唯一值即可。路由标识符,区别于其他的Route
uri: http://localhost:8081/ #网关帮我们转发的url,路由指向的目的地,即客户端请求最终被转发到的微服务
predicates: ###断言(谓此):匹配请求规则。进行条件判断,只有断言都返回真,才会执行路由
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理。用于修改请求与响应信息
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
1.3.3 创建项目启动类
package com.cy;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
1.4 小结面试
- 什么是网关(服务访问、流量的一个接口,类似于“海关”)
- 为什么使用网关(服务安全,统一服务入口管理,负载均衡,限流,鉴权)
- Spring Cloud Gateway应用去实现的的初始构建过程(添加依赖,配置)
- Gateway服务的启动底层是通过谁实现的(Netty网络编程框架-ServerSocket)
- Gateway服务做请求转发时一定要在注册中心进行注册吗(不一定,可以直接通过远程url进行访问)
2.负载均衡设计
网关才是服务访问的入口,所有服务都会在网关层面进行底层的映射,所以在访问服务时,要基于服务service id (服务名)去找相应的服务,让请求从网关层进行均衡转发,以平衡服务实例处理的能力
2.1 Gateway中负载均衡的实现
2.1.1 项目中添加服务发现依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency