• Nginx流量控制


    Nginx流量控制

    流量复制

    项目进行迁移上云,如何在不影响现有项目的情况下,进行验证测试,平滑迁移。理论上分割部分流量到云上进行验证,确定没有问题逐渐迁移,如果nginx不好分割流量的情况,其实不太好做迁移,风险太大。

    nginx支持流量复制,在接收请求时,可以复制流量到另外的服务器而不关心响应,对原本的项目不会产生任何影响。

    复制的流量转发到云上的服务跑动,验证数据流程没有问题,就可以对其整体切换。

    ngx_http_mirror_module

    implements mirroring of an original request by creating background mirror subrequests. Responses to mirror subrequests are ignored.
    通过创建后台镜像子请求实现原始请求的镜像。对镜像子请求的响应将被忽略;
    场景:可以做流量复制,不关心响应。作为机房迁移上云的过渡挺合适的,或者说是作为复制请求测试。

    location / {
        mirror /mirror;
        proxy_pass http://backend;
    }
    
    location = /mirror {
        internal;
        proxy_pass http://test_backend$request_uri;
    }
    

    参考:http://nginx.org/en/docs/http/ngx_http_mirror_module.html

    流量分割

    服务的流量压力巨大,并且个别接口有时候因为访问量暴涨,会影响到其他的接口服务;单个接口也可能因为某个维度爆量,影响其他维度的服务。所以就有必要对流量进行切割,使他们相互独立,隔离,达到解耦的效果。

    举个实际项目中的应用列子,虽然使用k8s中的ingress处理的,但理论上没啥差别。

    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      namespace: bigdata
      name: adc-ingress
      annotations:
        ingress.kubernetes.io/rewrite-target: /
        kubernetes.io/ingress.class: "nginx"					# ingress指定nginx		
        nginx.ingress.kubernetes.io/server-snippet: |     # 设置nginx 服务脚本配置
            set $flag 0;
            if ( $uri = /click) {
              set $flag 1;
            }
            if ( $args ~ project=ios ) {
              set $flag 1$flag;
            }
            if ( $flag = 11 ) {
              rewrite ^/(.*) $uri-ios break;
            }
    spec:
      rules:
        - host: walking.sun.com
          http:
            paths:															# path对应nginx path
              - path: /click/google
                backend:
                  serviceName: google-srv       # 指定path 请求会转发到对应的svc
                  servicePort: 8080
              - path: /click-ios
                backend:
                  serviceName: web-ios-srv
                  servicePort: 8080
              - path: /click
                backend:
                  serviceName: web-srv
                  servicePort: 8080
        - host: walking.sun123.com
          http:
            paths:
              - path: /click/google
                backend:
                  serviceName: google-srv
                  servicePort: 8080
      tls:																			# 开发tls
        - hosts:
            - walking.sun.com
          secretName: sun.com
        - hosts:
            - walking.sun123.com
          secretName: sun123.com
    

    可以看到有根据接口路径进行拆分,有根据解析参数进行切割,其实就是nginx的语法。

  • 相关阅读:
    微信小程序开发框架技术选型
    WebApiThrottle限流框架使用手册
    MicroService 微服务架构模式简述
    .net Core 微服务框架 surging 使用
    C#最佳工具集合:IDE、分析、自动化工具等
    神经网络编程入门
    ABP+AdminLTE+Bootstrap Table aspnetboilerplate 学习
    转 Web用户的身份验证及WebApi权限验证流程的设计和实现
    C# 调用webservice 几种办法(转载)
    C++ sort函数用法
  • 原文地址:https://www.cnblogs.com/followyou/p/14255959.html
Copyright © 2020-2023  润新知