gateway

概念

springCloud网关组件

作用

鉴权、监控、限流、路由、负载均衡

使用步骤

1)导包

  1. <!--Gateway(zuul)网关组件依赖包-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. <!--Eureka Client依赖包,网关需要注册到注册中心-->
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  10. </dependency>

2)配置

  1. #网关核心要素:断言predicates-->过滤filter-->路由route
  2. server:
  3. port: 8001
  4. spring:
  5. application:
  6. name: gateway-web #网关工程名称,也就是ServiceID
  7. cloud:
  8. gateway:
  9. globalcors:
  10. cors-configurations:
  11. '[/**]': # 匹配所有请求
  12. allowedOrigins: "*" #跨域处理 允许所有的域
  13. allowedMethods: # 支持的方法
  14. - GET
  15. - POST
  16. - PUT
  17. - DELETE
  18. routes:
  19. - id: changgou-service-goods_route
  20. #lb表示loadbalanced,使用goods服务名从Eureka获取地址列表,通过负载均衡筛选一个服务器地址
  21. uri: lb://goods
  22. predicates:
  23. - Path=/api/spu/**
  24. filters:
  25. #- PrefixPath=/brand
  26. - StripPrefix=1
  27. #用户微服务
  28. - id: changgou_user_route
  29. uri: lb://user
  30. predicates:
  31. - Path=/api/user/**
  32. filters:
  33. - StripPrefix=1

网关执行流程分析

  1. #核心3要素:
  2. predicates:
  3. - Path=/api/spu/**
  4. filters:
  5. - StripPrefix=1
  6. uri: lb://goods
  7. http://localhost:8001/api/sku/index.html
  8. http://localhost:8001/api/spu/index.html
  9. 1)判断请求路径“/api/sku/index.html”是否和断言的path="/api/spu/**"匹配
  10. 断言“不匹配”--->不会被"过滤"和"路由"--->直接访问网关中的资源
  11. 2)判断请求路径“/api/spu/index.html”是否和断言的path="/api/spu/**"匹配
  12. 断言“匹配”--->会被"过滤"和"路由"
  13. 过滤--->StripPrefix=1,去除请求路径中第一个“/”后的内容--->/spu/index.html
  14. 路由--->lb://goods,从注册中心,负载均衡的获取一个服务器地址,拼接到”过滤后“的地址上,进行请求转发--->
  15. http://locahost:9001/spu/index.html
  16. 注意:网关路由请求,默认使用的转发forward

3)代码

  1. /*(1)在引导类添加@EnableEurekClient,把网关工程注入注册中心*/
  2. @SpringBootApplication
  3. @EnableEurekClient
  4. public class XxxGatewayApplication{}
  5. /*(2)定义全局或局部过滤器*/
  6. /*(2.1)全局过滤器,特点:不需要配置,对所有路由生效;2个重要接口:GlobalFilter、Ordered*/
  7. @Component
  8. public class XxxxFilter implements GlobalFilter, Ordered {
  9. /**
  10. *exchange主要作用获取请求和响应对象 request、response
  11. *chain包含了所有的过滤器,在该对象中可以查看到所有要执行的过滤器,执行过滤器(增强)放行
  12. */
  13. @Override
  14. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  15. //业务增强
  16. return chain.filter(exchange);
  17. }
  18. @Override
  19. public int getOrder() {
  20. return 0;//指定该全局过滤器在所有过滤器中的执行顺序,值越小优先级越高
  21. }
  22. }
  23. /*(2.2)局部过滤器,特点:需要配置,配置在那个路由对那个路由生效;1个重要接口:GatewayFilterFactory*/
  24. /*特别注意:局部过滤器一定一定一定是以【GatewayFilterFactory】结尾,否则不生效*/
  25. @Component
  26. public class XxxxGatewayFilterFactory implements GatewayFilterFactory{
  27. /*执行增强的业务逻辑*/
  28. @Override
  29. public GatewayFilter apply(RequestCookieGatewayFilterFactory.Config config) {
  30. return (exchange, chain) -> {
  31. //业务增强
  32. return chain.filter(exchange);
  33. };
  34. }
  35. /*获取配置文件中过滤器传递过来的参数*/
  36. public class Config {
  37. private String params;
  38. public Config() {
  39. }
  40. public int getParams() {
  41. return this.params;
  42. }
  43. public void setParams(int params) {
  44. this.params = params;
  45. }
  46. }
  47. }
  1. #局部过滤器配置文件
  2. #Xxxx代表局部过滤器的【类名称-GatewayFilterFactory】
  3. #【abc】就是传递给Config内部类的params参数值
  4. filters:
  5. - Xxxx=abc