当前位置: 首页 > news >正文

微服务-GateWay(网关)

所谓网关是什么意思?

       相当于就是你们小区家的保安,进出小区都得获得保安的同意,守护你们小区的生命财产健康,网关也是如此,对每个请求都严格把关,将合法的或者是获得权限的请求进入服务器

网关的功能:

  • 身份验证和权限校验
  • 服务路由、负载均衡
  • 请求限流

 一般的常见的网关分别是:

Gateway:基于Spring5中提供的WebFlux,属于响应式编程的实现,具有更好的性能

zuul:基于servlet的实现,属于阻塞式编程

搭建网关服务

1.创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

   <!--nacos服务注册发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2.编写路由配置即nacos地址:

server:port: 10010
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示,必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言,判断请求是否符合规则- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合

总结:

网关搭建的步骤:

1.创建项目,引入nacos服务发现和gateway依赖

2.配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

1.理由id:路由的唯一标识

2.路由目标:路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

3路由断言:判断路由的规则

4.路由过滤器:对去请求或响应做处理

路由断言工厂(Route Predicate Factory)

网关路由可以配置的内容为:

  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地

       配置文件中的规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件,例如“Path=/user/**”是按照路径进行匹配,只让以/user开头的就认为是符合的

  • filter:路由过滤器,处理请求或响应

11种工厂:

 路由过滤器GatewayFilter

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

 下面列举几个Spring提供的不同的路由过滤器工厂:

现在要求给进入A服务的所有请求添加一个请求头,你会怎么实现?

给某个服务单独添加请求头:

spring:cloud:gateway:routes:#网关路由配置- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**filters: #过滤器- AddRequestHeader=Truth,Itcast is freaking awesome!#添加请求头

如果要对所有的路由都生效,即可将过滤工厂写到default下,如:

spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示,必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言,判断请求是否符合规则- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**default-filters:#对所有的路由都生效的过滤器- AddRequestHeader=Truth,Itcast is freaking awesome!

全局过滤器

       全局过滤器的作用也是处理一切网关的请求和微服务响应,与GatewayFilter的作用一样,区别在GatewayFilter通过配置定义,处理逻辑时固定的,而GlobalFilter的逻辑需要自己写代码实现,定义是实现GlobalFilter接口

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2.获取参数中的 authorization 参数String auth = params.getFirst("authorization");// 3.判断参数值是否等于 adminif ("admin".equals(auth)) {// 4.是,放行return chain.filter(exchange);}// 5.否,拦截// 5.1.设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;}

步骤:

1.实现GlobalFilter接口

2.添加@Order注解或者实现Ordered接口

3.编写处理逻辑

过滤器执行顺序

  •  每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照defaultFilter>局部路由过滤器>GlobalFilter的顺序执行

跨域问题

       跨域问题:域名不一致就是跨域。浏览器禁止请求的发起者与服务器发生跨域ajax请求,请求被浏览器拦截的问题

CORS:

spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:globalcors: #全年的跨域处理add-to-simple-url-handler-mapping: true #解决options请求被拦截问题corsconfigurations: '[/**]':allowedOrigins: #允许哪些网站的跨域请求-"http://127.0.0.1:8090"allowedMethods: #允许的跨域ajax的请求方式-"GET"-"POST"-"DELETE"-"PUT"-"OPTIONS"allowedHeaders: "*" #允许在请求中携带的头信息allowCredentials: true #是否允许携带cookiemaxAge: 360000 #这次跨域检测的有效期

http://www.lryc.cn/news/133082.html

相关文章:

  • 基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构
  • 单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量
  • 如何在 3dmax 中渲染? 3dmax渲染教程
  • linux部署项目, 报数据库连接不上错误
  • 现有的vue3+ts+vite项目集成electron
  • 线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)
  • Ubuntu vi 左下角没有提示
  • Windows安装 Elasticsearch 教程
  • Dubbo 融合 Nacos 成为注册中心
  • kafka--kafka基础概念-ISR详解
  • 《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》
  • 音频解码及如何在Java实现
  • Webshell 及检测绕过
  • Ubuntu22.4系统mongodb数据库安装
  • Vue初识别--环境搭建--前置配置过程
  • 数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)
  • Word怎么转换成PDF文档?多个Word转换成PDF步骤分享
  • 【C++习题集】-- 堆
  • vue + vue-office 实现多种文件(docx、excel、pdf)的预览
  • 30.Netty源码服务端启动主要流程
  • ssh端口转发
  • 独立站SEO是什么意思?自主网站SEO的含义?
  • Android JNI系列详解之NDK和JNI介绍
  • LeetCode //C - 20. Valid Parentheses
  • 浅析Java设计模式之四策略模式
  • 基于Spring Boot的餐厅订餐网站的设计与实现(Java+spring boot+MySQL)
  • 【图像分割】理论篇(1)评估指标代码实现
  • Git checkout 某个版本到指定文件夹下
  • Java多态详解(2)
  • Camtasia导入srt字幕乱码