优雅的多阶段构建微服务镜像

借助Maven Wrapper 首先我们说说maven wrapper的使用场景 假设我们所在的团队同时维护多个项目,不同的项目使用的JDK版本不同,使用的maven版本也不同,那么为了支持多项目开发,为了构建运行效果一致,你可能需要在本地管理多个maven版本,这会非常繁琐,从而引出了maven wrapper来解决这个maven版本的管理问题。 版本一致性:通过在mvnw配置中指定 Maven 版本,确保所有开发人员和持续集成环境使用相同的maven版本。 简化批量安装:不需要预先安装maven,直接运行mvnw命令就如安装了mvn一样,从而简化了项目的初始设置和配置。 Maven Wrapper安装方式 maven-wrapper: 提供maven-wrapper.jar下载、安装和运行目标maven发行版。 maven-wrapper-distribution: 提供mvnw/mvnw.cmd脚本发行版, maven-wrapper-plugin: wrapper用于轻松将 Wrapper 安装到项目中的插件。 首先安装maven wrapper,默认情况下安装的是only-script版本,也就是精简版,不需要额外的maven-wrapper.jar。如果你需要安装source版本请使用-Dtype=source参数。 # 假设你的本地已经有了一个特定版本的maven,可以直接通过如下命令进行引入 mvn -N wrapper:wrapper # 当然也可以指定引入的maven版本信息 mvn -N wrapper:wrapper -Dmaven=3.6.1 检查是否安装成功,正常来讲是会出现一个mvnw和mvnw.cmd以及.mvn目录 [root@localhost maven-wrapper]# tree -fa . ├── ./.mvn │ └── ./.mvn/wrapper │ └── ./.mvn/wrapper/maven-wrapper.properties ├── ./mvnw └── ./mvnw.cmd 2 directories, 3 files 修改maven-wrapper.properties定义的路径地址,因为用的是官方地址可能由于墙的问题无法进行下载,我这边采用MinioS3的地址来提前下好相关版本的maven包进行上传。 wrapperVersion=3.3.1 distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip # 正常修改distributionUrl的地址就可以了 distributionUrl=http://10.1.6.15:10240/software/apache-maven-3.6.1-bin.zip 正常能检测到相关的版本即表示成功 [root@localhost maven-wrapper]# ./mvnw --version Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00) Maven home: /root/.m2/wrapper/dists/apache-maven-3.6.1/5256b4e Java version: 1.8.0_391, vendor: Oracle Corporation, runtime: /usr/local/java/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix" 遇到小问题 如果大家在构建的过程中遇到了小问题可以看看小思路 ...

五月 8, 2024 · 3 分钟 · iren.

旅行日记-目的地-东莞

哎,本来30号就可以到广州的,因为广州的天气所以30号基本上所有到广州的飞机都取消了。真是没办法的,最近广州的雷雨天气太多了,也能理解吧。 索性我就直接改签到了5月1号早上最早的一班飞机飞广州了。 来看看日出的北京国际大兴机场,被誉为“新世界七大奇迹”之首。 日出真的太美咯。 <!doctype html> 大兴国际机场 ...

五月 1, 2024 · 1 分钟 · iren.

基于SealOS部署高可用的kubernetes集群

配套Bilibili视频已经更新:点我观看 准备SealOS 机器信息如下: 服务器名称 IP Role ready-kubernetes-master1 10.1.11.100 Control-Plane ready-kubernetes-master2 10.1.11.101 Control-Plane ready-kubernetes-master3 10.1.11.102 Control-Plane ready-kubernetes-node1 10.1.11.103 Node ready-kubernetes-node2 10.1.11.104 Node ready-kubernetes-node3 10.1.11.105 Node 通过SealOS部署的前提条件 SealOS For Kubernetes 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s 集群的第一个 master 节点上运行 sealos run 命令,目前集群外的节点不支持集群安装。 建议使用干净的操作系统来创建集群。不要自己装 Docker! 支持大多数 Linux 发行版,例如:Ubuntu、CentOS、Rocky linux。 支持 Docker Hub 中的所有 Kubernetes 版本。 支持使用 Containerd 作为容器运行时。 在公有云上安装请使用私有 IP。 获取当前稳定版本的SealOS列表 # 获取非beta版本 curl --silent "https://api.github.com/repos/labring/sealos/releases" | jq -r 'map(select(.tag_name | test("beta"; "i") | not)) | .[].tag_name' 下载最新稳定版本的SealOS,版本号为v4.3.7 # 在一台主机上执行就行了 VERSION=v4.3.7 wget https://mirror.ghproxy.com/https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz \ && tar zxvf sealos_${VERSION#v}_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin 验证SealOS是否安装完成 [root@localhost ~]# sealos version SealosVersion: buildDate: "2023-10-30T16:19:05Z" compiler: gc gitCommit: f39b2339 gitVersion: 4.3.7 goVersion: go1.20.10 platform: linux/amd64 正常能显示出来版本号信息就表示安装正常。 ...

