APISIX Study Notes (2) Plugins Traffic Split

场景描述 我有两个 UPSTREAM 服务: UPSTREAM 1 $ curl -i -X GET http://192.168.51.234:5005/nc-tools/actuator/health HTTP/1.1 200 OK Connection: keep-alive Transfer-Encoding: chunked Content-Type: application/vnd.spring-boot.actuator.v3+json Date: Sat, 22 May 2021 09:09:29 GMT {"status":"UP","components":{...}} UPSTREAM 2 $ curl -i -X GET http://10.19.88.60:5005/nc-tools/actuator/health HTTP/1.1 200 OK Connection: keep-alive Transfer-Encoding: chunked Content-Type: application/vnd.spring-boot.actuator.v3+json Date: Sat, 22 May 2021 09:08:12 GMT {"status":"UP","components":{...}} 我希望通过 APISIX 将请求流量路由到两个不同的 UPSTREAM 服务上,参考插件 traffic-split 的样例,可以实现此功能 配置路由 & traffic-split 本例中并没有单独定义 UPSTREAM,而是在 traffic-split 中直接定义了 UPSTREAM 的地址

Read more

APISIX Study Notes (3) Install with Docker

使用 Docker 启动 定义卷目录 APISIX 目前好像还不支持通过环境变量配置参数,所以需要在宿主机上创建配置文件,并在启动 Docker 时通过 Volume 映射进容器 规划外部卷目录 mkdir apisix_home mkdir -p apisix_home/apisix_volume/apisix/apisix_conf mkdir -p apisix_home/apisix_volume/apisix/dashboard_conf 定义 APISIX Dashboard 配置文件 apisix_home/apisix_volume/apisix/dashboard_conf/conf.yaml conf: listen: # 绑定 IP 地址 host: 0.0.0.0 # 监听端口 port: 9000 etcd: # etcd 用户名 # username: "root" # etcd 密码 # password: "123456" # etcd 地址,支持集群多节点定义 endpoints: - apisix-etcd:2379 log: error_log: # 日志级别 debug, info, warn, error, panic, fatal level: warn # 日志输出路径 file_path: logs/error.

Read more

APISIX Study Notes (4) Plugins Proxy Rewrite

在 APISIX STUDY NOTES (2) PLUGINS TRAFFIC SPLIT 提到,我们可以通过这个插件实现上游服务的导流,但是这个插件只能通过自定义 URL参数 或者 REQUEST HEADER 的方式传递导流变量。如果我们想通过 URL PATH 的方式实现上游业务的到导流,可以使用 Proxy Rewrite 插件 场景描述 我有两个 UPSTREAM 服务: UPSTREAM 1 $ curl -i -X GET http://192.168.51.234:5005/nc-tools/actuator/health HTTP/1.1 200 OK Connection: keep-alive Transfer-Encoding: chunked Content-Type: application/vnd.spring-boot.actuator.v3+json Date: Sat, 22 May 2021 09:09:29 GMT {"status":"UP","components":{...}} UPSTREAM 2 $ curl -i -X GET http://10.19.88.60:5005/nc-tools/actuator/health HTTP/1.1 200 OK Connection: keep-alive Transfer-Encoding: chunked Content-Type: application/vnd.spring-boot.actuator.v3+json Date: Sat, 22 May 2021 09:08:12 GMT {"status":"UP","components":{.

Read more

Bash script automates the Maven project Git release process

开源项目中我们大多采用主干开发模式管理我们的项目,他基本遵循以下规则 所有的 PR 都默认向主干合并 主干上项目的版本号是 -SNAPSHOT 当主干要发布时,我们会建立与之对应的 X 分支(此分支的目的是为了基于此分支发布补丁版本) 基于当前主干去除版本号中的 -SNAPSHOT 后建立与版本对应的 TAG 将主干上的版本号中的 minor 累加一,并在后边增加 -SNAPSHOT 后缀 此过程繁琐,切容易出错。我制作了一个脚本 maven-project-git-release.sh 用来实现这个过程的规范化和自动化 当然,这并不意味着你不需要掌握正手动发布的过程。 由于某种原因导致自动过程中断后,你依然需要手动去处理,所以在使用这个脚本前,请确保你了解这个脚本帮你做了什么工作,以及如何做的。 如何使用 maven-project-git-release.sh 脚本会帮你自动化以下工作 创建一个编译用的目录 目录会创建在你系统的临时目录下,在我的 Mac 系统系统中看起来像 /var/folders/fd/gqdh88px2fj66tmtcy6ffr580000gn/T 在编译用的目录中 git clone 你的仓库代码 你的仓库地址在使用脚本时通过参数指定,像这样 sh maven-project-git-release.sh git@github.com:coolbeevip/license-maven-plugin.git 编译你的代码确保正确 默认在当前仓库根目录下执行 mvn clean package,如果你需要特殊的方式,可以修改脚本中的 check_source_before_release 函数 计算版本号分支名 根据 pom 中的版本定义,自动计算下一版本号,默认采 maven 的3段式版号方式 major.minor.patch,并以此为基准滚动 minor 版本号,如果你需要特殊的方式,可以修改脚本中的 next_version 函数 输出发布计划 发布计划中会显示你要发布的仓库地址,当前版本号、维护用 X 分支、TAG 名称、下一个版本号等信息 Release Plan: ==================================================================== OS: Darwin GIT_REPO_URL: git@github.com:coolbeevip/license-maven-plugin.git RELEASE WORK DIR: /var/folders/fd/gqdh88px2fj66tmtcy6ffr580000gn/T/release-license-maven-plugin.

