首页 文章 精选 留言 我的

精选列表

搜索[企业级],共10000篇文章
优秀的个人博客,低调大师

基于 CoreDNS 和 K8s 构建云原生场景下的企业级 DNS

容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中。在容器化进程中,如何保持业务的平稳迁移,如何将现有的一些服务设施一并进行容器化迁移,也是众多企业较为关注的点。 以 DNS 为例,如何构建一个云原生的企业 DNS 系统? CoreDNS 简介 CoreDNS 是一个 Go 语言编写的灵活可扩展的 DNS 服务器,在 Kubernetes 中,作为一个服务发现的配置中心,在 Kubernetes 中创建的 Service 和 Pod 都会在其中自动生成相应的 DNS 记录。Kubernetes 服务发现的特性,使 CoreDNS 很适合作为企业云原生环境的 DNS 服务器,保障企业容器化和非容器化业务服务的稳定运行。 构建企业 DNS 服务器时,一般会有以下需求: 用户外网域名访问服务; 混合云业务迁移、数据共享、容灾; 开发代码 IP 写死导致架构可用性、弹性无法实现; 统一 DNS 管理需求,含上下级平台对接; DNS 劫持等网络安全风险; 存量代码固定域名访问; 集群外域名访问; 相比于 Bind 开源方案或 Windows Server DNS 商业 DNS 服务器,CoreDNS 有以下优势: 无商业许可要求,降低投资成本; 轻量化,通过插件实现功能添加; 支持 DNS,DNS over TLS,DNS over HTTP/2,DNS over gRPC 协议; 提供 kubernetes 服务发现; 支持对接 Route53/Google Cloud DNS/AzureDNS; 支持集成 Prometheus, OpenTracing,OPA,带来更全面的运维体验; 支持整合容器管理平台,提供统一 DNS 系统运维。 构建企业云原生 DNS 前,对 CoreDNS 做一个更深入的了解。 CoreDNS 运行原理与插件介绍 CoreDNS 基于 Caddy 框架实现模块化设计,每个插件承载相应的具体功能,对于 DNS 系统而言,CoreDNS 使用 File,ETCD 插件等加载 DNS 记录,使用 Kubernetes 插件实现集群服务发现,外部 DNS 请求到达 CoreDNS 后,根据插件调用链依次处理 DNS 请求。 CoreDNS 社区官方提供了 50 多种插件,开发者亦可根据需求开发个性化的外部插件。CoreDNS 常用插件如下图,根据使用场景,可分为运维、DNS 处理、后端数据存储等三个类别。 CoreDNS 定义 Corefile 配置文件,服务器在加载 Corefile 后处理 DNS 请求,对于以下插件,只需在 Corefile 中引用即可,之后 CoreDNS 会使用插件链进行调用,插件链可参考以下链接: https://github.com/coredns/coredns/blob/master/plugin.cfg 设计一个基于 CoreDNS 的分层 DNS 架构 在熟悉 CoreDNS 特性后,可设计企业的 DNS 架构: DNS 架构以外网 DNS、内网 DNS、分区 DNS 组成: 外网 DNS: 使用 DNSSEC、DOT、DOH 等保障 DNS 安全; 缓存 DNS 记录; 构建 DNS 实例自动伸缩,应对高 QPS 需求; 内网 DNS: Kubernetes 服务发现; 构建上游 DNS 区域; 分区 DNS: 建立开发、测试、UAT、生产等区域 DNS; NodeLocalDNS 提高性能; 设置转发器处理递归 DNS 请求; KubeSphere 部署 CoreDNS 由于 CoreDNS 是一个 CNCF 毕业的云原生项目,是目前支持云原生最好的一个 DNS 服务器,用户可直接在 KubeSphere 应用商店一键安装。KubeSphere 提供了基于 Helm 模板的应用商店,支持云原生应用的生命周期管理,提供开发人员应用上传、测试,版本提交,应用管理人员进行审核、发布等流程管理。用户在应用商店选择 CoreDNS 应用后,可按需部署于不同集群的不同项目中,并自定义应用模板配置: 服务发现与 DNS 配置 部署 CoreDNS 后,对于运维人员来说,CoreDNS 的配置大体分为两类:一类为 Kubernetes 配置,一类为 DNS 配置。CoreDNS 提供了 Kubernetes 插件,支持在 kubernetes 集群中读取区域数据,并根据 Pod 和 Service 的域名记载相应的 A 记录和 PTR 记录。 这是一个 Kubernetes 集群中的 CoreDNS corefile 默认配置,CoreDNS 会在 53 端口读取 cluster.local 后缀的 Kubernetes 集群 A 记录和 PTR 记录。并将 CoreDNS 收集到的监控指标通过 9153 端口输出到集群内的 Prometheus。而 Kubernetes 不同类型 Service 的 DNS 记录格式,CoreDNS 也有相应标准进行记录。 设置完 Kubernetes 后,可以设置其他业务需求的 DNS 配置,如: 设置不同的存根域; 设置存根域静态 DNS 条目; 面对存量代码,设置域名重写; 面对集群外服务,设置 DNS 转发; 设置日志和监控集成; 设置缓存、健康、就绪检查及链路追踪; 根据以上配置,就构建了一个基础的企业云原生 DNS 系统: DNS 服务暴露 对于集群外的服务而言,存量业务可能还是一些虚拟化和裸机的应用,若和集群网络无法互联,如何在业务迁移时访问新的 DNS 服务? KubeSphere 提供了一个开源项目——OpenELB 来解决云原生环境下的服务暴露问题,这是一个 CNCF 的沙箱项目。OpenELB 通过物理环境的交换机使用 BGP 协议将 LoadBalancer 类型服务的 ExternalIP 宣告出去,在 IP 可达的环境下集群外部业务即可通过 EIP 访问 Kubernetes 服务资源。 对于集群外需要设置 DNS 服务器的服务资源,可通过 OpenELB 使用 EIP 暴露 CoreDNS ,即可访问 DNS 服务 。 在 KubeSphere 3.3 版本,用户可在开启集群网关 / 项目网关时,在网关访问 LoadBalancer 模式下,选择“OpenELB”负载均衡提供商,之后创建的 LoadBalancer 服务都会从 OpenELB 建立的 EIP Pool 中分配 EIP,供集群外部访问。 DNS 监控运维 为保障 CoreDNS 稳定运行,运维人员还需在基础设施侧完善 DNS 系统的日志、监控、告警、通知功能,KubeSphere 提供了简单易用的监控面板、日志管理与落盘,多维度的告警策略和消息,以及对接多个企业应用(邮件,钉钉, 企业微信)的通知系统,时刻关注业务运行状态。 此处以一个系统管理员视角,展示了在 KubeSphere 日志系统搜寻 NXDOMAIN 类型 DNS 回复的结果。 通过 KubeSphere 自定义监控面板,设置一个基于 CoreDNS 指标的监控面板,KubeSphere 内置了众多监控面板,用户可直接使用模板构建亦可使用 PromQL 创建面板: 通过 KubeSphere 告警和通知组件,用户可基于预置规则模板(CPU、内存、磁盘、网络、异常率)或使用 PromQL 语句自定义告警规则,此处定义当 CoreDNS CPU 用量大于等于 0.1Core 系统触发告警: KubeSphere 针对租户设计了通知模板,包含多种通知系统集成,此处使用邮件将“重要告警”,“危险告警”条件的告警消息发送给邮件接收人。 当告警触发后,即可在告警消息和通知历史处查看到相应的条目,此时用户也会收到一封告警邮件了: 在高并发 DNS 请求场景中,还需对 CoreDNS 进行自动伸缩设计,通常考虑到服务高可用性和性能考量,可参考以下计算规格和调度策略设计: 副本打散,跨可用区 / 节点。 避免所在节点 CPU、内存过高。 通常设计副本数为 2。QPS 与 CPU 消耗正相关,单 CPU——1w+QPS Kubernetes 集群下,CoreDNS 副本数与集群节点配置 1:8。 业务峰值 CPU 占用 >1Core,水平扩容。 通过 KubeSphere 自动伸缩机制,可设置基于 CPU 用量的自动伸缩策略,保障 CoreDNS 在瞬时高并发场景稳定运行。 总结 以上就是建设一个云原生的 DNS 系统的全部内容了,可以看出,在云原生时代,新的技术层出不穷,IT 系统的部门和人员也越发趋于协同作战,以往构建一个 DNS 系统可能只需要安装一套稳定能进行 DNS 解析的系统,并实现主备切换即可。在应用驱动基础架构转型的云原生时代,基础服务应用还更需要考虑异构系统的连接,灵活简便的安装升级管理,更强大的可靠性和自愈能力,日志监控通知系统的完善,还有更适合实际业务需求的弹性设计,来加速应用现代化,推动业务应用持续转型。 本文由博客一文多发平台 OpenWrite 发布!

