docker 相关笔记

Import-Module DockerCompletion
grpcurl -plaintext -proto hello.proto -d '{"name": "Alice"}' 10.60.32.253:9081 com.grpc.nacos.demo.HelloService.SayHello

# docker 代理:

  1. 确保 Dockerfile 中正确配置了代理:不可取,这样生成的镜像所构建的容器也会转发到该代理

    # 使用参数传入代理地址
    ARG HTTP_PROXY
    ARG HTTPS_PROXY
    
    # 配置代理环境变量
    ENV HTTP_PROXY=${HTTP_PROXY}
    ENV HTTPS_PROXY=${HTTPS_PROXY}
    ENV NO_PROXY=localhost,127.0.0.1,.example.com
    
    
        "registry-mirrors": [
        	"https://docker.domys.cc",
            "https://hub.domys.cc",
            "https://dockerproxy.com",
        	"https://docker.nju.edu.cn",
        	"https://mirror.baidubce.com"
        ],
    
  2. # 使用参数传入代理地址
    ARG HTTP_PROXY
    ARG HTTPS_PROXY
    
    # 仅在特定命令中使用代理
    RUN env http_proxy=${HTTP_PROXY} https_proxy=${HTTPS_PROXY} \
        curl -O https://example.com/some-package.tar.gz
    
    # 其他命令不需要代理
    RUN some-other-command
    
  3. 检查 Clash 的监听地址

    查看 Clash 配置文件(通常是 config.yamlclash.yaml )中代理的监听地址:

    port: 7890              # HTTP/HTTPS 代理端口
    socks-port: 7891        # SOCKS5 代理端口
    allow-lan: true         # 是否允许局域网访问代理
    bind-address: 0.0.0.0   # 代理服务绑定的地址
    

    重点检查:

    • allow-lan 是否设置为 true ,表示允许局域网访问。
    • bind-address 是否为 0.0.0.0 ,表示监听所有接口(包括 Docker 的 172.17.0.1 )。

    如果 allow-lanfalse 或未设置,则需要修改为 true

  4. 运行构建命令时,正确传递代理地址:

    sudo docker build -t nwpuapi-dashboard-arm64:1.0.0 .
    
    
    sudo docker build \
        --build-arg HTTP_PROXY=http://172.16.0.13:7890 \
        --build-arg HTTPS_PROXY=http://172.16.0.13:7890 \
        -t koa-v-arm64:latest .
              
    
    # 指定dockerfile文件
    docker build -t docker-local -f Dockerfile.local
    

# docker 修改容器并存为新镜像

  1. 使用 docker run -it --entrypoint /bin/bash 镜像名称 进入容器终端修改之后新开终端

  2. 使用 docker commit <容器ID或容器名称> 新镜像名称

  3. 修改启动命令

    docker commit --change='ENTRYPOINT ["/启动命令"]' --change='CMD ["启动参数"]' 容器id docker-local-with-changes
    
    docker commit --change='ENTRYPOINT ["/docker-entrypoint.sh"]' --change='CMD ["docker-start"]' 52e9ad70133f nwpuapi-arm64:2.0.2
    
docker run -it --entrypoint /bin/bash -c "unset http_proxy https_proxy" nwpuapi-arm64:2.0.1 