Read more

JProfiler with Docker Sonatype Nexus3

使用 JProfiler 监控 Docker Sonatype Nexus3 下载 JProfiler 从 https://www.ej-technologies.com/下载 JProfiler 和 Agent(注意版本必须一致) JProfiler GUI https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_macos_12_0_2.dmg JProfiler Agent https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_12_0_2.sh 在服务器上安装 JProfiler Agent 将下载后的 jprofiler_linux_12_0_2.sh 传到服务器上,通过 sh jprofiler_linux_12_0_2.sh 命令按提示安装即可 默认安装路径为 /opt/jprofiler12/,这个路径在启动 Docker 的时候要映射到容器内部 启动 Docker Sonatype Nexus3 在官方 sonatype/nexus3 容器启动参数的基础上做如下修改 使用 -v /opt/jprofiler12:/opt/jprofiler12 将 jprofiler 路径映射到容器内部 增加 -agentpath:/opt/jprofiler12/bin/linux-x64/libjprofilerti.so=port=9899 JVM 参数,设置监听端口为 9899 增加 -p 9899:9899 容器端口映射 docker run -d \ -e NEXUS_CONTEXT=nexus \ -e INSTALL4J_ADD_VM_PARAMS="-Xms10g -Xmx10g \ -agentpath:/opt/jprofiler12/bin/linux-x64/libjprofilerti.so=port=9899 \ -XX:MaxDirectMemorySize=15530M \ -XX:ActiveProcessorCount=16 \ -XX:+UseParNewGC \ -XX:ParallelGCThreads=12 \ -XX:MaxTenuringThreshold=6 \ -XX:SurvivorRatio=5 \ -XX:+UseConcMarkSweepGC \ -XX:-CMSParallelRemarkEnabled \ -XX:CMSInitiatingOccupancyFraction=65 \ -XX:+UseCMSInitiatingOccupancyOnly \ -XX:+UseCMSCompactAtFullCollection \ -XX:+CMSClassUnloadingEnabled \ -XX:+DisableExplicitGC \ -XX:+PrintGCDetails \ -Xloggc:/nexus-data/vgc/nexus-$(date +%s).

Read more

Securing Docker ports with firewalld

概述 为了保护 Docker 暴露的端口不受外部访问的影响,可以使用 firewalld 配置防火墙规则,只允许特定的 IP 访问。 通过让 firewalld 创建 DOCKER-USER 链,我们可以实现由 firewalld 维护的安全 Docker 端口, Docker 处理 iptables 规则以提供网络隔离,更多详细 本文基于环境 Docker-CE 19.03.12 CentOS Linux release 7.8.2003 Firewall 0.6.3 本文例子: 我们使用 Docker 安装一个 Nginx,并将 80(HTTP) 端口对外映射为 8080,443(HTTPS) 端口对外映射为 8443,并通过 Firewalld 仅允许特定的 IP 访问;提示:后续的防火墙规则中配置的端口是容器内部端口,例如 80,443 192.168.51.246 安装 Nginx Docker 配置 192.168.51.245 可以访问 Nginx Docker 其他机器无法访问 Nginx Docker 重要的事情说三遍 如果你在 Docker 运行时重启 firewalld,那么 firewalld 将删除 DOCKER-USER 不要在 Docker 运行时重启 firewalld 不要在 Docker 运行时重启 firewalld

Read more

Use Maven plugin to export license info in source files and its optional dependencies