优秀的个人博客,低调大师

J2PaaS 低代码工具 v1.1 更新,快速构建企业级应用

J2PaaS 是吉鼎科技基于20年技术沉淀和项目经验而研发,以“把编程变简单,甚至不需要编程”为核心理念,集开发引擎、运行引擎、项目管理等于一体,覆盖软件项目需求分析、设计、开发、测试、运行、维护与管理等全过程,是可视化、组件化、拖拽式开发的在线低代码敏捷开发平台。 J2PaaS 平台包含开发引擎和运行引擎,开发引擎是参数式低代码开发,通过简单快速的拖拉拽,就能实现页面、列表、报表、逻辑、工作流等系统功能的敏捷开发。运行引擎则负责应用系统的运行、管理、维护。 此次 J2PaaS更新内容如下: 修改mysql驱动版本5.1.45,同时兼容5.x和8.x版本mysql 整理数据库,缩减体积,排除已知的导入异常问题 更新注意事项,导入数据库出错解决方案 更新管理员端切换方法文档 J2PaaS源码下载:https://gitee.com/j2paas Demo演示:https://jikaiyun.com/Points J2PaaS平台把常规需要程序员完成的功能集成在框架中,开发人员只需关注业务逻辑,页面组装及流程设计等相关功能已经内置完成,它不仅是一个开发平台,还是强有力的生产力工具,能够实现低成本、高效率的软件系统定制开发及应用。 高级控件--柱状图 页面布局--border layout 图表数据汇总展示 欢迎下载使用!

优秀的个人博客,低调大师

积木报表 JimuReport 1.3.64 版本发布,免费的企业级可视化报表工具

