通过URL参数请求不同的后端服务器

K8S环境下多分支测试
本文介绍在Kubernetes环境中,如何通过OpenResty和Lua脚本实现不同环境的动态路由,使外网能访问内网搭建的多个分支测试环境。通过请求参数或header指定目标环境,有效解决域名冲突问题。

内网通过K8S搭建多个分支测试环境,可是如果外网需要访问而且域名都是一致的情况下,这个时候变得麻烦了。如何通过不同的请求参数访问不同的后端环境呢,答案是可以的,通过lua可以达到。

入口:
http://fengwan.blog.51cto.com/?envs=branches #branches环境
http://fengwan.blog.51cto.com/?envs=branchesv2 #branchesv2环境

另外考虑到APP请求的时候无法通过参数来处理,我们可以添加统一的请求header: envs
curl --header "envs:branches" http://fengwan.blog.51cto.com
curl --header "envs:branchesv2" http://fengwan.blog.51cto.com

我们通过Openresty判断头部然后选择不同的后端环境
Nginx配置:

    upstream branches {
        server 10.254.220.47:80;
    }
    upstream branchesv2 {
        server 10.254.60.225:80;
    }

    upstream default {
        server  10.254.220.47:80;
    }
            server {
        listen       80;
        server_name  fengwan.blog.51cto.com;
        location / {
                lua_code_cache on;
                set $upstreamhost "";
                rewrite_by_lua_file /etc/nginx/conf.d/html/proxy.lua;

                proxy_redirect off ;
               proxy_set_header Host $host;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header REMOTE-HOST $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               client_max_body_size 50m;
               client_body_buffer_size 256k;
               proxy_connect_timeout 30;
               proxy_send_timeout 30;
               proxy_read_timeout 60;
               proxy_buffer_size 256k;
               proxy_buffers 4 256k;
               proxy_busy_buffers_size 256k;
               proxy_temp_file_write_size 256k;
               proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
               proxy_max_temp_file_size 128m;

                proxy_pass http://$upstreamhost;
        }
   }

lua脚本内容
/etc/nginx/conf.d/html/proxy.lua;

local request_method = ngx.var.request_method
local args = nil
local param = nil
local param2 = nil

if "GET" == request_method then
    args = ngx.req.get_uri_args()
elseif "POST" == request_method then
    ngx.req.read_body()
    args = ngx.req.get_post_args()
end

if ngx.var.cookie_envs == 'branches' then
        ngx.var.upstreamhost = "branches"
elseif ngx.var.cookie_envs == 'branchesv2' then
        ngx.var.upstreamhost = "branchesv2"
end

if not args or not args["envs"] then
        if not ngx.req.get_headers()['envs'] then
                ngx.var.upstreamhost = "default"
        elseif ngx.req.get_headers()['envs'] == 'branches' then
                ngx.var.upstreamhost = "branches"
        elseif ngx.req.get_headers()['envs'] == 'branchesv2' then
                ngx.var.upstreamhost = "branchesv2"
        else
                ngx.var.upstreamhost = "tags"
        end
elseif args["envs"] == 'branches' then
        ngx.header["Set-Cookie"]= "envs=branches; path=/"
        ngx.var.upstreamhost = "branches"
elseif  args["envs"] == 'branchesv2' then
        ngx.header["Set-Cookie"]= "envs=branchesv2; Path=/"
        ngx.var.upstreamhost = "branchesv2"
end

转载于:https://blog.51cto.com/fengwan/2391359

### 回答1: 当你发送GET请求后端服务器时,服务器会解析请求并返回响应。响应通常由HTTP状态码,响应头和响应体组成。 HTTP状态码是一个3位数字,用于表示请求的处理结果。常见的状态码包括: - 200 OK - 请求成功 - 404 Not Found - 请求的资源不存在 - 500 Internal Server Error - 服务器内部错误 响应头包含一些元数据,如Content-Type(响应体的MIME类型)、Content-Length(响应体的长度)、Cache-Control(缓存控制)等。 响应体是服务器返回的实际数据,可以是HTML、JSON、XML等格式的文本,也可以是二进制文件。 当你收到响应后,可以解析响应头和响应体,以获取所需的数据。 ### 回答2: 当客户端发起一个GET请求时,以下是后端服务器的响应过程: 1. 客户端发起GET请求,包含请求URL参数、头部信息等。 2. 后端服务器接收到GET请求。 3. 服务器根据请求URL参数,判断需要处理这个请求的处理程序或者对应的资源文件。 4. 服务器根据请求URL参数,从数据库或者其他数据源中获取所需数据。 5. 如果需要,服务器对获取的数据进行处理、加工或者计算。 6. 服务器生成响应的内容,包括响应头部信息和响应主体内容。 7. 服务器将生成的响应发送给客户端。 8. 客户端接收到服务器的响应。 9. 客户端根据响应的内容对接收到的数据进行解析和处理,如果是HTML页面的话,就渲染显示;如果是其他数据格式的话,就进行相应的操作。 10. 客户端根据需要对响应进行处理,比如缓存响应内容、提取数据、调用相关操作等。 11. 客户端完成对响应的处理后,根据需要可能会发起其他请求或者进行其他操作。 总之,GET请求时客户端向后端服务器请求数据,后端服务器根据请求参数URL从数据库或其他数据源中获取所需数据,再将响应发送给客户端,客户端接收响应后进行解析和处理。 ### 回答3: 当前端发起一个GET请求时,首先会向后端服务器发送一个HTTP请求。在请求URL中可以包含查询参数,以便将需要的信息发送给后端服务器后端服务器接收到这个请求后,会解析URL中的参数,并根据参数中的信息来执行相应的处理逻辑。 后端服务器可以根据请求URL来确定需要执行的代码逻辑,例如从数据库中获取数据、进行计算、生成HTML页面等等。服务器执行完相应的处理逻辑后,会生成响应数据,然后将响应数据发送回前端。 在返回响应数据之前,服务器需要设置一些HTTP头部,例如Content-Type代表响应数据的类型(如application/json表示JSON数据、text/html表示HTML数据等),Content-Length表示响应数据的长度等。 当前端接收到服务器发回的响应数据后,会根据Content-Type来确定如何解析处理这些数据。如果是JSON数据,前端可以使用JSON.parse()来将数据转换为JavaScript对象。如果是HTML数据,前端可以直接将数据插入到DOM中,以显示页面内容。 除了响应数据外,服务器还可以设置响应的状态码,以指示请求的处理结果。常见的状态码如200表示请求成功,400表示请求有语法错误,404表示请求的资源不存在等。 综上所述,当前端发起一个GET请求时,后端服务器会解析请求URL中的参数,执行相应的处理逻辑,生成响应数据并设置响应的状态码和头部信息,最后将响应数据发送给前端,前端根据响应的Content-Type来解析和处理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值