场景描述 我有两个 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使用 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 (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开源项目中我们大多采用主干开发模式管理我们的项目,他基本遵循以下规则 所有的 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 监控 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概述 为了保护 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有的时候我们那需要分析多模块 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从源镜像仓库批量拉取镜像,并将这些镜像推送到目标镜像仓库的批量脚本 #!/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
查看本机 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下载 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