项目介绍 积木报表,一款免费的可视化Web报表工具,像搭建积木一样在线拖拽设计!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! 秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开发周期、节省成本、解决各类报表难题,完全免费的!!! 当前版本:v1.3.64-beta | 2021-07-13 集成依赖 <dependency> <groupId>org.jeecgframework.jimureport</groupId> <artifactId>spring-boot-starter-jimureport</artifactId> <version>1.3.64-beta</version> </dependency> 增量SQL ALTER TABLE `jimu_report_db_param` ADD COLUMN `search_flag` int(1) NULL COMMENT '查询标识0否1是 默认0' AFTER `update_time`; update jimu_report_db_param set search_flag = 0; create table jimu_dict like sys_dict; insert into jimu_dict select * from sys_dict; create table jimu_dict_item like sys_dict_item; insert into jimu_dict_item select * from sys_dict_item; #升级日志 新功能 分组报表功能重构,支持分组内小计,支持设置分组字段排序、动态补数据等 新版导出pdf功能重构,支持表达式、字体样式、背景、套打、交叉表头 字典表名改成jimu_*前缀,与系统表区分 超链接颜色跟随字体颜色走 不设置默认蓝色 导出excel支持api方式调用 循环块重复设定bug修复 动态循环表头如果list为空会出现空指针的问题 横向分组后台报错 api超时提示、select * 多个字段引起报错,页面显示的是表名不存在,提示不正确,提示修改 tb JMREP-2066 微服务下自定义项目前缀参数customPrePath,不好使 解决springboot2.5集成minidao空指针问题 支持动态数据源配置(minidao默认数据源名:minidaoDataSource,如果不配置则随机走第一个数据源配置) 钻取新窗口不显示下一页 严重:模板里面设置的行高,预览时,恢复成默认高度了 主子报表有字典值没有翻译,导致子表查询不出来 Issues处理 导出excel时,图片未导出#230 积木报表不支持MYSQL内置函数,视图解析时出错#277 表格小数点数值为0,设置显示位数无效#136 上传模板不支持xlsI3SSJ0 查询栏查询时间类型及范围查找,无法显示默认值3SN3P 钻取到下一页面,能否增加返回到上一页操作I3SL05 图表联动可以看到已删除的图标I3SEV4 列比较多,编辑时列只显示到AX列,后面的列没显示出来造成无法进行修改I3RQIT 对每页10条的选项改成没有20信息后,打印和导出的数据数量都不对,都是10条I3NZF8 sql数据集中SQL解析失败问题I3NCM7 使用函数希望支持单元格拖拽选择I3SZPP SpringBoot 2.5.0 集成后数据库未初始化I3TD7G springboot按文档集成报错I3QC15 启动报MinidaoAutoConfiguration初始化失败I3SIEX 希望取消数据字典的入侵式行为,通过api或json的方式进行前端缓存I3UIJ4 url参数可以放在报表里么?I3U3Q5 在线设计不好管理I3UQEE 浏览器传参直接在报表上显示导出没有带参数导出I3ZAEU 当鼠标在api地址输入框失去焦点的时候,接口参数会被清空I3YP2X 横向分组,如果数据缺失,报表显示错误。I3XT94 根据查询条件查询,导出Excel没有传入参数I3XI9M 能否小计动态列到其他非一列的格子?I3XYZ3 api数据集get请求后台取不到参数#322 积木报表 列超出设定纸张宽度后,调整会格式出问题#359 报表设计器功能优化#321 图形报表条件搜索时图层数据错乱问题#325 非jeecg-boot项目集成积木报表,在上传背景图片时,请求头中没有加上token,是否可以加上?#318 首页分页问题#291 使用多数据对比柱状图时,如果查询条件后图表重叠#305 表格中存在负数,合计的时候,设置两位小数不起作用,而且数据不正确#293 1.3.1-beta4 API数据源 请求超时#319 合并两行表格,打印数据显示有问题#298 预览和设计加载外网js ,加载慢#316 【bug】交叉报表导出报错问题#339 报表连接600多张表的SQL Server,后编辑SQL页面卡死#333 表头在横向分组的情况下,excel导出失败#353 积木报表的主子表在主表没有数据的情况下页面会出错#2660 【报表设计器】添加了链接后字体无法改变颜色#2702 【报表设计器】循环块无法取消#2606 #代码下载 https://github.com/zhangdaiscott/JimuReport https://gitee.com/jeecg/JimuReport #技术文档 集成文档 :http://report.jeecg.com/2078875 数据库脚本:jimureport.sql 技术官网:http://jimureport.com 技术文档:http://report.jeecg.com 为什么选择 JimuReport? 永久免费,支持各种复杂报表,并且傻瓜式在线设计,非常的智能,低代码时代,这个是你的首选! 采用SpringBoot的脚手架项目,都可以快速集成 Web 版设计器,类似于excel操作风格,通过拖拽完成报表设计 通过SQL、API等方式,将数据源与模板绑定。同时支持表达式,自动计算合计等功能,使计算工作量大大降低 开发效率很高,傻瓜式在线报表设计,一分钟设计一个报表,又简单又强大 支持 ECharts,目前支持28种图表,在线拖拽设计,支持SQL和API两种数据源 支持分组、交叉,合计、表达式等复杂报表 支持打印设计(支持套打、背景打印等)可设置打印边距、方向、页眉页脚等参数 一键快速打印 同时可实现发票套打,不动产证等精准、无缝打印 大屏设计器支持几十种图表样式,可自由拼接、组合,设计炫酷大屏 可设计各种类型的单据、大屏,如出入库单、销售单、财务报表、合同、监控大屏、旅游数据大屏等 #系统截图 报表设计器(专业一流 数据可视化,解决各类报表难题) 报表设计器(完全在线设计,简单易用) 打印设计(支持套打、背景打印) 数据报表(支持分组、交叉,合计等复杂报表) 图形报表(目前支持28种图表) #功能清单 ├─报表设计器 │ ├─数据源 │ │ ├─支持多种数据源,如Oracle,MySQL,SQLServer,PostgreSQL等主流的数据库 │ │ ├─支持SQL编写页面智能化,可以看到数据源下面的表清单和字段清单 │ │ ├─支持参数 │ │ ├─支持单数据源和多数数据源设置 │ ├─单元格格式 │ │ ├─边框 │ │ ├─字体大小 │ │ ├─字体颜色 │ │ ├─背景色 │ │ ├─字体加粗 │ │ ├─支持水平和垂直的分散对齐 │ │ ├─支持文字自动换行设置 │ │ ├─图片设置为图片背景 │ │ ├─支持无线行和无限列 │ │ ├─支持设计器内冻结窗口 │ │ ├─支持对单元格内容或格式的复制、粘贴和删除等功能 │ │ ├─等等 │ ├─报表元素 │ │ ├─文本类型:直接写文本;支持数值类型的文本设置小数位数 │ │ ├─图片类型:支持上传一张图表;支持图片动态生成 │ │ ├─图表类型 │ │ ├─函数类型 │ │ └─支持求和 │ │ └─平均值 │ │ └─最大值 │ │ └─最小值 │ ├─背景 │ │ ├─背景颜色设置 │ │ ├─背景图片设置 │ │ ├─背景透明度设置 │ │ ├─背景大小设置 │ ├─数据字典 │ ├─报表打印 │ │ ├─自定义打印 │ │ └─医药笺、逮捕令、介绍信等自定义样式设计打印 │ │ ├─简单数据打印 │ │ └─出入库单、销售表打印 │ │ └─带参数打印 │ │ └─分页打印 │ │ ├─套打 │ │ └─不动产证书打印 │ │ └─发票打印 │ ├─数据报表 │ │ ├─分组数据报表 │ │ └─横向数据分组 │ │ └─纵向数据分组 │ │ └─多级循环表头分组 │ │ └─横向分组小计 │ │ └─纵向分组小计 │ │ └─合计 │ │ ├─交叉报表 │ │ ├─明细表 │ │ ├─带条件查询报表 │ │ ├─表达式报表 │ │ ├─带二维码/条形码报表 │ │ ├─多表头复杂报表 │ │ ├─主子报表 │ │ ├─预警报表 │ │ ├─数据钻取报表 │ ├─图形报表 │ │ ├─柱形图 │ │ ├─堆叠柱形图 │ │ ├─折线图 │ │ ├─饼图 │ │ ├─动态轮播图 │ │ ├─折柱图 │ │ ├─散点图 │ │ ├─漏斗图 │ │ ├─雷达图 │ │ ├─象形图 │ │ ├─地图 │ │ ├─仪盘表 │ │ ├─关系图 │ │ ├─图表背景 │ │ ├─图表动态刷新 │ │ ├─图表数据字典 │ ├─参数 │ │ ├─参数配置 │ │ ├─参数管理 │ ├─导入导出 │ │ ├─支持导入Excel │ │ ├─支持导出Excel、pdf;支持导出excel、pdf带参数 │ ├─打印设置 │ │ ├─打印区域设置 │ │ ├─打印机设置 │ │ ├─预览 │ │ ├─打印页码设置 ├─大屏设计器 │ ├─系统功能 │ │ ├─静态数据源和动态数据源设置 │ │ ├─基础功能 │ │ └─支持拖拽设计 │ │ └─支持增、删、改、查大屏 │ │ └─支持复制大屏数据和样式 │ │ └─支持大屏预览、分享 │ │ └─支持系统自动保存数据,同时支持手动恢复数据 │ │ └─支持设置大屏密码 │ │ └─支持对组件图层的删除、组合、上移、下移、置顶、置底等 │ │ ├─背景设置 │ │ └─大屏的宽度和高度设置 │ │ └─大屏简介设置 │ │ └─背景颜色、背景图片设置 │ │ └─封面图设置 │ │ └─缩放比例设置 │ │ └─环境地址设置 │ │ └─水印设置 │ │ ├─地图设置 │ │ └─添加地图 │ │ └─地图数据隔离 │ ├─图表 │ │ ├─柱形图 │ │ ├─折线图 │ │ ├─折柱图 │ │ ├─饼图 │ │ ├─象形图 │ │ ├─雷达图 │ │ ├─散点图 │ │ ├─漏斗图 │ │ ├─文本框 │ │ ├─跑马灯 │ │ ├─超链接 │ │ ├─实时时间 │ │ ├─地图 │ │ ├─全国物流地图 │ │ ├─地理坐标地图 │ │ ├─城市派件地图 │ │ ├─图片 │ │ ├─图片框 │ │ ├─轮播图 │ │ ├─滑动组件 │ │ ├─iframe │ │ ├─video │ │ ├─翻牌器 │ │ ├─环形图 │ │ ├─进度条 │ │ ├─仪盘表 │ │ ├─字浮云 │ │ ├─表格 │ │ ├─选项卡 │ │ ├─万能组件 └─其他模块 └─更多功能开发中。。

