电商项目-微服务网关使用的问题

  一、微服务网关跨域问题

  项目采用前后端分离架构,前段存在自己的前段系统,并且会单独部署,同样后端系统也都是单独部署,这样就一定存在跨域问题。可以在controller类上添加注解来进行解决,但是现在的访问都是基于网关进行操作,所以还需要在网关系统上对跨域问题进行解决。具体解决方案:在网关系统添加配置信息:

  修改application.yml ,在spring.cloud.gateway节点添加配置:

      globalcors:         cors-configurations:           '[/**]': # 匹配所有请求             allowedOrigins: "*" #跨域处理 允许所有的域             allowedMethods: # 支持的方法             - GET             - POST             - PUT             - DELETE

 

网关模块spring.cloud.gateway的配置文件application.yml如下:

spring:   application:     name: sysgateway   cloud:     gateway:       globalcors:         cors-configurations:           '[/**]': # 匹配所有请求             allowedOrigins: "*" #跨域处理 允许所有的域             allowedMethods: # 支持的方法             - GET             - POST             - PUT             - DELETE       routes:       - id: goods         uri: lb://goods         predicates:         - Path=/goods/**         filters:         - StripPrefix= 1 server:   port: 9101 eureka:   client:     service-url:       defaultZone: http://127.0.0.1:6868/eureka   instance:     prefer-ip-address: true

 

 

  二、微服务网关自定义过滤器

 

  当有了网关系统,客户端所有访问先进入到网关中,由网关将请求转发到具体某个服务。基于这个特点,可以在网关上通过过滤器的形式进行特定业务的操作:比如ip(黑白名单)拦截、特定地址的拦截等。
  定义两个过滤器 :获取客户端访问IP 和客户端访问URL地址:

  (1)shangcheng_gateway_system创建IpFilter(获取客户端访问IP)

@Component public class IpFilter implements GlobalFilter, Ordered { ​     //具体业务逻辑     @Override     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ​         System.out.println("经过第1个过滤器IpFilter");         ServerHttpRequest request = exchange.getRequest();         InetSocketAddress remoteAddress = request.getRemoteAddress();         System.out.println("ip:"+remoteAddress.getHostName());         return chain.filter(exchange);//放行过滤器     } ​         //过滤器的执行优先级     @Override     public int getOrder() {         return 1;     } }

 

 

(2)shangcheng_gateway_system创建UrlFilter(获取客户端访问url地址)

 

@Component public class UrlFilter implements GlobalFilter, Ordered {       //具体业务逻辑​     @Override     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {         System.out.println("经过第2个过滤器UrlFilter");         ServerHttpRequest request = exchange.getRequest();         String url = request.getURI().getPath();         System.out.println("url:"+url);         return chain.filter(exchange);//放行过滤器     } ​    //过滤器的执行优先级     @Override     public int getOrder() {         return 2;     } }

 

 

三、网关访问路由转发测试

网关访问路由转发测试:
  直接访问Goods微服务:localhost:9001/brand/category/手机

  成功返回结果。
  访问网关:localhost:9101/goods/brand/category/手机

  成功返回结果。

发表评论

评论已关闭。

相关文章