当前位置:   article > 正文

微服务Gateway服务网关

微服务Gateway服务网关

目录

Gateway服务网关

网关的核心功能

1.请求路由和负载均衡

2.权限控制(安全)

3.限流

SpringCloud中网关的实现

gateway(优)

zuul

基本步骤

1.创建SpringBoot工程gateway模块

2.编写启动类

3.编写基础配置和路由规则

4.路由配置包括

5.断言工厂Predicate Factory

6.过滤器工厂GatewayFilter

过滤器类型

小tip

7.全局过滤器

GlobalFilter代码实现

8.全局过滤器与过滤器工厂GatewayFilter的区别

9.过滤器执行顺序

规则

10.跨域问题


Gateway服务网关

网关的核心功能

1.请求路由和负载均衡

请求先经过gateway,若不处理业务把请求转发到某个微服务,叫做路由

路由目标有多个时,要做负载均衡

2.权限控制(安全)

作为微服务入口校验用户是否有请求资格,若没有则拦截

3.限流

请求流量过高时,按照下流的微服务可接受的速度放行请求,避免服务压力过大

SpringCloud中网关的实现

gateway(优)

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

zuul

基于Servlet的实现,属于阻塞式编程

基本步骤

1.创建SpringBoot工程gateway模块

引入网关依赖和nacos服务发现依赖

spring-cloud-starter-gateway

spring-cloud-starter-alibaba-nacos-discovery

2.编写启动类

3.编写基础配置和路由规则

  1. server:
  2.   port:81 # 端口号(随便写,但前台访问时会用) # 网关端口
  3. spring:
  4.   application:
  5.     name: gateway # 服务名称(供其他服务调用的别名)
  6.   cloud:
  7.     nacos:
  8.       server-addr: localhost:8848 # nacos地址
  9.     gateway:
  10.       routes: # 网关路由配置     - 内容    表示  下面的内容是列表集合
  11.         - id: user-service             # 1.路由id,自定义,只要唯一即可
  12.           # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
  13.           uri: lb://userservice        # 2.路由的目标地址 lb就是负载均衡,后面跟服务名称
  14.           predicates:                  # 3.路由断言,也就是判断请求是否符合路由规则的条件
  15.             - Path=/user/**              # 这个是按照路径匹配,只要以/user/开头就符合要求

4.路由配置包括

1. 路由id:路由的唯一标示

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

3. 路由断言(predicates):判断路由的规则,

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

5.断言工厂Predicate Factory

读取在配置文件中写的断言规则,转变为路由判断的条件

Path

- Path=/red/{segment},/blue/**

判断是否以/red/值 开头   或者以/blue/**开头的路径

6.过滤器工厂GatewayFilter

具体内容查看spring官网 docs.spring.io

作用

对进入网关的请求和微服务返回的响应做处理

过滤器类型

1.指定服务路由过滤器

filters: #在routes下级
  - 过滤器类型=内容

配置在路由下的过滤器只对当前路由的请求生效

2.默认所有服务路由过滤器

defaultFilters:#与routes平级

- 过滤器类型=内容

对所有路由都生效的过滤器

小tip

在web请求(控制层请求)的请求信息

第一种

控制层请求中的参数加入@RequestHeader(value="名" ,required=false) String 名   
//设置为false,可以若没有信息,不会报错

第二种

控制的请求参数HttpServletRequest request

request.方法("名")

7.全局过滤器

处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样

GlobalFilter代码实现

1.定义方式是实现GlobalFilter接口,并重写里面的方法

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

3.编写处理逻辑

// 1.获取请求参数

MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();

// 2.获取指定参数

String auth = params.getFirst("参数名");

// 3.校验

// 3.1放行

return chain.filter(exchange);

// 3.2拦截

// 禁止访问,设置状态码

exchange.getResponse().setStatusCode(HttpStatus.状态码);

// 结束处理

return exchange.getResponse().setComplete();

8.全局过滤器与过滤器工厂GatewayFilter的区别

1.GatewayFilter通过配置定义,处理逻辑是固定的

2.GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口,并重写里面的方法

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

编写处理逻辑

  1. // 1.获取请求参数
  2. MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
  3. // 2.获取指定参数
  4. String auth = params.getFirst("参数名");
  5. // 3.校验
  6. // 放行
  7. return chain.filter(exchange);
  8. // 4.拦截
  9.  // 4.1.禁止访问,设置状态码
  10. exchange.getResponse().setStatusCode(HttpStatus.状态码);
  11.  // 4.2.结束处理
  12. return exchange.getResponse().setComplete();

9.过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

规则
  1. 请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
  2. order值越小,优先级越高,执行顺序越靠前。
  3. GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值
  4. 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  5. order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

10.跨域问题

域名不一致就是跨域

浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

在gateway的配置文件中添加配置

  1. spring:
  2.   cloud:
  3.     gateway:
  4.       globalcors: # 全局的跨域处理
  5.         add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
  6.         corsConfigurations:
  7.           '[/**]':
  8.             allowedOrigins: # 允许哪些网站的跨域请求 
  9.               - "http://localhost:8090"
  10.             allowedMethods: # 允许的跨域ajax的请求方式
  11.               - "GET"
  12.               - "POST"
  13.               - "DELETE"
  14.               - "PUT"
  15.               - "OPTIONS"
  16.             allowedHeaders: "*" # 允许在请求中携带的头信息
  17.             allowCredentials: true # 是否允许携带cookie
  18.             maxAge: 360000 # 这次跨域检测的有效期
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/317356?site
推荐阅读
相关标签
  

闽ICP备14008679号