优秀的个人博客,低调大师

掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地中篇

联席作者:吴毅挺 任浩军 童子龙 郑重鸣谢:Nacos - 彦林,Spring Cloud Alibaba - 小马哥、洛夜,Nacos 社区 - 张龙(pader)、春少(chuntaojun) 掌门教育自 2014 年正式转型在线教育以来,秉承“让教育共享智能,让学习高效快乐”的宗旨和愿景,经历云计算、大数据、人工智能、 AR / VR / MR 以及现今最火的 5G ,一直坚持用科技赋能教育。掌门教育的业务近几年得到了快速发展,特别是今年的疫情,使在线教育成为了新的风口,也给掌门教育新的机遇。 随着业务规模进一步扩大,流量进一步暴增,微服务数目进一步增长,使老的微服务体系所采用的注册中心 Eureka 不堪重负,同时 Spring Cloud 体系已经演进到第二代,第一代的 Eureka 注册中心已经不大适合现在的业务逻辑和规模,同时它目前被 Spring Cloud 官方置于维护模式,将不再向前发展。如何选择一个更为优秀和适用的注册中心,这个课题就摆在了掌门人的面前。经过对 Alibaba Nacos 、HashiCorp Consul等开源注册中心做了深入的调研和比较,最终选定 Alibaba Nacos 做微服务体系 Solar 中的新注册中心。 背景故事 两次 Eureka 引起业务服务大面积崩溃后,虽然通过升级硬件和优化配置参数的方式得以解决,Eureka 服务器目前运行平稳,但我们依旧担心此类事故在未来会再次发生,最终选择落地 Alibaba Nacos 作为掌门教育的新注册中心。 Nacos 开发篇 Nacos Eureka Sync 方案演进 Sync 官方方案 经过研究,我们采取了官方的 Nacos Eureka Sync 方案,在小范围试用了一下,效果良好,但一部署到 FAT 环境后,发现根本不行,一台同步服务器无法抗住将近 660 个服务(非实例数)的频繁心跳,同时该方案不具备高可用特点。 Sync 高可用一致性 Hash + Zookeeper 方案 既然一台不行,那么就多几台,但如何做高可用呢? 我们率先想到的是一致性 Hash 方式。当一台或者几台同步服务器挂掉后,采用 Zookeeper 临时节点的 Watch 机制监听同步服务器挂掉情况,通知剩余同步服务器执行 reHash ,挂掉服务的工作由剩余的同步服务器来承担。通过一致性 Hash 实现被同步的业务服务列表的平均分配,基于对业务服务名的二进制转换作为 Hash 的 Key 实现一致性 Hash 的算法。我们自研了这套算法,发现平均分配的很不理想,第一时间怀疑是否算法有问题,于是找来 Kafka 自带的算法(见 Utils.murmur2 ),发现效果依旧不理想,原因还是业务服务名的本身分布就是不平均的,于是又回到自研算法上进行了优化,基本达到预期,下文会具体讲到。但说实话,直到现在依旧无法做到非常良好的绝对平均。 Sync 高可用主备 + Zookeeper 方案 这个方案是个小插曲,当一台同步服务器挂掉后,由它的“备”顶上,当然主备切换也是基于 Zookeeper 临时节点的 Watch 机制来实现的。后面讨论下来,主备方案,机器的成本很高,实现也不如一致性 Hash 优雅,最后没采用。 Sync 高可用一致性 Hash + Etcd 方案 折腾了这么几次后,发现同步业务服务列表是持久化在数据库,同步服务器挂掉后 reHash 通知机制是由 Zookeeper 来负责,两者能否可以合并到一个中间件上以降低成本?于是我们想到了 Etcd 方案,即通过它实现同步业务服务列表持久化 + 业务服务列表增减的通知 + 同步服务器挂掉后 reHash 通知。至此方案最终确定,即两个注册中心( Eureka 和 Nacos )的双向同步方案,通过第三个注册中心( Etcd )来做桥梁。 Sync 业务服务名列表定时更新优化方案 解决了一致性 Hash 的问题后,还有一个潜在风险,即官方方案每次定时同步业务服务的时候,都会去读取全量业务服务名列表,对于业务服务数较少的场景应该没问题,但对于我们这种场景下,这么频繁的全量去拉业务服务列表,会不会对 Nacos 服务器的性能有所冲击呢?接下去我们对此做了优化,取消全量定时读取业务服务名列表,通过 DevOps 的发布系统平台实施判断,如果是迁移过来的业务服务或者新上 Nacos 的业务服务,由发布平台统一调用 Nacos 接口来增加新的待同步业务服务 Job,当该业务服务全部迁移完毕后,在官方同步界面上删除该同步业务服务 Job 即可。 Sync 服务器两次扩容 方案实现后,上了 FAT 环境上后没发现问题(此环境,很多业务服务只部署一个实例),而在 PROD 环境上发现存在双向同步丢心跳的问题,原因是同步服务器来不及执行排队的心跳线程,导致 Nacos 服务器无法及时收到心跳而把业务服务踢下来。我们从 8 台 4C 8G 同步服务器扩容到 12 台,情况好了很多,但观察下来,还是存在一天内一些业务服务丢失心跳的情况,于是我们再次从 12 台 4C 8G 同步服务器扩容到 20 台,情况得到了大幅改善,但依旧存在某个同步服务器上个位数丢失心跳的情况,观察下来,那台同步服务器承受的某几个业务服务的实例数特别多的情况,我们在那台同步服务器调整了最大同步线程数,该问题得到了修复。我们将继续观察,如果该问题仍旧复现,不排除升级机器配置到 8C16G 来确保 PROD 环境的绝对安全。 至此,经过 2 个月左右的努力付出,Eureka 和 Nacos 同步运行稳定, PROD 环境上同步将近 660 个服务(非实例数),情况良好。非常重要的提醒:一致性 Hash 的虚拟节点数,在所有的 Nacos Sync Server 上必须保持一致,否则会导致一部分业务服务同步的时候会被遗漏。 Nacos Eureka Sync 落地实践 Nacos Eureka Sync 目标原则 注册中心迁移目标 1、过程并非一蹴而就的,业务服务逐步迁移的过程要保证线上调用不受影响,例如, A 业务服务注册到 Eureka 上, B 业务服务迁移到 Nacos ,A 业务服务和 B 业务服务的互相调用必须正常。2、过程必须保证双注册中心都存在这两个业务服务,并且目标注册中心的业务服务实例必须与源注册中心的业务服务实例数目和状态保持实时严格一致。 注册中心迁移原则 1、一个业务服务只能往一个注册中心注册,不能同时双向注册。2、一个业务服务无论注册到 Eureka 或者 Nacos,最终结果都是等效的。3、一个业务服务在绝大多数情况下,一般只存在一个同步任务,如果是注册到 Eureka 的业务服务需要同步到 Nacos ,那就有一个 Eureka -> Nacos 的同步任务,反之亦然。在平滑迁移中,一个业务服务一部分实例在 Eureka 上,另一部分实例在 Nacos 上,那么会产生两个双向同步的任务。4、一个业务服务的同步方向,是根据业务服务实例元数据( Metadata )的标记 syncSource 来决定。 Nacos Eureka Sync 问题痛点 Nacos Eureka Sync 同步节点需要代理业务服务实例和 Nacos Server 间的心跳上报。 Nacos Eureka Sync 将心跳上报请求放入队列,以固定线程消费,一个同步业务服务节点处理的服务实例数超过一定的阈值会造成业务服务实例的心跳发送不及时,从而造成业务服务实例的意外丢失。 Nacos Eureka Sync 节点宕机,上面处理的心跳任务会全部丢失,会造成线上调用大面积失败,后果不堪设想。 Nacos Eureka Sync 已经开始工作的时候,从 Eureka 或者 Nacos 上,新上线或者下线一个业务服务(非实例),都需要让 Nacos Eureka Sync 实时感知。 Nacos Eureka Sync 架构思想 1、从各个注册中心获取业务服务列表,初始化业务服务同步任务列表,并持久化到 Etcd 集群中。2、后续迁移过程增量业务服务通过 API 接口持久化到 Etcd 集群中,业务服务迁移过程整合 DevOps 发布平台。整个迁移过程全自动化,规避人为操作造成的遗漏。3、同步服务订阅 Etcd 集群获取任务列表,并监听同步集群的节点状态。4、同步服务根据存活节点的一致性 Hash 算法,找到处理任务节点,后端接口通过 SLB 负载均衡,删除任务指令轮询到的节点。如果是自己处理任务则移除心跳,否则找到处理节点,代理出去。5、同步服务监听源注册中心每个业务服务实例状态,将正常的业务服务实例同步到目标注册中心,保证双方注册中心的业务服务实例状态实时同步。6、业务服务所有实例从 Eureka 到 Nacos 后,需要业务部门通知基础架构部手动从 Nacos Eureka Sync 同步界面摘除该同步任务。 Nacos Eureka Sync 方案实现 基于官方的 Nacos Sync 做任务分片和集群高可用,目标是为了支持大规模的注册集群迁移,并保障在节点宕机时,其它节点能快速响应,转移故障。技术点如下,文中只列出部分源码或者以伪代码表示:**详细代码,请参考:https://github.com/zhangmen-tech/nacos** 服务一致性 Hash 分片路由:根据如图1多集群部署,为每个节点设置可配置的虚拟节点数,使其在 Hash 环上能均匀分布。 // 虚拟节点配置sync.consistent.hash.replicas = 1000; // 存储虚拟节点SortedMap circle = new TreeMap();// 循环添加所有节点到容器,构建Hash环replicas for loop { // 为每个物理节点设置虚拟节点 String nodeStr = node.toString().concat("##").concat(Integer.toString(replica)); // 根据算法计算出虚拟节点的Hash值 int hashcode = getHash(nodeStr); // 将虚拟节点放入Hash环中 circle.put(hashcode, node); } // 异步监听节点存活状态etcdManager.watchEtcdKeyAsync(REGISTER_WORKER_PATH, true, response -> { for (WatchEvent event : response.getEvents()) { // 删除事件,从内存中剔除此节点及Hash中虚拟节点 if (event.getEventType().equals(WatchEvent.EventType.DELETE)) { String key = Optional.ofNullable(event.getKeyValue().getKey()).map(bs -> bs.toString(Charsets.UTF_8)).orElse(StringUtils.EMPTY); //获取Etcd中心跳丢失的节点 String[] ks = key.split(SLASH); log.info("{} lost heart beat", ks[3]); // 自身节点不做判断 if (!IPUtils.getIpAddress().equalsIgnoreCase(ks[3])) { // 监听心跳丢失,更显存货节点缓存,删除Hash环上节点 nodeCaches.remove(ks[3]); try { // 心跳丢失,清除etcd上该节点的处理任务 manager.deleteEtcdValueByKey(PER_WORKER_PROCESS_SERVICE.concat(SLASH).concat(ks[3]), true); } catch (InterruptedException e) { log.error("clear {} process service failed,{}", ks[3], e); } catch (ExecutionException e) { log.error("clear {} process service failed,{}", ks[3], e); } } } } 根据业务服务名的 FNV1_32_HASH 算法计算每个业务服务的哈希值,计算该 Hash 值顺时针最近的节点,将任务代理到该节点。 // 计算任务的Hash值int hash = getHash(key.toString());if (!circle.containsKey(hash)) { SortedMap<Integer, T> tailMap = circle.tailMap(hash); // 找到顺势针最近节点 hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); } // 得到Hash环中的节点位置circle.get(hash); // 判断任务是否自己的处理节点if (syncShardingProxy.isProcessNode(taskDO.getServiceName())) { //如果任务属于该节点,则进行心跳同步处理 processTask(Task); } // 删除心跳同步任务if (TaskStatusEnum.DELETE.getCode().equals(taskUpdateRequest.getTaskStatus())) { // 通过Etcd存活节点的一致性Hash算法,获取此任务所在的处理节点 Node processNode = syncShardingProxy.fetchProcessNode(Task); if (processNode.isMyself()) { // 如果是自己的同步任务,发布删除心跳事件 eventBus.post(new DeleteTaskEvent(taskDO)); } else { // 如果是其他节点,则通过Http代理到此节点处理 httpClientProxy.deleteTask(targetUrl,task); } } 同步节点宕机故障转移:节点监听。监听其它节点存活状态,配置 Etcd 集群租约 TTL , TTL 内至少发送 5 个续约心跳以保证一旦出现网络波动避免造成节点丢失。 // 心跳TTL配置sync.etcd.register.ttl = 30; // 获取租约TTL配置String ttls = environment.getProperty(ETCD_BEAT_TTL);long ttl = NumberUtils.toLong(ttls); // 获取租约IDlong leaseId = client.getLeaseClient().grant(ttl).get().getID();PutOption option = PutOption.newBuilder().withLeaseId(leaseId).withPrevKV().build();client.getKVClient().put(ByteSequence.from(key, UTF_8), ByteSequence.from(value, UTF_8), option).get();long delay = ttl / 6; // 定时续约scheduledExecutorService.schedule(new BeatTask(leaseId, delay), delay, TimeUnit.SECONDS); // 续约任务private class BeatTask implements Runnable { long leaseId; long delay; public BeatTask(long leaseId, long delay) { this.leaseId = leaseId; this.delay = delay; } public void run() { client.getLeaseClient().keepAliveOnce(leaseId); scheduledExecutorService.schedule(new BeatTask(this.leaseId, this.delay), delay, TimeUnit.SECONDS); } } 节点宕机。其中某个节点宕机,其任务转移到其它节点,因为有虚拟节点的缘故,所以此节点的任务会均衡 ReSharding 到其它节点,那么,集群在任何时候,任务处理都是分片均衡的,如图2中, B 节点宕机, ##1 、 ##2 虚拟节点的任务会分别转移到 C 和 A 节点,这样避免一个节点承担宕机节点的所有任务造成剩余节点连续雪崩。 节点恢复。如图3,节点的虚拟节点重新添加到 Hash 环中, Sharding 规则变更,恢复的节点会根据新的 Hash 环规则承担其它节点的一部分任务。心跳任务一旦在节点产生都不会自动消失,这时需要清理其它节点的多余任务(即重新分配给复苏节点的任务),给其它节点减负(这一步非常关键,不然也可能会引发集群的连续雪崩),保障集群恢复到最初正常任务同步状态。 // 找到此节点处理的心跳同步任务Map finishedTaskMap = skyWalkerCacheServices.getFinishedTaskMap(); // 存储非此节点处理任务Map unBelongTaskMap = Maps.newHashMap(); // 找到集群复苏后,Rehash后不是此节点处理的任务if (!shardingEtcdProxy.isProcessNode(taskDO.getServiceName()) && TaskStatusEnum.SYNC.getCode().equals(taskDO.getTaskStatus())) { unBelongTaskMap.put(operationId, entry.getValue()); } unBelongTaskMap for loop { // 删除多余的节点同步 specialSyncEventBus.unsubscribe(taskDO); // 删除多余的节点处理任务数 proxy.deleteEtcdValueByKey(PER_WORKER_PROCESS_SERVICE.concat(SLASH).concat(IPUtils.getIpAddress()).concat(SLASH).concat(taskDO.getServiceName()), false); // 根据不同的同步类型,删除多余的节点心跳 if (ClusterTypeEnum.EUREKA.getCode().equalsIgnoreCase(clusterDO.getClusterType())) { syncToNacosService.deleteHeartBeat(taskDO); } if (ClusterTypeEnum.NACOS.getCode().equalsIgnoreCase(clusterDO.getClusterType())) { syncToEurekaService.deleteHeartBeat(taskDO); } // 删除多余的finish任务 finishedTaskMap.remove(val.getKey()); } 节点容灾。如果 Etcd 集群连接不上,则存活节点从配置文件中获取,集群正常运作,但是会失去容灾能力。 // 配置所有处理节点的机器IP,用于构建Hash环sync.worker.address = ip1, ip2, ip3; // 从配置文件获取所有处理任务节点IPList ips = getWorkerIps();ConsistentHash consistentHash = new ConsistentHash(replicas, ips); // 如果从Etcd中获取不到当前处理节点,则构建Hash环用配置文件中的IP列表,且列表不会动态变化if (CollectionUtils.isNotEmpty(nodeCaches)) { consistentHash = new ConsistentHash(replicas, nodeCaches); } return consistentHash; Nacos Eureka Sync 保障手段 Nacos Eureka Sync 同步界面 从如下界面可以保证,从 Eureka 或者 Nacos 上,新上线或者下线一个业务服务(非实例),都能让 Nacos Eureka Sync 实时感知。但我们做了更进一层的智能化和自动化: 1、新增同步。结合 DevOps 发布平台,当一个业务服务(非实例)新上线的时候,智能判断它是从哪个注册中心上线的,然后回调 Nacos Eureka Sync 接口,自动添加同步接口,例如,A 业务服务注册到 Eureka 上,DevOps 发布平台会自动添加它的 Eureka -> Nacos 的同步任务,反之亦然。当然从如下界面的操作也可实现该功能。2、删除同步。由于 DevOps 发布平台无法判断一个业务服务(非实例)下线,或者已经迁移到另一个注册中心,已经全部完毕(有同学会反问,可以判断的,即查看那个业务服务的实例数是否是零为标准,但我们应该考虑,实例数为零在网络故障的时候也会发生,即心跳全部丢失,所以这个判断依据是不严谨的),交由业务人员来判断,同时配合钉钉机器人告警提醒,由基础架构部同学从如下界面的操作实现该功能。 Nacos Eureka Sync Etcd 监控 从如下界面可以监控到,业务服务列表是否在同步服务的集群上呈现一致性 Hash 均衡分布。 Nacos Eureka Sync 告警 Nacos Eureka Sync 告警: 业务服务同步完毕告警: Nacos Eureka Sync 升级演练 1、7 月某天晚上 10 点开始, FAT 环境进行演练,通过自动化运维工具 Ansible 两次执行一键升级和回滚均没问题。2、晚上 11 点 30 开始,执行灾难性操作,观察智能恢复状况, 9 台 Nacos Eureka Sync 挂掉 3 台的操作,只丢失一个实例,但5分钟后恢复(经调查,问题定位在 Eureka 上某个业务服务实例状态异常)。3、晚上 11 点 45 开始,继续挂掉 2 台,只剩 4 台,故障转移,同步正常。4、晚上 11 点 52 开始,恢复 2 台,Nacos Eureka Sync 集群重新均衡 ReHash ,同步正常。5、晚上 11 点 55 开始,全部恢复,Nacos Eureka Sync 集群重新均衡 ReHash ,同步正常。6、12 点 14 分,极限灾难演练, 9 台挂掉 8 台,剩 1 台也能抗住,故障转移,同步正常。7、凌晨 12 点 22 分,升级 UAT 环境顺利。8、凌晨 1 点 22 ,升级 PROD 环境顺利。 容灾恢复中的 ReHash 时间小于 1 分钟,即 Nacos Eureka Sync 服务大面积故障发生时,恢复时间小于 1 分钟。 作者信息: 吴毅挺,掌门技术副总裁,负责技术中台和少儿技术团队。曾就职于百度、eBay 、携程,曾任携程高级研发总监,负责从零打造携程私有云、容器云、桌面云和 PaaS 平台。 任浩军,掌门基础架构部负责人。曾就职于平安银行、万达、惠普,曾负责平安银行平台架构部PaaS 平台 Halo 基础服务框架研发。10 多年开源经历,Github ID:@HaojunRen,Nepxion 开源社区创始人,Nacos Group Member,Spring Cloud Alibaba & Nacos & Sentinel& OpenTracing Committer。 参与 Nacos 落地的基础架构部成员,包括:童子龙,张彬彬,廖梦鸽,张金星,胡振建,谢璐,谢庆芳,伊安娜