# aisix 镜像,etcd 镜像,dashboard 镜像

  1. 需要创建一个网络:用于 APISIX 和其他服务之间的通信

    docker network create nwpuapi-network
    
  2. 启动 etcd 容器时将其加入上述创建的网络中,可以开启授权,公网也可以访问

    docker run -d --name etcd --network=nwpuapi-network -p 2379:2379 quay.io/coreos/etcd:v3.5.5 etcd \
    --advertise-client-urls=http://0.0.0.0:2379 \
    --listen-client-urls=http://0.0.0.0:2379
    
    docker run -d --name etcd --network=nwpuapi-network \
        -p 2379:2379 -p 2380:2380 \
        -e ALLOW_NONE_AUTHENTICATION=yes \
        -e ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" \ 
        -e ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379" \  
        bitnami/etcd:latest
    
    docker run -d --name etcd-server --network=nwpuapi-network \
    -p 2379:2379 \
    -p 2380:2380 \
    quay.io/coreos/etcd:v3.5.5 \
    etcd --data-dir=/etcd-data \
    --advertise-client-urls http://0.0.0.0:2379 \
    --listen-client-urls http://0.0.0.0:2379
    
    docker run -d --name etcd-server --network=nwpuapi-network \
    -p 0.0.0.0:2379:2379 \
    -p 0.0.0.0:2380:2380 \
    quay.io/coreos/etcd:v3.5.5 \
    etcd --data-dir=/etcd-data \
    --advertise-client-urls http://0.0.0.0:2379 \
    --listen-client-urls http://0.0.0.0:2379
    
    • 注:这里 172.18.0.2apisix-network 网络分配给 etcd-serverip ,可自行替换或使用 0.0.0.0

    • 参数说明:

    1730797527759

  3. 在 APISIX 的 config.yaml 文件中,将 etcd 的地址更新为 etcd-server:2379 ,加入同一个网络可以直接使用容器名 + 端口访问

    etcd:
      host:
        - "http://etcd-server:2379"
    
  4. 启动 apisix 容器时将其连接到上述创建的网络当中

    docker run -d --name nwpuapi-test --network=nwpuapi-network -p 9080:9080 -p 9443:9443 -p 9180:9180 -p 9091:9091 -v $(pwd)/conf/config.yaml:/usr/local/apisix/conf/config.yaml nwpuapi-arm64:3.0.0
    
     -e http_proxy="http://172.16.0.13:7890" -e https_proxy="http://172.16.0.13:7890" 
    
    docker run -it --name apites --network=nwpuapi-network --entrypoint /bin/bash nwpuapi-arm64:2.0.1
    
    • 参数说明

    1730797082674

  5. 编辑 Dashboard 的配置文件,确保 apisix-dashboard 容器连接到正确的 etcd 地址: 在 apisix-dashboard 的配置文件中( conf/conf.yaml ),确保 etcd 地址设置为 http://172.18.0.2:2379 ( dashboard 使用容器名 + 端口只能读取不能修改 etcd-server 的内容):

    security 为嵌入其他页面所必须, ip 需要自行修改为待嵌入网页 ip

    etcd:
      endpoints:
        - "http://172.18.0.2:2379"
        
    security:
      content_security_policy: "default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-src 192.168.226.128:3000"
    
  6. 启动 Dashboard 容器: 运行以下命令,将 Dashboard 加入同一网络,并指定 etcd 地址

    docker run -d --name nwpuapi-dashboard --network=nwpuapi-network \
    -p 9000:9000 -v $(pwd)/conf/conf.yaml:/tmp/build/output/nwpuapi/dashboard/usr/local/nwpuapi/dashboard/conf/conf.yaml \
    nwpuapi-dashboard-arm64:1.0.0
    

# zipkin 镜像:

  1. 下载镜像:

    docker pull openzipkin/zipkin
  2. 启动容器

    docker run -d --name zipkin --network=apisix-network -p 9411:9411 openzipkin/zipkin
  3. 访问地址:

    http://127.0.0.1:9411/zipkin
    
  4. 路由示例:

    curl http://127.0.0.1:9180/nwpuapi/admin/routes/zip  -X PUT -d '
    {
        "methods": ["GET"],
        "uri": "/ip",
        "plugins": {
            "zipkin": {
                "endpoint": "http://172.18.0.1:9411/api/v2/spans",
                "sample_ratio": 1,
                "service_name": "APISIX-nwpu",
                "server_addr": "192.168.226.128"
            }
        },
      "upstream": {
        "type": "roundrobin",
        "nodes": {
          "httpbin.org:80": 1
        }
      }
    }'
    curl -i -X DELETE http://127.0.0.1:9180/nwpuapi/admin/routes/zip

