电商商城定制开发统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理

目录


一、搭建服务

电商商城定制开发网关的作用:

电商商城定制开发对用户请求做身份认证,权限校验

电商商城定制开发将用户请求路由到微服务,电商商城定制开发并实现负载均衡

电商商城定制开发对用户请求做限流

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. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. server-addr: localhost:8848 # nacos地址
  9. gateway:
  10. routes:
  11. - id: user-service # 路由标识,必须唯一
  12. uri: lb://userservice # 路由的目标地址
  13. predicates: # 路由断言,判断请求是否符合规则
  14. - Path=/user/** # 路径断言, 判断路径是否是以/user开头,如果是泽符合

二、路由断言工程Route Predicate Factory

网关路由可以配置的内容包括:

路由id:路由唯一 标示

uri:路由目的地,至此lb和http两种

predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地

filters:路由过滤器,处理请求或响应

Spring提供了11种基本的Predicate工厂:

名称说明示例

After

是某个时间点后的请求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点之前的请求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

请求必须包含某些cookie

- Cookie=chocolate, ch.p

Header

请求必须包含某些header

- Header=X-Request-Id, \d+

Host

请求必须是访问某个host(域名)

- Host=**.somehost.org,**.anotherhost.org

Method

请求方式必须是指定方式

- Method=GET,POST

Path

请求路径必须符合指定规则

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

Query

请求参数必须包含指定参数

- Query=name, Jack或者- Query=name

RemoteAddr

请求者的ip必须是指定范围

- RemoteAddr=192.168.1.1/24

Weight

权重处理

        在配置文件中写的断言规则只是字符串,这些字符串汇编被Predicate Factory读取并处理,转变为路由判断的条件

三、路由过滤器

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

过滤器工厂GatewayFilterFactory:

Spring中提供了31种不同的路由过滤器工程,可进入Spring官网进行查阅学习:

案例:给所有进入userservice的请求添加一个请求头

实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

  1. spring:
  2. application:
  3. name: gateway
  4. cloud:
  5. nacos:
  6. server-addr: localhost: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. - After=2031-04-13T15:14:47.433-08:00[Asia/Shanghai]
  18. default-filters:
  19. - AddRequestHeader=Truth,Itcast is freaking aowsome!

过滤器的作用

对路由的请求或响应做加工处理,比如添加请求头

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

四、全局过滤器GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter作用一样

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口:

  1. public interface GlobalFilter {
  2.    /**
  3.     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
  4.     *
  5.     * @param exchange 请求上下文,里面可以获取Request、Response等信息
  6.     * @param chain 用来把请求委托给下一个过滤器
  7.     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
  8.     */
  9.    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
  10. }

案例:定义全局过滤器,拦截并判断用户身份

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件

参数中是否有authorization

authorization参数值是否为admin

如果同时满足则放行,否则拦截

自定义过滤器类,实现GlobalFilter接口,添加@Order注解:

  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. }
  26. }

全局过滤器作用:对所有路由都生效的过滤器,并且可以自定义处理逻辑

实现全局过滤器的步骤:

1、实现GlobalFilter接口

2、添加@Order注解或实现Order接口

3、编写处理逻辑

过滤器执行顺序

        请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行过滤器

● 每个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

● GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order,由自己指定

● 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增

● 当过滤器的order值一样时,会按照defaultFilter > 路由过滤器 > GlobaFilter的顺序执行

五、跨域问题处理

跨域:域名不一致就是跨域,主要包括:

域名不同:www.taobao.com和www.taobao.org和www.jd.com和miaosha.jd.com

域名相同,端口不同:localhost:8080和localhost:8081

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

解决方案:CORS

网关处理跨域采用的同样是CORS方案,并只需要简单配置即可实现:

  1. spring:
  2. cloud:
  3. gateway:
  4. # ........
  5. globalcors: # 全局的跨域处理
  6. add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
  7. corsConfigurations:
  8. '[/**]':
  9. allowedOrigins: # 允许哪些网站的跨域请求
  10. - "http://localhost:63343"
  11. - "http://www.leyou.com"
  12. allowedMethods: # 允许的跨域ajax的请求方式
  13. - "GET"
  14. - "POST"
  15. - "DELETE"
  16. - "PUT"
  17. - "OPTIONS"
  18. allowedHeaders: "*" # 允许在请求中携带的头信息
  19. allowCredentials: true # 是否允许携带cookie
  20. maxAge: 360000 # 这次跨域检测的有效期
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发