优秀的个人博客,低调大师

Hyperf 发布 v2.0.4 版本,企业级 PHP 微服务云原生协程框架

更新内容 本周主要修复了一些组件的 🐛Bug,继续提升 Hyperf 的稳定性,发布于 2.0.4 版,建议用户更新此版本。 直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容 新增 #2144 数据库查询事件 Hyperf\Database\Events\QueryExecuted 添加 $result 字段。 #2158 路由 Hyperf\HttpServer\Router\Handler 中,添加 $options 字段。 #2162 热更新组件添加 Hyperf\Watcher\Driver\FindDriver。 #2169 Session 组件新增配置 session.options.domain,用于替换 Request 中获取的 domain。 #2174 模型生成器添加 ModelRewriteTimestampsVisitor,用于根据数据库字段 created_at 和 updated_at, 重写模型字段 $timestamps。 #2175 模型生成器添加 ModelRewriteSoftDeletesVisitor,用于根据数据库字段 deleted_at, 添加或者移除 SoftDeletes。 #2176 模型生成器添加 ModelRewriteKeyInfoVisitor,用于根据数据库主键,重写模型字段 $incrementing $primaryKey 和 $keyType。 修复 #2149 修复自定义进程运行过程中无法从 Nacos 正常更新配置的 BUG。 #2159 修复使用 gen:migration 时,由于文件已经存在导致的 FATAL 异常。 优化 #2043 当 SCAN 目录都不存在时,抛出更加友好的异常。 #2182 当使用 WebSocket 和 Http 服务且 Http 接口被访问时,不会记录 WebSocket 关闭连接的日志。 关于 Hyperf Hyperf 是基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。 框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul、Nacos 服务中心、ETCD 客户端、AMQP 组件、Nats 组件、Apollo、ETCD、Zookeeper、Nacos 和阿里云 ACM 的配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎、Snowflake 全局ID生成器、Prometheus 服务监控 等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了 基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Session、i18n 国际化、Validation 表单验证 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念 Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速 和 灵活性 作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 文档齐全 我们投入了大量的时间用于文档的建设以提供高质量的文档体验,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。 Hyperf 官方开发文档 生产可用 我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在 1453 个单测共 4473 个断言条件,Hyperf 是一款经历过严酷的生产环境考验的一个项目,目前已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。 官网及交流 Github 👈👈👈👈👈 点 Star 支持我们 Gitee 码云 👈👈👈👈👈 点 Star 支持我们 Hyperf 官网 Hyperf 文档