# prometheus 镜像

  1. 下载镜像

    docker pull prom/prometheus
  2. 创建配置文件 prometheus.yamlPrometheus 就可以自动抓取指标数据,需要的是 apisix 所在环境 ip

    scrape_configs:
      - job_name: "apisix"
        scrape_interval: 15s
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["172.18.0.1:9091"]
  3. 启动容器,挂载配置文件:

    9090 端口被 apisix 占用,映射到主机的 9092 端口

    docker run -d --name prometheus --network=nwpua-network \
      -p 9092:9090 \
      -v /home/wlp/apisixFile/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  4. 访问地址:

    http://localhost:9092/targets
    
  5. 路由示例:

    curl http://127.0.0.1:9180/nwpuapi/admin/routes/zip  -X PUT -d '
    {
        "uri": "/ip",
        "plugins": {
            "prometheus": {}
        },
      "upstream": {
        "type": "roundrobin",
        "nodes": {
          "httpbin.org:80": 1
        }
      }
    }'
    curl http://127.0.0.1:9180/nwpuapi/admin/routes/1 \
    -H "X-API-KEY: $admin_key" -X PUT -d '
    {
        "methods": ["GET"],
        "uri": "/test/index.html",
        "plugins": {
            "response-rewrite": {
                "body": "{\"code\":\"ok\",\"message\":\"new json body\"}",
                "headers": {
                    "set": {
                        "X-Server-id": 3,
                        "X-Server-status": "on",
                        "X-Server-balancer-addr": "$balancer_ip:$balancer_port"
                    }
                },
                "vars":[
                    [ "status","==",200 ]
                ]
            }
        },
        "upstream": {
            "type": "roundrobin",
            "nodes": {
                "127.0.0.1:80": 1
            }
        }
    }'
    
  6. 注意:

    apisix 的配置文件 config.yaml

    这个暴露的是内部访问端口

    enable_control: true
      control:
        ip: "0.0.0.0"
        port: 9090

    默认启用 prometheus 插件,该插件默认创建 /prometheus/metrics 接口,并通过独立的服务地址(默认为 127.0.0.1:9091 )暴露指标

    prometheus:
        metric_prefix: apisix_
        enable_export_server: true
        export_uri: /prometheus/metrics
        export_addr:
          port: 9091
          ip: 0.0.0.0

    配置完成后,可以通过以下命令提取相关监控指标:

    curl -i http://127.0.0.1:9091/prometheus/metrics
    curl -i http://127.0.0.1:9080/ip
