当前位置:   article > 正文

微服务之网关Gateway_怎么验证微服务在同一个gateway下

怎么验证微服务在同一个gateway下

 

什么是网关?

程序中的网关就是当前微服务项目对外界开放的统一入口

所有外界的请求都需要先经过网关才能访问到我们的程序

提供了统一入口之后,方便对所有请求进行统一的检查和管理

网关的主要功能有

  • 将所有请求统一经过网关

  • 网关可以对这些请求进行检查

  • 网关方便记录所有请求的日志

  • 网关可以统一将所有请求路由到正确的模块\服务上

Spring Gateway是Spring自己编写的,也是SpringCloud中的组件, SpringGateway官网

Spring Cloud Gateway

简单网关演示:

SpringGateway网关是一个依赖, 不是一个软件 , 需要添加相关配置  

  1. <dependencies>
  2. <!-- Gateway依赖 -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-gateway</artifactId>
  6. </dependency>
  7. <!-- Nacos依赖 -->
  8. <dependency>
  9. <groupId>com.alibaba.cloud</groupId>
  10. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  11. </dependency>
  12. <!-- 网关负载均衡依赖 -->
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  16. </dependency>
  17. </dependencies>

在配置文件中添加:

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. # 网关也是微服务项目的一部分,所以也要注册到Nacos
  10. server-addr: localhost:8848
  11. gateway:
  12. # routes就是路由的意思,在此处配置是一个数组类型
  13. routes:
  14. # 数组类型中编写 "-"开头,表示是一个数组元素
  15. # id表示当前路由的名称,没有和其他任何出现过的名字关联,和之后的内容也没有关联
  16. - id: gateway-beijing
  17. # 当前路由配置的路由目标配置,也就是路由路径
  18. # lb是LoadBalance的缩写,beijing是路由目标服务器的名称
  19. uri: lb://beijing
  20. # 下面编写路由条件\规则,也就是满足什么样的路径会访问beijing服务器
  21. # 我们要配置内置断言来配置路径路径 predicates(断言)
  22. predicates:
  23. # 断言其实就是满足某个条件时做什么操作的设置
  24. # predicates和routes类似,也是一个数组类型
  25. # ↓ P大写!!!!! 表示以/bj/开头的请求都会路由到beijing服务器
  26. - Path=/bj/**
  27. # spring.cloud.gateway.routes[0].uri
  28. # spring.cloud.gateway.routes[0].predicates[0]

关于路由:

路由规则解释

路由规则一定是在开发之前就设计好的

一般可以使用约定好的路径开头来实现的

例如

gateway项目

如果路径以 /bj开头,就是要访问beijing项目

如果路径以 /sh开头.就是养访问shanghai项目

csmall项目

如果路径是 /base/business开头的, 就去找nacos-business服务器

如果路径是 /base/cart开头的, 就去找nacos-cart服务器

如果路径是 /base/order开头的, 就去找nacos-order服务器

如果路径是 /base/stock开头的, 就去找nacos-stock服务器

动态路由

网关项目随着微服务数量的增多

gateway项目的yml文件配置会越来越多,维护的工作量也会越来越大

所以我们希望gateway能够设计一套默认情况下自动路由到每个模块的路由规则

这样的话,不管当前项目有多少个路由目标,都不需要维护yml文件了

这就是我们SpringGateway的动态路由功能

配置文件中开启即可

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. # 网关也是微服务项目的一部分,所以也要注册到Nacos
  10. server-addr: localhost:8848
  11. gateway:
  12. discovery:
  13. locator:
  14. # 这就是开启动态路由的配置,动态路由配置默认是关闭的,需要手动开启才能生效
  15. # 动态路由生成规则为:在网关端口号后先写要路由到的目标服务器在nacos注册的名称
  16. # 再编写具体路径
  17. # 例如 localhost:9001/bj/show -> localhost:9000/beijing/bj/show
  18. enabled: true

内置断言 

断言的意思就是判断某个条件是否满足

我们之前使用了Path断言,判断请求的路径是不是满足条件,例如是不是/sh/** /bj/**

如果路径满足这个条件,就路由到指定的服务器

但是Path实际上只是SpringGateway提供的多种内置断言中的一种

还有很多其它断言

  • after

  • before

  • between

  • cookie

  • header

  1. routes:
  2. - id: gateway-shanghai
  3. uri: lb://shanghai
  4. predicates:
  5. - Path=/sh/**
  6. # 当前断言是两个条件,第一是路径必须用/sh/开头
  7. # 第二是访问的时间必须在下面指定的时间之后, 而且两个条件必须同时满足,才能路由
  8. - After=2022-09-27T10:29:00.898+08:00[Asia/Shanghai]

必须在指定时间之后才能访问服务

否则发生404错误拒绝访问

需要注意测试时,先启动Nacos,再启动shanghai之后启动gateway

测试时必须通过9000端口访问才能有效果

使用Before设置必须在指定时间之前访问

使用Between设置必须在指定时间之间访问  

  1. routes:
  2. - id: gateway-shanghai
  3. uri: lb://shanghai
  4. predicates:
  5. - Path=/sh/**
  6. # 当前断言是两个条件,第一是路径必须用/sh/开头
  7. # 第二是访问的时间必须在下面指定的时间之后, 而且两个条件必须同时满足,才能路由
  8. - Between=2022-09-27T10:33:20.898+08:00[Asia/Shanghai],2022-09-27T10:33:40.898+08:00[Asia/Shanghai]

Query断言,判断是否包含指定的参数名称,包含参数名称才能通过路由  

  1. routes:
  2. - id: gateway-shanghai
  3. uri: lb://shanghai
  4. predicates:
  5. - Path=/sh/**
  6. # 判断是否包含指定参数名称(username)的断言,不包含就不能正常路由
  7. - Query=username

内置过滤器

Gateway还提供的内置过滤器

不要和我们学习的filter混淆

内置过滤器允许我们在路由请求到目标资源的同时,对这个请求进行一些加工或处理

常见过滤器也有一些

AddRequestParameter过滤器

它的作用是在请求中添加参数和它对应的值

  1. routes:
  2. - id: gateway-shanghai
  3. uri: lb://shanghai
  4. filters:
  5. # 内置过滤器功能,AddRequestParameter在路由到指定控制器方法之前
  6. # 在请求中添加参数age=18,控制器方法运行时可以通过age获取该值
  7. - AddRequestParameter=age,18
  8. predicates:
  9. - Path=/sh/**
  10. # 判断是否包含指定参数名称(username)的断言,不包含就不能正常路由
  11. - Query=username

在shanghai的控制器方法中添加代码接收name,age的值  

  1. @RestController
  2. @RequestMapping("/sh")
  3. public class ShanghaiController {
  4. @GetMapping("/show")
  5. public String show(String username,Integer age){
  6. System.out.println(ZonedDateTime.now());
  7. return "这里是上海!username:"+username+",age:"+age;
  8. }
  9. }

需要注意的问题:

SpringMvc框架中自带一个Tomcat服务器

SpringGateway框架中自带一个Netty的服务器

在启动项目时,两个框架中包含的服务器都想占用相同端口,因为争夺端口号和主动权而发生冲突

导致启动服务时报错

要想能够正常启动必须在yml文件配置

  1. spring:
  2. main:
  3. web-application-type: reactive

网关项目的knife4j配置

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/302035
推荐阅读
相关标签
  

闽ICP备14008679号