(三)SpringCloud组件:Gateway

末蓝、 2024-03-27 11:05 106阅读 0赞

一、概念

功能:身份认证、权限校验、服务路由、负载均衡、请求限流。

实现:gateway、zuul

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

gateway:基于Spring5中WebFlux,属于响应式编程。性能好

二、搭建

1、依赖(注册中心(nacos、eureka)、网关依赖(gateway、zuul))

  1. <!--spring-cloud-starter-netflix-eureka-server -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <!-- gateway -->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-gateway</artifactId>
  14. </dependency>

2、配置文件

  1. server:
  2. port: 8004
  3. spring:
  4. application:
  5. name: gateway-server
  6. #gateway配置
  7. cloud:
  8. gateway:
  9. routes: #路由配置
  10. - id: user-server #路由id,自定义,唯一
  11. uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
  12. predicates: #路由断言,判断请求是否符合路由规则条件
  13. - Path=/user/** #只要以user开头就符合
  14. - id: order-server #路由id,自定义,唯一
  15. uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
  16. predicates: #路由断言,判断请求是否符合路由规则条件
  17. - Path=/order/** #只要以user开头就符合
  18. eureka:
  19. client:
  20. service-url:
  21. defaultZone: http://localhost:8001/eureka/
  22. instance:
  23. prefer-ip-address: true #使用ip地址进行注册
  24. instance-id: gateway-server:8004 #实例ID

3、启动类添加注解@EnableDiscoveryClient,不是@EnableEurekaClient

三、路由断言工厂RoutePredicateFactory

此部分的目标是配置文件中的spring.cloud.gateway.routes.predicates,这个配置中的文字会被RoutePredicateFactory进行处理。

在Spring中有11中Predicate工厂,这些配置可以在官方网站查看

e933ba21c9084d10a3ce6ccad22ee265.png

#

四、路由过滤器GatewayFilter

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

在Spring中有31种不同的路由过滤器工厂,这些配置可以在官方网站查看。 70c0b34f678e4c58bea8915dfb8d0f28.png

使用实例

配置文件:

  1. spring:
  2. application:
  3. name: gateway-server
  4. #gateway配置
  5. cloud:
  6. gateway:
  7. routes: #路由配置
  8. - id: user-server #路由id,自定义,唯一
  9. uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
  10. predicates: #路由断言,判断请求是否符合路由规则条件
  11. - Path=/user/** #只要以user开头就符合
  12. filter: #路由过滤器配置
  13. - AddRequestHeader=ttt, wdnmd
  14. - id: order-server #路由id,自定义,唯一
  15. uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
  16. predicates: #路由断言,判断请求是否符合路由规则条件
  17. - Path=/order/** #只要以user开头就符合
  18. # default-filters: #配置所有路径
  19. # - AddRequestHeader=ttt, wdnmd

接口:

  1. @GetMapping("/getUsername")
  2. public String getUserName(@RequestHeader(value = "ttt", required = false)String name){
  3. System.out.println("name");
  4. return "this is name";
  5. }

五、全局过滤器

全局过滤器的作用是处理一切进入网关的请求和微服务响应。GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。

实例:

  1. @Order(1)//拦截器执行顺序,数字越小越靠前执行,也可以实现Ordered接口
  2. @Component
  3. public class AuthorizeFilter implements GlobalFilter {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. //获取请求参数
  7. ServerHttpRequest request = exchange.getRequest();
  8. //获取请求头中的参数
  9. HttpHeaders headers = request.getHeaders();
  10. String token = headers.getFirst("token");
  11. // MultiValueMap<String, String> queryParams = request.getQueryParams();
  12. //获取参数中的指定参数
  13. // String token = queryParams.getFirst("token");
  14. //判断token是否失效
  15. if("1".equals(token)){
  16. //放行
  17. return chain.filter(exchange);
  18. }
  19. //设置状态码
  20. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  21. //拦截请求
  22. return exchange.getResponse().setComplete();
  23. }
  24. }

六、跨域

1、跨域概念

域名不一致或者端口不一致

域名:www.taoobao.com和www.taoobao.org

端口:127.0.0.1:8080和127.0.0.1:8081

2、处理方式,配置文件

  1. spring:
  2. application:
  3. name: gateway-server
  4. #gateway配置
  5. cloud:
  6. gateway:
  7. #跨域
  8. globalcors: #全局的跨域处理
  9. add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
  10. cors-configurations:
  11. '[/**]':
  12. allowedOrigins: #允许那些网站的跨域请求
  13. - "https://www.baidu.com"
  14. allowedMethods: #允许跨域的请求方式
  15. - "GET"
  16. - "POST"
  17. allowedHeaders: "*" #允许在请求头中携带的头信息
  18. allowedCredentials: true # 是否允许携带cookie
  19. maxAge: 36000 #跨域监测有效期

发表评论

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

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

相关阅读