curl -i "http://127.0.0.1:9180/nwpuapi/admin/routes" -X PUT -d '
{
  "id": "getting-started-ip",
  "uri": "/ip",
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

# grafana 镜像

  1. 下载镜像:

    docker pull grafana/grafana
  2. 创建配置文件 grafana.ini

    允许嵌入、允许匿名登录、中文

    [security]
    allow_embedding = true
    [auth.anonymous]
    enabled = true
    [users]
    default_language = zh-Hans
  3. 启动容器,挂载配置文件:

    docker run -d --name grafana --network=apisix-network \
      -p 3000:3000 \
      -v /home/wlp/apisixFile/grafana.ini:/etc/grafana/grafana.ini \
      grafana/grafana
  4. 登录 Grafana(默认地址为 http://127.0.0.1:3000 ),默认用户和密码均为 admin 。登录成功后,在当前页面单击 Add your first data source ,选择 Prometheus ,配置 URL 为 http://172.18.0.1:9092prometheus 容器 ip 9090

    1741181835334

  5. 导入仪表盘,前往 grafana.com 搜索 apisix 下载仪表盘 json 文件或复制 id

    image-20250305214009145

  6. 嵌入 仪表盘到 APISIX Dashboard ,复制第五步界面的 url 将其粘贴到下图所示位置

    image-20250305214322835

# nacos

实践:https://nacos.io/zh-cn/blog/apisix.html

  1. 使用 Node.js 的 Koa 框架在 3005 端口启动一个简单的测试服务作为上游。

    const Koa = require('koa');
    const app = new Koa();
    app.use(async ctx => {
      ctx.body = 'Hello World';
    });
    app.listen(3005);
  2. 在命令行中通过请求 Nacos Open API 的方式进行服务注册。

    bash startup.sh -m standalone
    bash shutdown.sh
    curl http://127.0.0.1:9180/apisix/admin/routes/test -X PUT -i -d '
    {
        "uri": "/nacos/*",
        "upstream": {
            "service_name": "APISIX-NACOS-name",
            "type": "roundrobin",
            "discovery_type": "nacos"
        }
    }'
    
    curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=APISIX-NACOS&ip=10.233.0.17&port=3005&ephemeral=false'
    curl -X POST "http://10.60.32.253:8848/nacos/v2/ns/instance?serviceName=grpctestname&ip=10.233.0.14&port=50051&ephemeral=false"
    curl -X POST "http://10.60.32.253:8848/nacos/v1/ns/instance?serviceName=api-breaker&ip=10.233.0.17&port=3013&ephemeral=false"
    curl -X POST "http://nacos:nacos@10.60.32.253:8848/nacos/v2/ns/instance?serviceName=koa-3007&ip=10.233.0.17&port=3007&ephemeral=false"
    curl -X POST "http://10.60.32.253:8848/nacos/v2/ns/instance?serviceName=v1_v2&ip=10.233.0.15&port=3006&username=nacos&password=nacos&ephemeral=false"
    curl -X POST "http://10.60.32.253:8848/nacos/v1/ns/instance?serviceName=Version-V2&ip=10.233.0.17&port=3007&ephemeral=false"
    curl http://10.60.32.253:9080/dev/Version-V2/api/health
    curl -X POST 'http://10.60.32.253:8848/nacos/v1/ns/instance?serviceName=LB&ip=10.233.0.17&port=3010&ephemeral=false'
    curl -X POST 'http://10.233.0.16:9180/nacos/v1/ns/instance?serviceName=test.service&ip=10.0.0.1&port=8080&ephemeral=false'
    curl -X DELETE "http://10.60.32.253:8848/nacos/v1/ns/instance?serviceName=testv2&groupName=DEFAULT_GROUP&ip=10.233.0.17&port=3006&ephemeral=false&username=nacos&password=nacos"
    
    curl -i http://10.60.32.253:9080/grpctest?name=world
    
    
    docker run --env PREFER_HOST_MODE=hostname --env MODE=standalone --env NACOS_AUTH_ENABLE=true --env NACOS_AUTH_TOKEN=NzkzZDE2YTA3MTc4YzE3ZGRlMjdiNTBkMTRmZTNjNjY5MGVhMThmMWIwOTdmMmNhM2YwM2M2OGI1OTkyN --env NACOS_AUTH_IDENTITY_KEY=$custom_server_identity_key --env NACOS_AUTH_IDENTITY_VALUE=$custom_server_identity_value -p 8848:8848 -p 9848:9848 nacos/nacos-server
    
  3. 执行服务注册后使用以下命令查询当前服务情况。

    curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=APISIX-NACOS'
  4. 修改 apisix 的配置文件

    discovery:
      nacos:
        host:
        - "http://127.0.0.1:8848"
        prefix: "/nacos/v1/"
        fetch_interval: 30  
        weight: 100          
        timeout:
          connect: 2000     
          send: 2000        
          read: 5000
  5. 新增 Nacos 路由

    使用 Apache APISIX 提供的 Admin API 创建一个新的路由,APISIX 通过 upstream.discovery_type 字段选择使用的服务发现类型, upstream.service_name 需要与注册中心的对应服务名进行关联,因此创建路由时指定服务发现类型为 nacos

    curl http://127.0.0.1:9180/nwpuapi/admins/routes/1 -X PUT -i -d '
    {
        "uri": "/nacos/*",
        "upstream": {
            "service_name": "APISIX-NACOS",
            "type": "roundrobin",
            "discovery_type": "nacos"
        }
    }'
  6. 使用以下命令发送请求至需要配置的路由。

    curl -i http://127.0.0.1:9080/nacos/

curl -i http://localhost:9180/apisix/admins/routes

curl http://127.0.0.1:9180/apisix/admins/routes/gp \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
  "uri": "/nacos/GP",
  "plugins": {
    "traffic-split": {
      "rules": [
        {
          "weighted_upstreams": [
            {
              "upstream_id": "555802857492710080",
              "timeout": {
                "connect": 15,
                "send": 15,
                "read": 15
              },
              "weight": 1
            },
            {
              "weight": 1
            }
          ]
        }
      ]
    }
  },
  "upstream": {
    "service_name": "Version-V2",
    "type": "roundrobin",
    "discovery_type": "nacos"
  }
}'
curl http://127.0.0.1:9180/apisix/admins/routes/gp \
-X PUT -d '
{
  "uri": "/nacos/GP",
  "plugins": {
    "traffic-split": {
      "rules": [
        {
          "weighted_upstreams": [
            {
              "upstream_id": "555802857492710080",
              "weight": 1
            },
            {
              "weight": 1
            }
          ]
        }
      ]
    }
  },
  "upstream_id": "555802897573479104"
}'
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
    "uri": "/index.html",
    "plugins": {
        "traffic-split": {
            "rules": [
                {
                    "match": [
                        {
                            "vars": [
                                ["http_release","==","new_release"]
                            ]
                        }
                    ],
                    "weighted_upstreams": [
                        {
                            "upstream_id": "555802857492710080",
                        }
                    ]
                }
            ]
        }
    },
    "upstream_id": "555802897573479104"
}'
curl http://127.0.0.1:9080/index.html -H 'release: new_release'