四月 15, 2024 · 2 分钟 · iren.

日记-又开始怀念夏天

那一年,午后的阳光总是那么炽热,仿佛能将一切都融化。课间的操场上,同学们的欢声笑语此起彼伏,汗水在他们的额头上闪耀着光芒。我们在这里挥洒着青春,每一次奔跑都是对生活的热爱和对未来的追逐。 放学后的路上,几个好朋友们一边走一边讨论着今天学到的新知识。我们的谈话中充满了好奇和探索,每一步都踏在充满希望的道路上。夏天的风,带着甜甜的花香,也带着哥几个对彼此的鼓励和笑声。 这让我觉得青春是一首永不褪色的歌,而夏天,正是这首歌最美的高潮。在这个季节里,我将用我的笔,记录下每一刻的感动,用心去感受生活的每一分热度。这是我曾经学生时代,是我的青春篇章。 是的,时间的车轮总是单向前行,带走了我们生命中的许多日子,留下了回忆和成长的痕迹。上学的的夏天,那些无忧无虑的日子,仿佛是一段美好的旅程,虽然无法再次经历,但它们在我心中留下了深刻的印记。 摄影 希望这个夏天可以给我带来更加美好的回忆吧 <!doctype html> 需要原图联系: beilanzhisen@163.com ...

三月 17, 2024 · 1 分钟 · iren.

新春的序章

新的一年 时间过得真快啊,一转眼就是2024年了,窗外的鞭炮声断断续续的传来,似乎在诉说着新春来临的喜悦。 我想这也是"年"带给人们最朴素和最深刻的记忆吧。 我不由自主地回忆起童年欢度春节的情景。虽然人们常说现在的年味渐淡,变得简约而平淡,但仔细深思,其实变的不是年味,而是我们——从孩童成长为成人的我们。 为什么我们会如此怀念儿时的年味?那是因为那时的年是家的团聚,是亲戚间热闹非凡的聚会;是母亲在厨房里忙碌的身影,烹饪出色香俱佳的年夜饭;是父亲和叔叔们门前贴春联、悬挂红灯笼的热闹景象;是我们穿着崭新的衣服,心怀期待地迎接新年;是街头小伙伴点燃的"黑蜘蛛炮",以及深夜空中绚丽夺目的烟花秀。 如今,尽管我们每个人或许都沉浸在各自生活的喧嚣中,春节的传统习俗可能也随着时间悄然发生了变化,但那份对美好事物的追求和渴望永远不会消失。我们仍然会在春节期间寻找那份年味,那份属于家的温暖和喜悦。 在这个新春之际,我想我们都可以找到属于自己的庆祝方式,无论是与家人围坐一起,还是与朋友欢聚一堂,抑或是独自品味一本好书、听一曲悠扬的音乐。每一个细微的瞬间都是我们生命中的一部分,值得我们去珍惜和纪念。 这一路遇上了很多风景我很喜欢下面看看照片咯 这是在姨姥家门口的村头日落,就拍了两张没多拍哈哈哈 <!doctype html> 当然了,还有两只超级可爱的咩咩羊,不知道小羊羔子现在是不是被宰了…… ...

二月 13, 2024 · 1 分钟 · iren.

管理好内部的代码仓库-GitLab篇

