打造最小化docker容器镜像

 本文章主要记录博主近几年的使用, 去除知识冗余 以最简单直接方式是记录如何打造最小化 docker 容器镜像以 提高构建速度 以及 容器优化 ,本次实验我们使用典型的 PHP镜像 为实验目标其他类型类似可以参考。概述 打造最小化docker容器镜像的几个步骤尽可能选择 alpine tag 类型镜像减少构建层数清理无用缓存数据分阶段构建alpine 镜像 如果是为了保持镜像最小化建议使用 alpine 镜像 本身 alpine 系统大小只有 5M 所有基于 alpine 系统构建的镜像要比基于其他系统镜像要小的多### 一、核心差异对比维度AlpineUbuntu/DebianCentOS镜像体积≈5 MBUbuntu: ≈72-188 MB Debian: ≈47-125 MB≈200-230 MB包管理器apk(轻量高效)apt(功能全面)yum(企业级支持)C库musl libc(轻量)glibc(兼容性强)glibc安全性默认最小化安装,攻击面小依赖较多,需手动精简企业级安全策略启动速度极快(资源消耗低)中等较慢减少构建层数在构建 dockerfile 是我们尽可能...

PHP,Golang,前端,.Net,数据库,Linux,解决方案,其他 2025-07-08 AM 80次 0条

阿里巴巴 MySQL binlog 增量订阅&消费组件支持多语言客户端

 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x工作原理MySQL主备复制原理MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)MySQL...

PHP,软件工具,Golang,.Net,数据库,解决方案 2024-04-29 AM 1040次 0条

项目性能优化的指标,目标

性能优化的终极目标是什么性能优化的目标实际上是为了更好的用户体验一般我们认为用户体验是下面的公式:用户体验 = 产品设计(非技术)+ 系统性能 ≈ 系统性能 = 快那什么样的体验叫快呢?3秒定理 一般我们认为网站页面的加载速度在3秒以内就可以称作合格了,加载速度越趋近于0,越快。 3秒定理:Strangeloop在对比了众多网站,并对其性能进行分析之后得出了一个著名的3秒定理,当网站页面加载速度超过3秒后,57%的访客会离开这个网站。  如果想让我们的系统快起来,就要做性能调优。项目性能优化以下可以做为优化的标准:前端工程师:首屏时间、白屏时间、可交互时间、完全加载时间;移动端工程师:端到端响应时间、Crash率、内存使用率、FPS;后端工程师:RT、TPS、并发数。影响因素1:数据库读写、RPC、网络IO、逻辑计算复杂度、缓存影响因素2:JVM[Throughput吞吐量、Footprint访存足迹、Latency延迟]影响性能的关键要素产品设计:产品逻辑、功能交互、动态效果、页面元素基础网络:网络=连接介质+计算终端代码质量&架构移动端环境:设备类型&性能、网络...

PHP,Golang,前端,.Net,解决方案,其他 2024-03-12 PM 1156次 0条