# 测试转发 https

  1. redirect 插件中将 http_to_https 设置为 true

    curl -i -X PUT http://localhost:9180/apisix/admins/routes/csdn \
      -H 'Content-Type: application/json' \
      -d '{
            "uri": "/nav/back-end",
            "upstream": {
              "type": "roundrobin",
              "nodes": [
                {
                  "host": "blog.csdn.net",
                  "port": 443,
                  "weight": 1
                }
              ]
            },
            "plugins": {
            	"redirect": {
                	"http_to_https": true
            	}
        	}
          }'
    curl http://127.0.0.1:9180/apisix/admins/routes/csdn -X PUT -d '
    {
        "uri": "/nav/back-end",
        "host": "blog.csdn.net",
        "plugins": {
            "redirect": {
                "http_to_https": true
            }
        }
    }'
    curl http://127.0.0.1:9180/apisix/admins/routes/csdn -X PUT -d '
    {
        "uri": "/nav/back-end",
        "upstream": {
        	"type": "roundrobin",
        	"nodes": {
        		"blog.csdn.net:443":1
        	}
      	},
        "plugins": {
            "redirect": {
                "http_to_https": true
            }
        }
    }'
  2. 使用 serverless 插件:

    curl -i http://127.0.0.1:9180/apisix/admins/routes/csdn -X PUT -d '
    {
        "uri": "/nav/back-end",
        "plugins": {
            "serverless-pre-function": {
                "phase": "rewrite",
                "functions": ["return function() if ngx.var.scheme == \"http\" and ngx.var.host == \"blog.csdn.net\" then ngx.header[\"Location\"] = \"https://blog.csdn.net\" .. ngx.var.request_uri; ngx.exit(ngx.HTTP_MOVED_PERMANENTLY); end; end"]
            }
        }
    }'
    curl -i -H 'Host: blog.csdn.net' http://127.0.0.1:9080/nav/back-end

# 删除的插件:

batch-requests

authz-casbin

authz-casdoor

authz-keycloak

cas-auth

forward-auth

hmac-auth

ldap-auth

opa

openid-connect

wolf-rbac

public-api

request-validation

uri-blocker

client-control

limit-req

aws-lambda

azure-functions

openfunction

openwhisk

serverless-post-function

serverless-pre-function

clickhouse-logger

datadog

google-cloud-logging

http-logger

kafka-logger

loggly

opentelemetry

request-id

rocketmq-logger

skywalking

skywalking-logger

sls-logger

splunk-hec-logging

syslog

tcp-logger

tencent-cloud-cls

udp-logger

ai

ext-plugin-post-req

gzip

kafka-proxy

mocking

proxy-cache

proxy-control

proxy-mirror

referer-restriction

# 未删插件:

prometheus

zipkin

response-rewrite

basic-auth:使用 basic-auth 插件可以将 Basic_access_authentication 添加到 Route 或 Service 中。

该插件需要与 Consumer 一起使用。API 的消费者可以将它们的密钥添加到请求头中以验证其请求。

jwt-auth: jwt-auth 插件用于将 JWT 身份验证添加到 ServiceRoute 中。

通过 Consumer 将其密匙添加到查询字符串参数、请求头或 cookie 中用来验证其请求。