今天聊聊如何来管理我们的代码仓库 在软件开发过程中,代码仓库是一个非常重要的组成部分。它不仅是存储代码的地方,也是团队协作和版本控制的基础。因此,管理好自己的代码仓库至关重要。 本文将介绍如何使用Git来管理自己的代码仓库。 部署GitLab 相较于传动的部署方式比较繁琐,我这里直接采用docker的部署方式来部署gitlab以方便后续管理。 说一下使用Docker来部署的一些痛点: 数据备份:在Docker中运行Gitlab,需要定期备份数据以防止数据丢失。但是备份数据的过程可能会很麻烦,并且需要设置合适的策略来避免数据丢失。所以这是我觉得不管是GitLab还是其他的应用,保证数据的完整可靠性是至关重要的。 版本更新:Docker部署Gitlab需要时刻关注版本更新,需要进行升级或者迁移,主要是数据迁移的数据保障工作需要额外注意。 好了我们带着上面的两点问题,我们先来使用docker部署GitLab然后再慢慢探索。 DockerCompose 我们使用docker-compose来部署gitlab仓库程序,注意镜像版本。如果你是尊贵的ee用户请修改镜像。如果你是普通的ce用户直接复制就行。 version: '3.6' services: web: image: 'gitlab/gitlab-ce:latest' restart: always # 指定gitlab主机名称 hostname: 'gitlab.example.com' environment: GITLAB_OMNIBUS_CONFIG: | # gitlab访问地址 external_url 'http://10.1.6.100' ports: - '80:80' - '443:443' - '2212:22' # 防止与本地的22端口进行冲突 volumes: - '/data/gitlab-app/config:/etc/gitlab' - '/data/gitlab-app/logs:/var/log/gitlab' - '/data/gitlab-app/data:/var/opt/gitlab' shm_size: '256m' 启动gitlab程序 [root@localhost gitlab-app]# docker-compose up -d [+] Running 1/1 ✔ Container gitlab-app-web-1 Started 部署完成后的一些相关设置可以参考官方文档 实际上到此为止,我们的一个代码仓库就已经创建完成了,剩下的工作就是在UI界面点点点。我就不多赘述了主要讲讲如何备份的问题。 ...

一月 16, 2024 · 2 分钟 · iren.

kubernetes基于EFK的日志落地实现

Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。 Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。 Elasticsearch 通常与 Kibana 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 允许你通过 web 界面来浏览Elasticsearch 日志数据。 Fluentd是一个流行的开源数据收集器,我们将在 Kubernetes 集群节点上安装 Fluentd,通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。 我们先来配置启动一个可扩展的 Elasticsearch 集群,然后在 Kubernetes 集群中创建一个 Kibana 应用,最后通过 DaemonSet 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 安装 Elasticsearch 集群 先创建一个命名空间,我们将在其中安装所有日志相关的资源对象。 kubectl create ns kube-logging 环境准备 ElasticSearch 安装有最低安装要求,如果安装后 Pod 无法正常启动,请检查是否符合最低要求的配置,要求如下: 节点 CPU最低要求 内存最低要求 elasticsearch-master 核心数>2 内存>2G elasticsearch-data 核心数>1 内存>2G elasticsearch-client 核心数>1 内存>2G 集群节点信息 集群 节点类型 副本数目 存储大小 网络模式 描述 elasticsearch master 3 5Gi ClusterIP 主节点 elasticsearch-data data 3 50Gi ClusterIP 数据节点 elasticsearch-client client 2 无 NodePort 负责处理用户请求 建议使用 StorageClass 来做持久化存储,当然如果你是线上环境建议使用 Local PV 或者 Ceph RBD 之类的存储来持久化 Elasticsearch 的数据。 ...

十二月 8, 2023 · 8 分钟 · iren.

旅行日记-四川·阿坝甘孜藏族自治州

人生总要去一趟远方吧 下一站行程 暂定西藏🚄 实在是不想上班,我承认我被我强大的意念占领了,我没忍住。请假直接从北京去了阿坝甘孜。 好了不开玩笑了哈哈哈 起初我们打算自驾,奈何我是个小趴菜,先不说阿坝那边的路况好不好走,就平时开个市区我都费劲,所以这条直接被我PASS了。 所以选择了最最最方便的飞机✈️出行,您还别说这交通工具有两把刷子(不好意思,我真是第一次坐飞机),其实坐飞机大家想得那么复杂 基本流程其实就如下几点 买票: 不买票想吃霸王机🤪 取票:如果你需要报销什么的其实可以去对应的航空公司柜台去取登机牌,如果个人出行的话可以直接使用电子登机牌进行相关的登机操作 安检: 取完票之后就差不多要安检了,基本上安检也就是十分钟左右的事情,安检完成就正常进入候机楼找你飞机所对应的登机窗口就👌🏻 出发 一大早的我都来机场等着了,因为第一次看网上说要提前2小时到机场,我到了以后发现其实好像也并没有那么夸张 说说我这次准备的东西吧 衣服方面衣🧣: 个人建议还是羽绒服+冲锋衣起步,带好围脖、围巾、手套、雪地靴等物品,因为那边其实还是很冷的,因为我在雪山上。 物品方面:我是个男孩子其实没有女生带的那么多物品,基本的换洗袜子一件外衣和一件裤子足够,然后就是准备摄影的东西,带着我年迈的SONY A6000和它的两个可拆卸镜头哈哈哈,氧气瓶务必准备充足,个人玩家一般情况下来说3瓶子足矣。团队玩家建议团购(保命的东西啊)。 药物方面:相关方面的药物尽量还是要带上的比如什么肠胃药、感冒药、咳嗽发烧药等等。有人说去高海拔地区要提前吃什么红景天之类的东西,只能说这个东西是因人而异的吧。 证件信息:身份证、护照、还有手机啥的这些东西老铁们应该忘不了吧。 我们买的是早上7.15的机票,大概提前一个半小时就到了机场,其实相对于来说还是挺早的,哎呀不说啦激动地我是一页都没睡。 我的行程大概就是在淘宝订了一个小团,价格是1340,行程是两天。大概的路线就是毕棚沟+达古冰川。 具体行程下面介绍哈哈哈 <!doctype html> 上飞机了 登机了,耳机里直接走起经济舱的BGM:46A我靠窗边坐下,rapper坐在经济舱面子伤不伤!!! <!doctype html> 靠窗坐 ...

