微服务网关是一个用于管理和监控微服务的入口,用于转发和路由来自客户端的请求。微服务网关可以将来自客户端的请求转发给后端的多个微服务,同时也可以处理跨域、身份验证、限流、缓存、流量控制等一系列与微服务相关的功能,从而简化了微服务架构的服务开发的复杂度。
总结网关功能,需求:
SSM框架有什么优势: 开源 热度高 使用方便 springboot简化配置 缺点简化配置 封装了原理和底层逻辑.难以学透.
一切技术选型都来自: 需求.
Spring Cloud Gateway 是基于 Spring Boot 和 Spring Cloud 构建的微服务网关,和 Spring Cloud Alibaba 等一些组件相结合可以构建完整的微服务架构体系。同时,它还支持集成 Spring Cloud Config、Spring Security、Spring Cloud Sleuth 和 Spring Cloud Stream 等组件,为微服务应用提供更加全面的技术支持。
Spring Cloud Gateway 整合了 Reactor 和 Netty 技术,提供了高效的异步转发能力,支持 WebFlux 进行非阻塞式处理,避免了潜在的 I/O 瓶颈,提高了请求响应效率。
Spring cloud Gateway内置了很多现成的路由,负载均衡,过滤器的配置逻辑,易于上手使用。
同时提供扩展的接口,和非常简便的整合的配置方式,提供多种不同过滤器供开发者选择和使用。
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
dependencies>
server:
port: 8099
spring:
application:
name: csmall-gateway
#由于gateway底层不是tomcat 和mvc有冲突的
main:
web-application-type: reactive
#配置cloud gateway 逻辑,实现转发需求
cloud:
gateway:
#路由转发配置 路由逻辑可以配置多个
routes:
# 一个- 是一个路由信息,配置一个路由的对象属性
# id表示唯一的标识
- id: stock-redirect
# 目的地请求地址
uri: http://127.0.0.1:20003
# 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
# 所有请求都到网关转发给stock
# /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
# ant匹配规范 * ? **
predicates:
- Path=/**
- Host=localhost:8099
predicates:
- Path=/abc
表示请求进入到网关的路径必须等于/abc 这个路由才处理
http://localhost:8099/kaka访问
网关接收请求,路由计算,没有路由匹配
网关直接返回404
http://localhost:8099/abc访问
网关接收请求,路由计算,匹配到id=stock-redirect路由
转发 http://127.0.0.1:20003/abc
stock处理请求,没有资源,返回404
predicates:
- Path=/abc/*
springCloud gateway 内置很多断言规则. Path Host使用的比较多的.
微服务做网关配置,做匹配的时候,2种情况的匹配.
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
spring:
cloud:
gateway:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=name,wanglaoshi
请求request 携带的cookie中 key1=value1;key2=value2 有没有name=wanglaoshi,有则匹配,没有则不匹配.
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=green
支持正则表达式判断参数的值的格式 gree. 以gree开始 后面有一个字符. greet green
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=red, gree.
上述案例要求 请求携带red参数,值满足 gree.正则
http://localhost:8099/doc.html?red=haha
http://localhost:8099/doc.html?red=green(√)
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24
远程ip地址 192.168.1.100 √
远程ip地址 192.168.1.101 √
远程ip地址 192.168.2.101
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Path=/**
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Path=/**
- Weight=group1, 2
如果实现nacos整合,网关整体进程就可以看成是一个nacos的客户端,启动时候抓取了服务信息.
请求进入网关,网关的路由配置uri不再指向一个具体的服务实例地址,而是使用服务名称.
断言匹配路由,进行路由计算之后,再进入负载均衡计算,从抓取的服务信息中,先获取信息实例集群,在计算负载逻辑.最终转发出去,由本次计算的实例处理请求.
问题1: uri配置的服务名称找不到,配置错误,或者没抓到
问题2: 请求资源在实例中不存在 404
server:
port: 8099
spring:
application:
name: csmall-gateway
#由于gateway底层不是tomcat 和mvc有冲突的
main:
web-application-type: reactive
#配置cloud gateway 逻辑,实现转发需求
cloud:
nacos:
#nacos中注册发现的功能
discovery:
#填写nacos的服务端地址
server-addr: localhost:8848
#命名空间
namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
#分组
group: 1.0
gateway:
#路由转发配置 路由逻辑可以配置多个
routes:
# 一个- 是一个路由信息,配置一个路由的对象属性
# id表示唯一的标识
- id: stock-redirect
# 负载均衡的访问服务名称csmall-stock
uri: lb://csmall-stock
# 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
# 所有请求都到网关转发给stock
# /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
# ant匹配规范 * ? **
predicates:
- Path=/**
- Host=localhost:8099
server:
port: 8099
spring:
application:
name: csmall-gateway
#由于gateway底层不是tomcat 和mvc有冲突的
main:
web-application-type: reactive
#配置cloud gateway 逻辑,实现转发需求
cloud:
nacos:
#nacos中注册发现的功能
discovery:
#填写nacos的服务端地址
server-addr: localhost:8848
#命名空间
namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
#分组
group: 1.0
gateway:
#动态路由
discovery:
locator:
enabled: true
spring.cloud.gateway.discovery.locator.enabled=true 属性值开启发现动态路由逻辑.
会根据抓取的服务名称,配置Path=/{服务名称}/** 同时转发的时候,将一级路径过滤掉
按照当前服务逻辑 相当于人为配置路由
routes:
- id: stock
uri: lb://csmall-stock
predicates:
- Path=/csmall-stock/**
filters:
#会在转发时,去掉拼接的1级路径
- StrimFilter = 1
- id: cart
uri: lb://csmall-cart
predicates:
- Path=/csmall-cart/**
filters:
#会在转发时,去掉拼接的1级路径
- StrimFilter = 1
当前服务有2个,动态路由内部有2个路由配置.
http://localhost:8099/{服务名称}/{资源路径}.按照这个逻辑,以下几个演示案例,可以预测结果: