微服务-GateWay(网关)

素颜马尾好姑娘i 2023-10-14 21:53 80阅读 0赞

所谓网关是什么意思?

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

网关的功能:

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

cbde861b42804781b9593d3550eea947.png

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

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

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

搭建网关服务

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

  1. <!--nacos服务注册发现依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>
  6. <!--网关gateway依赖-->
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-gateway</artifactId>
  10. </dependency>

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

  1. server:
  2. port: 10010
  3. logging:
  4. level:
  5. cn.itcast: debug
  6. pattern:
  7. dateformat: MM-dd HH:mm:ss:SSS
  8. spring:
  9. application:
  10. name: gateway
  11. cloud:
  12. nacos:
  13. server-addr: nacos:8848 # nacos地址
  14. gateway:
  15. routes:
  16. - id: user-service # 路由标示,必须唯一
  17. uri: lb://userservice # 路由的目标地址
  18. predicates: # 路由断言,判断请求是否符合规则
  19. - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合

bd9fb56cca384cd7bc88e9193047a783.png

总结:

网关搭建的步骤:

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种工厂:

031552b5fd2049c28ad4b91cb1749235.png

路由过滤器GatewayFilter

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

602003ca9d8542569686f517c537dc65.png

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

2788aaf4e7b949b0a6c801125273c352.png

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

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

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:#网关路由配置
  5. - id: order-service
  6. uri: lb://orderservice
  7. predicates:
  8. - Path=/order/**
  9. filters: #过滤器
  10. - AddRequestHeader=Truth,Itcast is freaking awesome!#添加请求头

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

  1. spring:
  2. application:
  3. name: gateway
  4. cloud:
  5. nacos:
  6. server-addr: nacos:8848 # nacos地址
  7. gateway:
  8. routes:
  9. - id: user-service # 路由标示,必须唯一
  10. uri: lb://userservice # 路由的目标地址
  11. predicates: # 路由断言,判断请求是否符合规则
  12. - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
  13. - id: order-service
  14. uri: lb://orderservice
  15. predicates:
  16. - Path=/order/**
  17. default-filters:#对所有的路由都生效的过滤器
  18. - AddRequestHeader=Truth,Itcast is freaking awesome!

全局过滤器

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

  1. //@Order(-1)
  2. @Component
  3. public class AuthorizeFilter implements GlobalFilter, Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. // 1.获取请求参数
  7. ServerHttpRequest request = exchange.getRequest();
  8. MultiValueMap<String, String> params = request.getQueryParams();
  9. // 2.获取参数中的 authorization 参数
  10. String auth = params.getFirst("authorization");
  11. // 3.判断参数值是否等于 admin
  12. if ("admin".equals(auth)) {
  13. // 4.是,放行
  14. return chain.filter(exchange);
  15. }
  16. // 5.否,拦截
  17. // 5.1.设置状态码
  18. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  19. // 5.2.拦截请求
  20. return exchange.getResponse().setComplete();
  21. }
  22. @Override
  23. public int getOrder() {
  24. return -1;
  25. }

步骤:

1.实现GlobalFilter接口

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

3.编写处理逻辑

过滤器执行顺序

478b03c293f84a14a6d9069b57be1992.png

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

跨域问题

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

CORS:

  1. spring:
  2. application:
  3. name: gateway
  4. cloud:
  5. nacos:
  6. server-addr: nacos:8848 # nacos地址
  7. gateway:
  8. globalcors: #全年的跨域处理
  9. add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
  10. corsconfigurations:
  11. '[/**]':
  12. allowedOrigins: #允许哪些网站的跨域请求
  13. -"http://127.0.0.1:8090"
  14. allowedMethods: #允许的跨域ajax的请求方式
  15. -"GET"
  16. -"POST"
  17. -"DELETE"
  18. -"PUT"
  19. -"OPTIONS"
  20. allowedHeaders: "*" #允许在请求中携带的头信息
  21. allowCredentials: true #是否允许携带cookie
  22. maxAge: 360000 #这次跨域检测的有效期

发表评论

表情:
评论列表 (有 0 条评论,80人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务-GateWay()

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

    相关 GateWay 服务

    GateWay简介 ⽹关(翻译过来就叫做GateWay):微服务架构中的重要组成部分。局域⽹中就有⽹关这个概念,局域⽹接收或者发送数据出去通过这个⽹关,⽐如⽤ Vmwar