十一月 23, 2023 · 1 分钟 · iren.

Kubernetes的架构设计和对象属性基本理解

为什么需要kubernetes? 大规模多节点容器调度 快速扩缩容 故障自愈 弹性伸缩 技术趋势 一致性、不锁定 早期型多的一些服务都属于单体服务、单节点、单进程的一种单体服务架构,后续随着技术的发展衍生出了容器技术。容器技术其实也不能满足我们的多节点、分布式的应用架构体系,从而衍生出了kubernetes容器编排引擎。 那么我们来看一下早期单体容器架构 其实对于容器化技术带来了那些优势呢? 其实我觉得容器化带来的最大的优势就是交付和部署的优势 <!doctype html> 容器单点架构流程图 那么随之而来带来的问题是: ...

十一月 7, 2023 · 3 分钟 · iren.

推荐几款好用的API文档管理工具

互联网服务发展至今,作为开发者阵营的我们,已经用实践证明了前后端分离开发模式正在逐渐成为越来越多互联网公司构建服务和应用的方式。 前后端分离优势多多,其中一个很重要的优势是:对于后台服务(系统)来讲,只需提供一套统一的API接口,可被多个客户端所复用,分工和协作被细化,大大提高了效率。 与此同时带来的一些副作用便是: 接口文档管理混乱。之前很多公司管理API接口,有用Wiki的,有Word文档的,有Html的,经常遇到问题是接口因变了,比如增加参数,参数名变了,参数被删除了等都没有及时更新文档的情况 接口测试没有保障。毕竟前端开发依赖后端接口,如果前后端开发不同步,接口及时测试成了问题,因此需要随时提供一套可用的API接口数据测试服务。 资源分散,难以共享。每个开发者维护自己的一套测试接口集合,无法共用他人接口集合,开发过程中充斥着大量重复造数据、填接口的工作,效率不高 其他问题。除此之外还有可能碰到诸如 文档导出、接口分类规划、操作便利性等一系列问题。 基于此情况,因此本文接下来就来推荐几个常用的 API管理系统,帮助前后端分离开发模式下提升效率和可靠性,我想总有一个适合阁下吧☁️ Swagger Swagger 是一种用于描述、构建和可视化 RESTful API 的开源工具集。它提供了一系列功能,包括 API 文档自动生成、API 调试和可视化等。下面是使用 Swagger 的一般步骤: 定义 API 规范:使用 Swagger 规范(通常是 OpenAPI 规范)编写 API 的定义和描述。这些规范使用 YAML 或 JSON 格式表示,并描述了 API 的路径、参数、操作、响应等信息。 编写 Swagger 文档:根据 API 的定义和描述编写 Swagger 文档。您可以使用 Swagger 编辑器或其他文档工具来创建和编辑 Swagger 文档。 自动生成文档:使用 Swagger 工具和插件,将 Swagger 文档与代码(如后端服务代码)集成在一起,并生成 API 文档。这些工具可以根据 Swagger 文档自动生成可交互式的 API 文档和UI界面。 调试和测试:使用 Swagger 提供的内置功能,可以在 Swagger UI 中直接进行 API 调试和测试。通过 Swagger UI,您可以轻松地发送请求,查看响应并检查请求和响应的详细信息。 ...

八月 10, 2023 · 1 分钟 · iren.