key-auth: key-auth 插件用于向 Route 或 Service 添加身份验证密钥(API key)。

它需要与 Consumer 一起配合才能工作,通过 Consumer 将其密钥添加到查询字符串参数或标头中以验证其请求。

consumer-restriction: consumer-restriction 插件允许用户根据 Route、Service、Consumer 或 Consumer Group 来设置相应的访问限制。

api-breaker: api-breaker 插件实现了 API 熔断功能,从而帮助我们保护上游业务服务。

关于熔断超时逻辑,由代码逻辑自动按触发不健康状态的次数递增运算:

当上游服务返回 unhealthy.http_statuses 配置中的状态码(默认为 500 ),并达到 unhealthy.failures 预设次数时(默认为 3 次),则认为上游服务处于不健康状态。

第一次触发不健康状态时,熔断 2 秒。超过熔断时间后,将重新开始转发请求到上游服务,如果继续返回 unhealthy.http_statuses 状态码,记数再次达到 unhealthy.failures 预设次数时,熔断 4 秒。依次类推(2,4,8,16,……),直到达到预设的 max_breaker_sec 值。

当上游服务处于不健康状态时,如果转发请求到上游服务并返回 healthy.http_statuses 配置中的状态码(默认为 200 ),并达到 healthy.successes 次时,则认为上游服务恢复至健康状态。

cors: cors 插件可以让你轻松地为服务端启用 CORS(Cross-Origin Resource Sharing,跨域资源共享)的返回头。

csrf: csrf 插件基于 Double Submit Cookie 的方式,保护用户的 API 免于 CSRF 攻击。

在此插件运行时, GETHEADOPTIONS 会被定义为 safe-methods ,其他的请求方法则定义为 unsafe-methods 。因此 GETHEADOPTIONS 方法的调用不会被检查拦截。

fault-injection: fault-injection 插件是故障注入插件,该插件可以和其他插件一起使用,并在其他插件执行前被执行。

ip-restriction: ip-restriction 插件可以通过将 IP 地址列入白名单或黑名单来限制对服务或路由的访问。

支持对单个 IP 地址、多个 IP 地址和类似 10.10.10.0/24 的 CIDR(无类别域间路由)范围的限制。

ua-restriction: ua-restriction 插件可以通过将指定 User-Agent 列入白名单或黑名单的方式来限制对服务或路由的访问。

一种常见的场景是用来设置爬虫规则。 User-Agent 是客户端在向服务器发送请求时的身份标识,用户可以将一些爬虫程序的请求头列入 ua-restriction 插件的白名单或黑名单中。

limit-conn: limit-conn 插件用于限制客户端对单个服务的并发请求数。当客户端对路由的并发请求数达到限制时,可以返回自定义的状态码和响应信息。

limit-count: limit-count 插件使用固定时间窗口算法,主要用于限制单个客户端在指定的时间范围内对服务的总请求数,并且会在 HTTP 响应头中返回剩余可以请求的个数。该插件原理与 GitHub API 的速率限制类似。

traffic-split: traffic-split 插件可以通过配置 matchweighted_upstreams 属性,从而动态地将部分流量引导至各种上游服务。该插件可应用于灰度发布和蓝绿发布的场景。

match 属性是用于引导流量的自定义规则, weighted_upstreams 属性则用于引导流量的上游服务。当一个请求被 match 属性匹配时,它将根据配置的 weights 属性被引导至上游服务。你也可以不使用 match 属性,只根据 weighted_upstreams 属性来引导所有流量。

file-logger: file-logger 插件可用于将日志数据存储到指定位置。

real-ipreal-ip 插件用于动态改变传递到 Apache APISIX 的客户端的 IP 地址和端口。

它的工作方式和 NGINX 中的 ngx_http_realip_module 模块一样,并且更加灵活。

grpc-transcode:使用 grpc-transcode 插件可以在 HTTP 和 gRPC 请求之间进行转换。

APISIX 接收 HTTP 请求后,首先对请求进行转码,并将转码后的请求转发到 gRPC 服务,获取响应并以 HTTP 格式将其返回给客户端。