优秀的个人博客,低调大师

Hyperf 发布 v1.1.31 版本,企业级 PHP 微服务云原生协程框架

更新内容 本周更新主要为hyperf/exception-handler组件增加 Whoops 集成,现在可以将异常信息以 Whoops 的形式输出到浏览器上了。另修复了一些 🐛Bug, 继续提升 Hyperf 的稳定性,发布于1.1.31版,建议用户更新此版本。 直接访问 官网hyperf.io或 文档hyperf.wiki查看更新内容 新增 #1723异常处理器集成了 filp/whoops 。 #1730为命令gen:model可选项--refresh-fillable添加简写-R。 修复 #1696修复方法Context::copy传入字段keys后无法正常使用的 BUG。 #1708#1718修复hyperf/socketio-server组件内存溢出等 BUG。 优化 #1710MAC 系统下不再使用cli_set_process_title方法设置进程名。 关于 Hyperf Hyperf 是基于Swoole 4.4+实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于PHP-FPM的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于PSR 标准实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是可替换与可复用的。 框架组件库除了常见的协程版的MySQL 客户端、Redis 客户端,还为您准备了协程版的Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、Nats 组件、Apollo、ETCD、Zookeeper 和阿里云 ACM 的配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎、Snowflake 全局ID生成器、Prometheus 监控等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Session、i18n 国际化、Validation 表单验证等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念 Hyperspeed + Flexibility = Hyperf,从名字上我们就将超高速和灵活性作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于PSR 标准的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 文档齐全 我们投入了大量的时间用于文档的建设以提供高质量的文档体验,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。 Hyperf 官方开发文档 生产可用 我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在1396个单测共4312个断言条件,Hyperf 是一款经历过严酷的生产环境考验的一个项目,目前已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。 官网及交流 Github👈👈👈👈👈 点 Star 支持我们 Gitee 码云👈👈👈👈👈 点 Star 支持我们 Hyperf 官网 Hyperf 文档

