[Spring cloud 一步步实现广告系统] 3. 网关路由

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spring cloud 一步步实现广告系统] 3. 网关路由相关的知识,希望对你有一定的参考价值。

Zuul(Router and Filter)

WIKI: 传送门

技术图片

作用
  1. 认证,鉴权(Authentication/Security)
  2. 预判(Insights)
  3. 压力测试(Stress Testing)
  4. 灰度/金丝雀测试(Canary Testing)
  5. 动态路由(Dynamic Routing)
  6. 服务迁移(Service Migration)
  7. 降低负载(Load Shedding)
  8. 静态响应处理(Static Response handling)
  9. 主动/主动交换管理(Active/Active traffic management)

关键配置:

The configuration property zuul.host.maxTotalConnections and zuul.host.maxPerRouteConnections, which default to 200 and 20 respectively.

创建mscx-ad-zuul

三步曲创建法:

添加依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
加注解
@SpringCloudApplication
@EnableZuulProxy //启用网关
public class GatewayApplication 
    public static void main(String[] args) 
        SpringApplication.run(GatewayApplication.class, args);
    
改配置
spring:
  application:
    name: ad-gateway-zuul
server:
  port: 1111
eureka:
  client:
    service-url:
      defaultZone: http://server1:7777/eureka/,http://server2:8888/eureka/,http://server3:9999/eureka/
  instance:
    hostname: ad-gateway-zuul
zuul:
  ignored-services: ‘*‘ # 过滤所有请求,除了下面routes中声明过的服务
  routes:
    sponsor: #在路由中自定义服务路由名称
      path: /ad-sponsor/**
      serviceId: mscx-ad-sponsor #微服务name
      strip-prefix: false
    search: #在路由中自定义服务路由名称
      path: /ad-search/**
      serviceId: mscx-ad-search #微服务name
      strip-prefix: false
  prefix: /gateway/api
  strip-prefix: false #不对 prefix: /gateway/api 设置的路径进行截取,默认转发会截取掉配置的前缀
过滤器编写

我们来编写一个记录请求时间周期的过滤器,根据Filter的三种类型:Pre filters,routing filtersPost filters,我们需要定义2个filter,用来记录开始和结束时间,很明显,我们需要实现Pre & Post2个过滤器。

@Slf4j
@Component
public class PreRequestFilter extends ZuulFilter 
    @Override
    public String filterType() 
        // pre filter
        return FilterConstants.PRE_TYPE;
    

    @Override
    public int filterOrder() 
        return 0;
    

    @Override
    public boolean shouldFilter() 
        return true;
    

    @Override
    public Object run() throws ZuulException 
        //获取当前请求的请求上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        //记录请求进入时间
        requestContext.set("api_request_time", System.currentTimeMillis());
        return null;
    


---

@Slf4j
@Component
public class AccessLogFilter extends ZuulFilter 

    @Override
    public String filterType() 
        return FilterConstants.POST_TYPE;
    

    @Override
    public int filterOrder() 
        //需要最后一个执行的filter
        return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
    

    @Override
    public boolean shouldFilter() 
        return true;
    

    @Override
    public Object run() throws ZuulException 
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        log.info("Request \"\" spent :  seconds.", request.getRequestURI(),
                (System.currentTimeMillis() - Long.valueOf(requestContext.get("api_request_time").toString())) / 1000);
        return null;
    

Gateway

后续更新

以上是关于[Spring cloud 一步步实现广告系统] 3. 网关路由的主要内容,如果未能解决你的问题,请参考以下文章

[Spring cloud 一步步实现广告系统] 17. 根据流量类型查询广告

[Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结

[Spring cloud 一步步实现广告系统] 3. 网关路由

[Spring cloud 一步步实现广告系统] 12. 广告索引介绍

[Spring cloud 一步步实现广告系统] 5. 投放系统配置+启动+实体类

[Spring cloud 一步步实现广告系统] 8. 检索系统配置&依赖