grpc-web: grpc-web 插件是一个代理插件,可以处理从 JavaScript 客户端到 gRPC Service 的 gRPC Web 请求。

proxy-rewriteproxy-rewrite 是处理上游代理信息重写的插件,支持对 schemeurihost 等信息进行重写。

zipkin.lua

config.lua

api_router.lua

exporter.lua

# docker compose

version: '3.8'
services:
  etcd:
    image: etcd:v3.5.5
    container_name: etcd
    networks:
      - nwpuapi-network
    ports:
      - "2379:2379"
    command: >
      etcd 
      --advertise-client-urls=http://etcd:2379 
      --listen-client-urls=http://0.0.0.0:2379
    restart: always
  nwpuapi:
    image: nwpuapi:3.0.3
    container_name: nwpuapi
    networks:
      - nwpuapi-network
    ports:
      - "9080:9080"
      - "9443:9443"
      - "9180:9180"
      - "9091:9091"
    volumes:
      - /home/wlp/apisixFile/config.yaml:/usr/local/apisix/conf/config.yaml
    restart: always
    depends_on:
      - etcd
  nwpuapi-dashboard:
    image: nwpuapi-dashboard:5.0.0
    container_name: nwpuapi-dashboard
    networks:
      - nwpuapi-network
    ports:
      - "9000:9000"
    volumes:
      - /home/wlp/apisixFile/conf/conf.yaml:/tmp/build/output/nwpuapi/dashboard/usr/local/nwpuapi/dashboard/conf/conf.yaml
    restart: always
    depends_on:
      - etcd
  zipkin:
    image: openzipkin/zipkin
    container_name: zipkin
    networks:
      - nwpuapi-network
    ports:
      - "9411:9411"
    restart: always
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    networks:
      - nwpuapi-network
    ports:
      - "9092:9090"
    volumes:
      - /home/wlp/apisixFile/prometheus.yml:/etc/prometheus/prometheus.yml
    restart: always
  grafana:
    image: grafana/grafana
    container_name: grafana
    networks:
      - nwpuapi-network
    ports:
      - "3000:3000"
    volumes:
      - /home/wlp/apisixFile/grafana.ini:/etc/grafana/grafana.ini
    restart: always
networks:
  nwpuapi-network:
    driver: bridge

curl http://10.60.32.253:9180/nwpuapi/admin/protos/1 -X PUT -d '
{
"content" : "'"$(base64 -w0 /proto.pb)"'"
}'

docker buildx build \
  --platform linux/arm64 \
  --build-arg HTTP_PROXY=http://172.17.0.1:7890 \
  --build-arg HTTPS_PROXY=http://172.17.0.1:7890 \
  -t nwpuapi-arm:latest \
  --load .
  
docker buildx build --platform linux/arm64 \
  --build-arg HTTP_PROXY=http://172.17.0.1:7890 \
  --build-arg HTTPS_PROXY=http://172.17.0.1:7890 \
  -t nwpuapi-arm:arm64 \
  --load \
  --cache-from type=local,src=/tmp/buildx-cache \  
  --cache-to type=local,dest=/tmp/buildx-cache .
  
docker buildx build --platform linux/arm64 -t nwpuapi-arm:arm64 --load .

COPY /usr/bin/qemu-aarch64-static /usr/bin
RUN [ "cross-build-start" ]

export http_proxy="http://192.168.1.101:7890"
export https_proxy="http://192.168.1.101:7890"
export ALL_PROXY="socks5://192.168.1.101:7890"
export no_proxy="localhost,127.0.0.1"

# 测试服务:

docker run -d --name koa-v -p 3006:3006 koa-v-arm64:latest



docker run -d --name springtest -p 10012:10012 -v D:\Idea\nacos\nacos-spring-boot-project\nacos-spring-boot-samples\nacos-discovery-sample/application.properties:/app/config/application.properties -e SPRING_CONFIG_LOCATION=file:/app/config/application.properties spring-service-arm64:1.0.0


docker run -d --name springtest -p 10012:10012 -v D:/Idea/nacos/nacos-spring-boot-project/nacos-spring-boot-samples/nacos-discovery-sample/application.properties:/app/application.properties spring-service-arm64:1.0.0
更新于 阅读次数