优秀的个人博客,低调大师

Hyperf 发布 v1.1.28 版本,企业级 PHP 微服务云原生协程框架

更新内容 本周主要修复了一些 🐛Bug, 继续提升 hyperf 的稳定性, 发布于 1.1.28 版, 建议用户更新此版本 直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容 更新 Swoole 4.5 并且使用 view 组件的同学,如果出现接口 404 的问题,可以尝试删除 static_handler_locations 配置,此配置下的路径都会被认为是静态文件路由,所以如果配置了 /,就会导致所有接口都会被认为是文件路径,导致接口 404。 新增 #1645 匿名函数路由支持参数注入。 #1647 为 model-cache 组件添加 RedisStringHandler。 #1654 新增 RenderException 统一捕获 view 组件抛出的异常。 修复 #1639 修复 rpc-client 会从 consul 中获取到不健康节点的BUG。 #1641 修复 rpc-client 获取到的结果为 null 时,会抛出 RequestException 的BUG。 #1641 修复 rpc-server 中 jsonrpc-tcp-length-check 协议,无法在 consul 中添加心跳检查的BUG。 #1650 修复脚本 describe:routes 列表展示有误的BUG。 #1655 修复 MysqlProcessor::processColumns 无法在 MySQL Server 8.0 版本中正常工作的BUG。 优化 #1636 优化 co-phpunit 脚本,当出现 case 验证失败后,协程也可以正常结束。 关于 Hyperf Hyperf 是基于 Swoole 4.4+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。 框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、Nats 组件、Apollo、ETCD、Zookeeper 和阿里云 ACM 的配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎、Snowflake 全局ID生成器、Prometheus 监控 等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了 基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Session、i18n 国际化、Validation 表单验证 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念 Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速 和 灵活性 作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 文档齐全 我们投入了大量的时间用于文档的建设以提供高质量的文档体验,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。 Hyperf 官方开发文档 生产可用 我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在 1366 个单测共 4209 个断言条件,Hyperf 是一款经历过严酷的生产环境考验的一个项目,目前已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。 官网及交流 Github 👈👈👈👈👈 点 Star 支持我们 Gitee 码云 👈👈👈👈👈 点 Star 支持我们 Hyperf 官网 Hyperf 文档

优秀的个人博客,低调大师

Hyperf 发布 v1.1.26 版本,企业级 PHP 微服务云原生协程框架

更新内容 本周更新主要修复了一些 🐛Bug, 继续提升 hyperf 的稳定性,现已发布1.1.26 版, 建议用户更新此版本 直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容 新增 #1578 UploadedFile 支持 getStream 方法。 修复 #1563 修复服务关停后,定时器的 onOneServer 配置不会被重置。 #1565 当 DB 组件重连 Mysql 时,重置事务等级为 0。 #1572 修复 Hyperf\GrpcServer\CoreMiddleware 中,自定义类的父类找不到时报错的BUG。 #1577 修复 describe:routes 脚本 server 配置不生效的BUG。 #1579 修复 migrate:refresh 脚本 step 参数不为 int 时会报错的BUG。 变更 #1560 修改 hyperf/cache 组件文件缓存引擎中 原生的文件操作为 Filesystem。 #1568 修改 hyperf/async-queue 组件 Redis 引擎中的 \Redis 为 RedisProxy。 关于 Hyperf Hyperf 是基于 Swoole 4.4+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。 框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、Nats 组件、Apollo、ETCD、Zookeeper 和阿里云 ACM 的配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎、Snowflake 全局ID生成器、Prometheus 监控 等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了 基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Session、i18n 国际化、Validation 表单验证 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念 Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速 和 灵活性 作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 文档齐全 我们投入了大量的时间用于文档的建设以提供高质量的文档体验,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。 Hyperf 官方开发文档 生产可用 我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在 1346 个单测共 3971 个断言条件,Hyperf 是一款经历过严酷的生产环境考验的一个项目,目前已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。 官网及交流 Github 👈👈👈👈👈 点 Star 支持我们 Gitee 码云 👈👈👈👈👈 点 Star 支持我们 Hyperf 官网 Hyperf 文档

优秀的个人博客,低调大师

Hyperf v1.1.9 发布 | 企业级的 PHP 微服务云原生协程框架

更新内容 本周更新主要为 DI 组件新增了懒加载功能,配置为懒加载后,注入的对象为一个代理对象,在使用到时,才会实现对象的初始化。以及为 DI Container 增加了 set 和 define 方法来动态的增加对象管理和依赖关系,便于在自动化测试场景下的使用。同时我们还为 PHP 7.4 进行了适配,并增加了 Travis CI 对应的环境进行自动化测试,确保 Hyperf 在 PHP 7.4 下的运行。 我们还修复了一些组件的 🐛Bug 和做了一些优化工作,使 Hyperf 1.1.* 系列版本更加的健壮了,发布于 1.1.9 版,建议使用 1.1 的用户更新。 直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容。 新增 #948 为 DI Container 增加懒加载功能; #1044 为 AMQP Consumer 增加 basic_qos 配置; #1056 #1081 DI Container 增加 define() 和 set() 方法,同时增加 Hyperf\Contract\ContainerInterface; #1059 job.stub 模板增加构造函数; #1084 支持 PHP 7.4,TrvisCI 增加 PHP 7.4 运行支持; 修复 #1007 修复 vendor:: publish 的命令返回值; #1049 修复 Hyperf\Cache\Driver\RedisDriver::clear 会有可能删除所有缓存失败的问题; #1055 修复 Image 验证时后缀大小写的问题; #1085 #1091 Fixed @Retry 注解使用时会找不到容器的问题; 关于 Hyperf Hyperf 是基于 Swoole 4.4+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。 框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、Nats 组件、Apollo、ETCD、Zookeeper 和阿里云 ACM 的配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎、Snowflake 全局ID生成器、Prometheus 监控 等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了 基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Session、i18n 国际化、Validation 表单验证 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念 Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速 和 灵活性 作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 文档齐全 我们投入了大量的时间用于文档的建设,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。 Hyperf 官方开发文档 生产可用 我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在 1248 个单测共 3677 个断言条件,同时维护了高质量的文档,在 Hyperf 正式对外开放(2019年6月20日)之前,便已经过了严酷的生产环境的考验,我们才正式的对外开放该项目,现在已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。 官网及交流 Github 👈👈👈👈👈 点 Star 支持我们 Gitee 码云 👈👈👈👈👈 点 Star 支持我们 Hyperf 官网 Hyperf 文档 QQ 群: 862099724

优秀的个人博客,低调大师

ShopXO v1.6.0 重磅发布,企业级 B2C 免费开源商城系统

web端 1. 新增百度小程序 2. 新增优惠劵插件 3. 新增会员等级增强版插件 4. 新增订单自动关闭/收货脚本 5. web站点新增更多钩子 6. 限时秒杀插件优化 7. 分销插件优化 8. 应用管理优化 9. 后台附件上传优化 10. 留言登录校验 11. 更多细节优化 小程序 1. 首页改版 2. 采用token机制、兼容H5访问 3. 首页搜索导航固定 4. 用户中心(新增web导航、后台可控制) 5. 商品详情新增视频(仅支持微信和百度) 6. 商品详情新增分享 一键分享(使用系统内置) 全部支持 好物分享(依赖微信插件) 仅支持微信小程序 海报分享(依赖分销插件) 仅支持微信小程序 7. 支付宝小程序登录机制更新 8. 新增限时秒杀支持 9. 新增在线客服 仅支付微信小程序 10. 支持采用web商品详情 11. 不强制绑定手机号码 更多更新日志https://gitee.com/gongfuxiang/shopxo/blob/master/changelog.txt

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册