有的时候我们那需要分析多模块 Maven 项目的依赖使用情况,并希望能够分析出这些依赖的 LICENSE 信息。使用 io.github.coolbeevip:license-maven-plugin 插件 可以生成 TXT 或者 CSV 格式的分析报告 youtube bilibili CSV 格式的报告 NOTICE.CSV NOTICE-LICENSE.CSV TXT 格式的报告 NOTICE.TXT NOTICE-LICENSE.TXT 插件 LICENSE-MAVEN-PLUGIN format 导出格式,支持 csv、txt; license 是否分析 LICENSE 信息,默认 false; ignoreGroupIds 忽略 groupId 列表, 多个用逗号分割; timeout 分析 LICENSE 的超时时间,默认 5 秒; 导出报告 在 Maven 项目的根目录执行如下命令 导出 CSV mvn io.github.coolbeevip:license-maven-plugin:1.5.0:dependency-license-export -Dformat=csv 导出 TXT mvn io.github.coolbeevip:license-maven-plugin:1.5.0:dependency-license-export -Dformat=txt 提示: 导出的报告位置在 ./target/distribute 目录下 导出报告(忽略部分依赖) mvn io.github.coolbeevip:license-maven-plugin:1.5.0:dependency-license-export -Dformat=csv -DignoreGroupIds=org.apache.servicecomb,com.github.seanyinx 导出报告(分析LICENSE) 此功能使用 selenium 从 Maven Central Repository 分析依赖的 License 信息

Read more

Synchronize between image repositories with Bash

从源镜像仓库批量拉取镜像,并将这些镜像推送到目标镜像仓库的批量脚本 #!/bin/bash ################################################# # 使用方式 # 从源仓库拉取镜像到本机 # sh docker-images-pulling-pushing.sh pull # # 将本机镜像推送到目的仓库 # sh docker-images-pulling-pushing.sh push # # 清理本机的镜像 # sh docker-images-pulling-pushing.sh clean ################################################# # 源仓库地址 DOCKER_REPO_FROM= # 目标仓库地址 DOCKER_REPO_TO=192.168.2.2:8888/ DOCKER_REPO_TO_USER=test DOCKER_REPO_TO_PASS=Test123456 # 镜像定义 DOCKER_IMAGES=() DOCKER_IMAGES+=(postgres:9.6) DOCKER_IMAGES+=(elasticsearch:6.6.2) DOCKER_IMAGES+=(coolbeevip/servicecomb-pack) # 从源仓库地址拉取镜像到本机仓库 function pull(){ echo "Pull images from $DOCKER_REPO_FROM" for image in ${DOCKER_IMAGES[@]}; do docker pull $DOCKER_REPO_FROM$image done } # 本机镜像推送到目的仓库 function push(){ docker login http://$DOCKER_REPO_TO -u $DOCKER_REPO_TO_USER -p $DOCKER_REPO_TO_PASS echo "Push $DOCKER_REPO_FROM to $DOCKER_REPO_TO" for image in ${DOCKER_IMAGES[@]}; do docker image tag $DOCKER_REPO_FROM$image $DOCKER_REPO_TO$image docker push $DOCKER_REPO_TO$image done } # 清理本机拉取后的镜像 function clean(){ echo "Remove images" docker rmi -f $(docker images | grep $DOCKER_REPO_FROM | awk '{print $3}') docker rmi -f $(docker images | grep $DOCKER_REPO_TO | awk '{print $3}') } case "${@: -1}" in pull ) pull ;; clean ) clean ;; push ) push ;; esac

MacOS Switch JDK

查看本机 JDK 版本 命令行输入 /usr/libexec/java_home -V 可以看到多个 JDK 版本 $ /usr/libexec/java_home -V Matching Java Virtual Machines (2): 11.0.10, x86_64: "OpenJDK 11.0.10" /Users/zhanglei/Library/Java/JavaVirtualMachines/adopt-openj9-11.0.10/Contents/Home 1.8.0_201, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home /Users/zhanglei/Library/Java/JavaVirtualMachines/adopt-openj9-11.0.10/Contents/Home 查看当前使用的 JDK 版本 $ java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode) 切换 JDK 切换到 JDK 11.0.10 版本,并查看切换后的 JDK 版本 $ export JAVA_HOME=`/usr/libexec/java_home -v 11.0.10` $ java -version openjdk version "11.

Read more

Oracle Proxy Using HAProxy Docker

下载 HAProxy Docker docker pull haproxy:2.3 创建工作目录 mkdir -p /opt/haproxy-oracle/docker_volume 在 /opt/haproxy-oracle/docker_volume 目录下创建如下 haproxy.cfg 文件,请将文件尾部的 oracle 地址和端口改为你的地址和端口 global daemon log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 tune.ssl.default-dh-param 2048 defaults log global retries 3 maxconn 2000 timeout connect 5s timeout client 50s timeout server 50s listen stats bind *:9090 balance mode http stats enable stats auth admin:admin stats uri /stats listen oracle-proxy log global bind :1521 mode tcp balance roundrobin server oracle-1 10.

Read more