随着微服务的兴起,业务基本都会拆分开来,那么这就会产生很多问题,比如,每一个服务都需要提供一个访问链路,到后期随着服务的增多,这种模式的管理也就愈加繁琐,这时通过网关来管理,就很大程度上减少了服务之间调用的复杂性.
API网关是随着微服务而兴起的一种架构模式,他是运行于外部请求和内部服务之间的一个流量入口,用于实现对外部请求的协议转换、鉴权、流控、参数校验、监控等通用功能。Spring Cloud Gateway就是Spring公司基于Spring 5.0,Spring Boot 2.0 和 等技术开发的一个API网关组件。其特点如下:
1.性能好,是第一代网关Zuul的1.6倍
2.功能强大:内置很多功能,例如转发,监控,限流等
3.设计优雅,容易扩展
缺点:
1.依赖Netty与WebFulx,不是传统的Servlet编程模型,学习成本高
2.需要spring2.0以上才支持
业务:通过网关作为访问服务入口,对服务进行访问
第一步:在sca-qty-gateway的pom文件中配置依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
第二步:创建application.yml文件
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
uri: http://localhost:8083/ #网关帮我们转发的url
predicates: ###断言(谓词):匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos,保护了真正的路径,因为真正的provider服务中时没有nacos
解释:
route路由是最基本的组件之一,表示一个具体的路由信息载体,其中有以下配置
id:标识符,起到了区别其他路由的作用
uri:网关最终帮我们访问的地址
predicates:断言,就是规则,符合规则即可访问,其中规则有很多稍后再谈
filters:网关过滤器,对于断言中的内容进行判断分析以及处理
创建启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
启动项目进行测试,sca-qty-provider以及sca-qty-gateway服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f6Jxeavv-1646716249374)(C:\Users\11500\AppData\Local\Temp\1646311287904.png)]
访问成功
因为网关是服务访问的入口,所有的服务都会在网关层面进行底层映射,所以在访问服务时,根据service id查找对应的服务,让请求从网关层进行均衡转发,以平衡服务的处理能力.
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置yml文件
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
#uri: http://localhost:8083/ #网关帮我们转发的url
uri: lb://sca-qty-provider # 这里的lb代表负载均衡,sca-qty-provider代表服务名
predicates: ###断言(谓词):匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos,保护了真正的路径,因为真正的provider服务中时没有nacos的
启动多个provider服务进行访问测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WooSMJX-1646716249375)(C:\Users\11500\AppData\Local\Temp\1646312112485.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPRo8N64-1646716249376)(C:\Users\11500\AppData\Local\Temp\1646312123663.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwX91k8V-1646716249376)(C:\Users\11500\AppData\Local\Temp\1646312168568.png)]
从spring官网中我们可以找到此图,我们来分析以下
Gateway Client相当于是客户端,通过网关进行服务的访问,这时候程序先会判断请求链路是否符合断言的规则,符合断言规则后,再根据filter网关过滤器,对断言中的内容进行判断.
什么是网关:服务访问的一个入口,类似生活中的海关
为什么使用网关:服务安全,统一服务入口管理,负载均衡,限流,鉴权
使用网关的条件:添加依赖,配置yml或者properties文件
Gateway的底层启动实现是:Netty网络编程框架-ServerSocket
Gateway服务做请求转发时必须注册中心注册吗:不一定,可以通过url直接远程访问服务
网关层面如何实现负载均衡:通过服务名查找具体的服务实例
网关层面是如何通过服务名查找服务实例的:通过Ribbon
Ribbon中有哪些负载均衡策略:轮询,ip hash值,权重可通过IRule查查看
Gateway服务做请求转发时必须注册中心注册吗:不一定,可以通过url直接远程访问服务
网关层面如何实现负载均衡:通过服务名查找具体的服务实例
网关层面是如何通过服务名查找服务实例的:通过Ribbon
Ribbon中有哪些负载均衡策略:轮询,ip hash值,权重可通过IRule查查看