计数限流算法

 计数器算法实现起来比较简单,它的基本思路是:在单位时间内(如 1 秒钟)对访问次数进行计数,如果超过设定的阈值,则拒绝后续的请求。以下是一个使用 PHP 实现的计数器算法。完整代码class Counter { protected $maxCount = 100; // 设定最大请求数 protected $interval = 60; // 设定时间窗口大小,单位为秒 protected $redis = null; // Redis 连接 public function __construct($maxCount, $interval) { $this->maxCount = $maxCount; $this->interval = $interval; // 建立 Redis 连接 $this->redis = new Redis(); $this->redis->connect('127.0.0.1', 6379); } publi...

PHP,Golang,.Net,解决方案,其他 2023-03-21 PM 1358次 0条

令牌桶限流算法

 下面我们通过使用redis实现一个简单通用的令牌桶限流算法解决问题 令牌桶算法主要是以桶的容量为基准,以固定的时间来生产令牌,有效的解决了漏桶效率不高的问题具体实现创建redis对象并定义缓存键$redis = $this->connect(); $key = "aaaaa";开启 watch 并定义定义每分钟最大请求数量$current_time = time(); $max_count = 320; $total_s = 60; $redis->watch($key);计算平均值用于限制每秒请求数量$rate = (int)(($max_count / $total_s) * ($current_time - ¥result_array["time"]));取出最大容量与桶内容量最小值$num = min($max_count, ($result_array["num"] + $rate));判断令牌数/* 令牌小于0 */ if ($num <= 0) { return false; }重新保存令牌$result = json_encode(["num" =>...

PHP,Golang,.Net,解决方案,其他 2023-03-21 AM 1286次 0条

实现滑动窗口限流算法

 下面我们通过php使用redis实现一个简单通用的滑动窗口限流算法解决问题 滑动窗口算法主要解决了传统计数限流算法的阶段突发性流量问题。具体实现创建redis对象并定义缓存键$redis = new \Redis(); $redis->connect("127.0.0.1"); $key = "aaaaa";定义每分钟最大请求数量$max_count = 320; $total_s = 60; $current_time = time();计算平均值用于限制每秒请求数量$avg_count = ceil($max_count / $total_s);限制每秒请求数量$range_count = $redis->zRangeByScore($key, $current_time, $current_time); if (count($range_count) > $avg_count) { exit('请求太过频繁,请稍后 -1'); }限制每分钟请求数量$redis->zRemRangeByScore($key, 0, $current_time - 59); $c...

PHP,Golang,前端,.Net,解决方案,其他 2023-03-17 PM 1297次 0条

c#使用Newtonsoft.Json包处理解析json字符串

 使用 c# 开发程序中我们没可以直接使用的 json解析类库 这个时候我们可以通过 NuGet 安装使用 Newtonsoft.Json 类库来对 json 进行解析处理。安装 Newtonsoft.Json 我们可以通过 ide 菜单 工具->NuGet包管理 里面下载引入。引用 Newtonsoft.Json 在使用到的类文件里面引入 Newtonsoft.Jsonusing Newtonsoft.Json; using Newtonsoft.Json.Linq; 使用 Newtonsoft.Jsonstring json = "{}"; dynamic result = JObject.Parse(json); Console.WriteLine(result.xxx);这个时候如果报 Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create 这个错误稳住不要急,下面就是解决方案。在项目中引入Microsoft.Csharp即可解决。 我们可以直接使用解析后的json字符串调用对象使用。 关于 c# 使用 ...

.Net 2021-11-26 AM 1822次 0条

c#接口绑定控件数据源

 我们以 ComboBox控件 为例 来测试使用通过绑定 控件数据源 来对接 接口数据源 进行数据输出使用展示。绑定接口输出为数据源假设我们通过接口获取到一下json数据对象[ { "id":1, "name":"李元芳" }, { "id":2, "name":"莉莉2" }, { "id":3, "name":"赵先生" } ]把 数据对象 绑定到 DataSource 上 myDataTable 为json对象comboBox.DataSource = myDataTable;最后我们设置一下对应数据字段即可//这个DataTable是你从数据库拿出来的包括ID和值 或者是json解析后的 comboBox.ValueMember = "ID";//这对应你的字段名 comboBox.DisplayMember = "Name";//对应你的字段名用户选择后,你可以通过这个语句,拿到ID的值 string myID=com...

.Net 2021-10-18 PM 1344次 0条

c#使用委托跨线程调用控件及方法

 下面通过使用 EventHandler 和 MethodInvoker 两种方式实现c#多线程或者线程池在子线程中调用其他窗体的控件两种委托方式。MethodInvoker 委托方式 MethodInvoker 表示一个委托,该委托可以执行托管代码中声明为 void 且 不接受任何参数 的任何方法。 在对控件的 invoke 方法进行调用时或需要一个 简单委托 又不想自己定义时可以使用该委托。MethodInvoker 委托方式使用示例MethodInvoker methodInvoker; methodInvoker=new MethodInvoker(自定义方法()) Views.Purcuase.Bill.bill.BeginInvoke(methodInvoker) //要委托给哪个窗体 EventHandler 委托方式 EventHandler 和 MethodInvoker 差不多最直观的不同就是 EventHandler 可以 传递参数 在 子线程 中直接使用。EventHandler 委托方式使用示例 // 可以直接在线程方法中使用 Views.Purcu...

.Net 2021-10-18 PM 1285次 0条

c#实现自定义控件属性

 我们在创建使用 自定义winform用户控件 的时候往往程序默认属性是 不满足我们的需求 的,这个时候就需要我们自定义我们需要的控件属性来满足业务需求也就是 自定义控件属性 ,下面将实现c#实现 自定义控件属性 方法。首先添加自定义控件 按照以下步骤创建测试 自定义用户控件 以便测试 自定义控件属性 使用。右键点击项目选择用户控件点击用户控件添加用户控件然后跳转到自定义控件代码部分 创建完 自定义用户控件 后我们可以跳转到控件代码部分。可以通过在窗体上选择控件右键查看代码也可以通过使用快捷键 F7 查看代码添加自定义用户控件属性 添加自定义用户控件属性可以通过一下两种方式去实现。通过自定义类属性来添加自定义用户控件属性通过代码定义自定义代码方法去实现。通过自定义类属性来添加自定义用户控件属性 很简单 如下图所示 我们可以像平时 定义类属性 一样去定义自定义用户控件属性,ide会 自动识别 我们定义的属性。 下面我们测试 自定义用户控件text属性。private string text; public string Text{get=>text,set=>text=value;...

.Net 2021-10-14 PM 1380次 0条