- swiper 望支持indicator-dots自定义样式
- 需求的场景描述(希望解决的问题) 目前没有这种功能,只能用替代方案,隐藏indicator-dots,然后自己创建一个假indicator-dots,如果页面有多个swiper处理起来实在非常麻烦。 - 希望提供的能力 swiper 望支持indicator-dots自定义样式
2019-05-21 - [有点炫]自定义navigate+分包+自定义tabbar
自定义navigate+分包+自定义tabbar,有需要的可以拿去用用,可能会存在一些问题,根据自己的业务改改吧 大家也可以多多交流 代码片段:在这里 {"version":"1.1.5","update":[{"title":"修复 [复制代码片段提示] 无法使用的问题","date":"2020-06-15 09:20","imgs":[]}]} 更新日志: 2019-11-25 自定义navigate 也可以调用wx.showNavigationBarLoading 和 wx.hideNavigationBarLoading 2019-11-25 页面滚动条显示在自定义navigate 和 自定义tabbar上面的问题(点击“体验custom Tabbar” [图片] [图片] 其他demo: 云开发之微信支付:代码片段
2020-06-15 - 减少重复造轮子,开源微信小程序商城(前后端开源:uniapp+Java),秒杀、优惠券、多商户、直播卖货、分销等功能。
注意 Entity里不是缺少get、set方法,Eclipse、IDEA请先安装lombok插件 使用须知 ✅允许 个人学习使用 允许用于学习、毕设等 允许进行商业使用,请自觉遵守使用协议,如需要商业使用推荐购买商业版(进群联系群主) 请遵守 Apache License2.0 协议,再次开源请注明出处 推荐Watch、Star项目,获取项目第一时间更新,同时也是对项目最好的支持 如何交流、反馈、参与贡献? 官方社区:http://fly2you.cn gitee仓库:https://gitee.com/fuyang_lipengjun/platform github仓库:https://github.com/lipengjun92/platform-wxshop 官方QQ群: https://qm.qq.com/cgi-bin/qm/qr?k=HNLRmaIdvnj2e_TGkMspORvIn-AHNZCb&jump_from=webapi”>img border=“0” src="//pub.idqqimg.com/wpa/images/group.png" alt=“微同科技 ①群” title=“微同科技 ①群”> https://qm.qq.com/cgi-bin/qm/qr?k=4i3Z9xgp7SlPnk_X1v0TWToSOoT_gJMz&jump_from=webapi”>img border=“0” src="//pub.idqqimg.com/wpa/images/group.png" alt=“微同科技 ②群” title=“微同科技 ②群”> https://qm.qq.com/cgi-bin/qm/qr?k=hQLMx7vYLfP_C-d2-yP_udx1yciJXfHC&jump_from=webapi”>img border=“0” src="//pub.idqqimg.com/wpa/images/group.png" alt=“微同科技 ③群” title=“微同科技 ③群”> Watch、Star项目,进群联系群主获取《微同开源商城启动部署手册.docx》 技术讨论、二次开发等咨询、问题和建议,请移步到官方社区,我会在第一时间进行解答和回复! 微信扫码并关注公众号,获得项目最新动态及更新提醒 [图片] 开发计划 1 使用uniapp重构小程序端所有页面 2 修复所以已知bug,使用遇到bug请给我们提交issues 3 后台使用SpringBoot重构 4 适配H5、IOS、Android端 5 接入支付宝支付 6 出配套视频教程 微同商城商业版 小程序 [图片] H5 IOS Android 商业版与开源版差异 微信小程序商城(Java版) 获得荣誉 GVP [图片] 新手必看启动教程 https://www.bilibili.com/video/av66149752 微同商城开源版体验: [图片] git:https://gitee.com/fuyang_lipengjun/platform 代码生成工具IDEA插件 git:https://gitee.com/fuyang_lipengjun/platform-gen 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.1.0、MyBatis-Plus 3.1.0 1.3 shiro1.3.2 1.4 servlet3.1.0 1.5 druid1.0.28 1.6 slf4j1.7.19 1.7 fastjson1.2.30 1.8 poi3.15 1.9 velocity1.7 1.10 quartz2.2.3 1.11 mysql5.1.39 1.12 swagger2.4 1.13 j2cache2.3.22-release 1.14 weixin-java-mp3.2.0 1.15 MybatisPlus3.1.0 1.16 lombok 2 前端使用技术 2.1 Vue2.5.1 2.2 iview 2.3 layer3.0.3 2.4 jquery2.2.4 2.5 bootstrap3.3.7 2.6 jqgrid5.1.1 2.7 ztree3.5.26 2.8 froala_editor1.2.2 项目结构 [代码]platform |--platform-admin 后台管理 |--platform-api 微信小程序商城api接口 |--platform-common 公共模块 |--platform-framework 系统WEB合并,请打包发布此项目 |--platform-gen 代码生成 |--platform-mp 微信公众号模块 |--platform-schedule 定时任务 |--platform-shop 商城后台管理 |--uni-color-ui uni-mall商城参考项目 |--uni-mall 移动端商城 |--wx-mall 微信小程序商城 [代码] 实现功能 一:会员管理 a 会员管理 b 会员等级 c 收货地址管理 d 会员优惠劵 e 会员收藏 f 会员足迹 g 搜索历史 h 购物车 二:商城配置 a 区域配置 b 商品属性种类 c 品牌制造商 d 商品规格 e 订单管理 f 商品类型 g 渠道管理 h 商品问答 i 反馈 j 关键词 三:商品编辑 a 所有商品 b 用户评论 c 产品设置 d 商品规格 e 商品回收站 四:推广管理 a 广告列表 b 广告位置 c 优惠劵管理 d 专题管理 e 专题分类 五:订单管理 a 所有订单管理 六:系统管理 a 管理员列表 b 角色管理 c 菜单管理 d SQL监控 e 定时任务 f 参数管理 g 代码生成器 h 系统日志 i 文件上传 j 通用字典表 七:短信服务平台 a 配置短信平台账户信息 b 向外提供发送短信接口: [代码]http://域名:端口/api/sendSms?mobile=13000000000,15209831990&content=发送的短信内容 安全起见,需配置有效IP地址。platform.properties -> sms.validIp [代码] 安装教程 配置环境(推荐jdk1.8、maven3.3、tomcat8、mysql5.7、redis4.0.1) 创建数据库 依次初始化sql脚本 /_sql/platform.sql /_sql/sys_region.sql 导入项目到IDE中 导入支付证书至/platform-shop/src/main/resources/cert/目录下(申请商户号、开通微信支付、下载支付证书) 修改配置文件 /platform-admin/src/main/resources/dev/platform.properties jdbc.url jdbc.username jdbc.password wx.appId wx.secret wx.mchId wx.paySignKey wx.notifyUrl sms.validIp mp.appId mp.secret mp.token mp.aesKey 修改配置文件 /platform-admin/src/main/resources/j2cache.properties redis.hosts redis.password 启动redis服务 启动后台项目(参照开发文档) 打开微信开发者工具 导入 /wx-mall填写appId 修改 /wx-mall/config/api.js里API_BASE_URL的值 使用eclipse启动项目后默认访问路径 http://localhost:8080/platform-framework 使用idea启动项目后默认访问路径 http://localhost:8080 页面展示 登录页面 [图片] 首页 [图片] 发送短信 [图片] 捐赠 [图片] 小程序首页 [图片] 专题 [图片] 分类 [图片] 购物车 [图片] 登录授权 [图片] 优惠券 [图片] 小程序并联手机 [图片] uniapp版本 [图片] [图片] [图片] [图片] [图片] [图片] 开发文档目录 a name=“doc” href=“http://fly2you.cn/guide/index” target="_blank">[图片]
2020-08-11 - width:100%在小程序中的表现
在使用flex布局的时候,有时得到的结果和预期不相符,于是记录了一下在小程序中width:100%的表现。 正常布局 width属性在w3c中是这样定义的:width定义元素内容区的宽度,在内容区外面可以增加内边距、边框和外边距。但是行内非替换元素会忽略这个属性。 width的默认值是auto,表示宽度是可变动的,使用了auto属性的view的content+margin+padding+border相加为父元素的width大小,宽度与其内容无关。在不设置width的时候默认是auto,对某个元素使用position的时候会显示出不同的效果,可以选择清除浮动或者设置width为x%,来调整样式。 width:100%定义基于包含块(父元素)宽度的百分比宽度,子元素的width将会充满父元素的content,此时给子元素附加margin的时候并不是改变子元素的大小而是直接使得子元素溢出父元素。 实例 正常布局下width:auto的表现 [图片] 代码展示: [代码]<!-- wxml --> <view class="width-demo-father"> <view class='width-demo-son'>1111</view> </view> <!-- wxss --> .width-demo-father { border: 1rpx solid red; margin-bottom: 30rpx; } .width-demo-son { width: auto; border: 1rpx solid yellow; padding-left: 10rpx; padding-right: 10rpx; margin-left: 10rpx; margin-right: 10rpx; height: 200rpx; background: pink; } [代码] 解析:此时子view块的content+margin+padding+border的宽度为父元素的width大小,不会溢出父元素。 正常布局下width:100%的表现 [图片] [代码]<!-- wxml --> <view class="width-demo-father"> <view class='width-demo-son-100' style='width:100%'>2222</view> </view> <!-- wxss --> .width-demo-son-100 { border: 1rpx solid black; margin-left: 20rpx; height: 200rpx; } [代码] 解析:子元素设置为width:100%且设置margin:left 20rpx的情况下溢出父元素。 修正 评论中指出了flex一节中的错误,重新对文章flex相关内容进行了补充。 flex是Flexible Box的缩写,意思是灵活的布局,,使用flex布局可以快速的完成页面布局。flex布局使用相当简单:指定一个元素为flex容器,指定后容器内部的元素就可以使用flex来进行布局。 flex容器相关属性有flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content属性。 flex容器子元素又可称为项目有order、flex-basis、flex-grow、flex-shrink、flex、align-self属性,其中flex-basis,flex-grow,flex-shrink三个属性会影响子元素的大小。 flex-basis:定义了在分配多余空间之前,项目占据的主轴空间。默认值是auto即项目本来的大小。 [图片] [代码]<view class='main5'> <view>1017</view> <view>1018</view> <view>1019</view> </view> .main5 { background-color: #0f0; margin-top: 20rpx; display: flex; } .main5>view { background: red; width: 200rpx; flex-basis: auto; } [代码] 当flex的主轴方向为水平轴的时候,设置flex-basis:0%后项目的宽度会失效,即使声明了项目宽度也不起作用。 [图片] [代码].main5 { background-color: #0f0; margin-top: 20rpx; display: flex; /*父div设置该属性*/ } .main5>view { background: red; width: 200rpx; /* flex-basis: auto; */ flex-basis: 0%; } [代码] 当flex指定主轴方向为竖直轴的时候,flex-basis会影响高度。 flex-grow定义项目的放大比例,默认值为0,即使存在剩余空间也不会放大。 flex-shrink: 定义了项目的缩小比例。默认值为1,即如果空间不足,该项目将缩小。在同一时间,flex-shrink 和 flex-grow 只有一个能起作用。 当容器未设置flex-wrap:wrap的情况,且子元素宽度不充满整个容器此时flex-grow会起作用,如果子项目flex-grow均设置为1,则子项目会平分剩余空间。 [图片] [代码].main5 { background-color: #0f0; margin-top: 20rpx; display: flex; } .main5>view { background: red; width: 200rpx; /* flex-shrink: 1; */ flex-grow: 1; flex-basis :auto; } [代码] 当容器未设置flex-wrap:wrap的情况,且子元素宽度充满整个容器此时flex-shrink会起作用,如果子项目flex-shrink均设置为1,则子项目会等比例缩小。 [图片] [代码].main6 { background-color: #0f0; margin-top: 20rpx; display: flex; } .main6>view { background: pink; width: 400rpx; flex-shrink: 1; flex-basis :auto; border: 1rpx solid black; } [代码] flex是flex-grow, flex-shrink 和 flex-basis的简写,默认值是 0 1 auto,推荐使用flex属性来控制子项目。
2019-06-06 - 如何实现小程序的强制更新
大家都知道小程序提交审核发布以后是不会马上更新版本的,用户需要下次使用才会更新到新的版本,这就是冷更新。 那么如果要做到及时生效怎么办呢?这时候就要做处理了,将下面的代码添加到app.js,提交审核,发布就会生效了 [代码]onLaunch: [代码][代码]function[代码] [代码](options) {[代码] [代码] [代码][代码]this[代码][代码].autoUpdate()[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]autoUpdate: [代码][代码]function[代码] [代码]() {[代码] [代码] [代码][代码]var[代码] [代码]self = [代码][代码]this[代码] [代码] [代码][代码]// 获取小程序更新机制兼容[代码] [代码] [代码][代码]if[代码] [代码](wx.canIUse([代码][代码]'getUpdateManager'[代码][代码])) {[代码] [代码] [代码][代码]const updateManager = wx.getUpdateManager()[代码] [代码] [代码][代码]//1. 检查小程序是否有新版本发布[代码] [代码] [代码][代码]updateManager.onCheckForUpdate([代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]// 请求完新版本信息的回调[代码] [代码] [代码][代码]if[代码] [代码](res.hasUpdate) {[代码] [代码] [代码][代码]//检测到新版本,需要更新,给出提示[代码] [代码] [代码][代码]wx.showModal({[代码] [代码] [代码][代码]title: [代码][代码]'更新提示'[代码][代码],[代码] [代码] [代码][代码]content: [代码][代码]'检测到新版本,是否下载新版本并重启小程序?'[代码][代码],[代码] [代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](res.confirm) {[代码] [代码] [代码][代码]//2. 用户确定下载更新小程序,小程序下载及更新静默进行[代码] [代码] [代码][代码]self.downLoadAndUpdate(updateManager)[代码] [代码] [代码][代码]} [代码][代码]else[代码] [代码]if[代码] [代码](res.cancel) {[代码] [代码] [代码][代码]//用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了[代码] [代码] [代码][代码]wx.showModal({[代码] [代码] [代码][代码]title: [代码][代码]'温馨提示'[代码][代码],[代码] [代码] [代码][代码]content: [代码][代码]'本次版本更新涉及到新的功能添加,旧版本可能无法正常访问哦'[代码][代码],[代码] [代码] [代码][代码]showCancel: [代码][代码]false[代码][代码],[代码][代码]//隐藏取消按钮[代码] [代码] [代码][代码]confirmText: [代码][代码]"确定更新"[代码][代码],[代码][代码]//只保留确定更新按钮[代码] [代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](res.confirm) {[代码] [代码] [代码][代码]//下载新版本,并重新应用[代码] [代码] [代码][代码]self.downLoadAndUpdate(updateManager)[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码] [代码] [代码][代码]// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示[代码] [代码] [代码][代码]wx.showModal({[代码] [代码] [代码][代码]title: [代码][代码]'提示'[代码][代码],[代码] [代码] [代码][代码]content: [代码][代码]'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]}[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码] [代码] [代码][代码]* 下载小程序新版本并重启应用[代码] [代码] [代码][代码]*/[代码] [代码] [代码][代码]downLoadAndUpdate: [代码][代码]function[代码] [代码](updateManager) {[代码] [代码] [代码][代码]var[代码] [代码]self = [代码][代码]this[代码] [代码] [代码][代码]wx.showLoading();[代码] [代码] [代码][代码]//静默下载更新小程序新版本[代码] [代码] [代码][代码]updateManager.onUpdateReady([代码][代码]function[代码] [代码]() {[代码] [代码] [代码][代码]wx.hideLoading()[代码] [代码] [代码][代码]//新的版本已经下载好,调用 applyUpdate 应用新版本并重启[代码] [代码] [代码][代码]updateManager.applyUpdate()[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]updateManager.onUpdateFailed([代码][代码]function[代码] [代码]() {[代码] [代码] [代码][代码]// 新的版本下载失败[代码] [代码] [代码][代码]wx.showModal({[代码] [代码] [代码][代码]title: [代码][代码]'已经有新版本了哟'[代码][代码],[代码] [代码] [代码][代码]content: [代码][代码]'新版本已经上线啦,请您删除当前小程序,重新搜索打开哟'[代码][代码],[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]},[代码]
2019-06-07 - 【全开源】多多客小程序发布 3.0.0-alpha.6,Koa+Vue+Taro 最佳实践
多多客(doodooke)是一款基于Koa+Vue+Taro开发,支持微信,百度,支付宝小程序的第三方SaaS平台。 本次重要更新 优化打赏不显示打赏人 新增登录的账号未绑定微信的情况下提示绑定微信 优化safari下页面组件样式问题 优化编译重启 优化消息推送小程序模板消息下架问题 优化客户管理在多小程序下显示问题 新增小程序客服引导 优化营销应用图标 新增订单导出功能 3.0新特性 支持migrations,可以快速的创建和修改表 支持rewrite,可以将请求转发到修改过的接口 支持view逻辑钩子,可以扩展vue逻辑 支持view视图钩子,可以扩展vue视图 支持cluster,可以启动多个项目 支持本地调试,可以将生产环境的请求转发或复制到本地 支持bin命令,可以快速的处理migration等 多多客官网:doodooke.com 3.0开源版立即下载:https://gitee.com/doodooke/doodoo
2019-04-09 - 新富文本组件
mp-html小程序富文本组件 news欢迎加入 QQ 交流群:699734691示例小程序添加获取组件包功能[图片] 功能介绍 支持在多个平台使用 支持丰富的标签(包括 table、video、svg 等) 支持丰富的事件效果(自动预览图片、链接处理等) 支持锚点跳转、长按复制等丰富功能 支持大部分 html 实体 丰富的插件(关键词搜索、内容编辑等) 效率高、容错性强且轻量化使用方法1. npm 方式 在项目根目录下执行 npm install mp-html 开发者工具中勾选 使用 npm 模块 并点击 工具 - 构建 npm 在需要使用页面的 json 文件中添加 { "usingComponents": { "mp-html": "mp-html" } } 在需要使用页面的 wxml 文件中添加 <mp-html content="{{html}}" /> 在需要使用页面的 js 文件中添加 Page({ onLoad() { this.setData({ html: 'Hello World!' }) } }) 2. 源码方式 将源码中的代码包(dist/mp-weixin)拷贝到 components 目录下,更名为 mp-html 在需要使用页面的 json 文件中添加 { "usingComponents": { "mp-html": "/components/mp-html/index" } } 后续步骤同上 获取github 链接:https://github.com/jin-yufeng/mp-html npm 链接:https://www.npmjs.com/package/mp-html 文档链接:https://jin-yufeng.gitee.io/mp-html
2022-03-04 - 有赞百亿级日志系统架构设计
一、概述 日志是记录系统中各种问题信息的关键,也是一种常见的海量数据。日志平台为集团所有业务系统提供日志采集、消费、分析、存储、索引和查询的一站式日志服务。主要为了解决日志分散不方便查看、日志搜索操作复杂且效率低、业务异常无法及时发现等等问题。 随着有赞业务的发展与增长,每天都会产生百亿级别的日志量(据统计,平均每秒产生 50 万条日志,峰值每秒可达 80 万条)。日志平台也随着业务的不断发展经历了多次改变和升级。本文跟大家分享有赞在当前日志系统的建设、演进以及优化的经历,这里先抛砖引玉,欢迎大家一起交流讨论。 二、原有日志系统 有赞从 16 年就开始构建适用于业务系统的统一日志平台,负责收集所有系统日志和业务日志,转化为流式数据,通过 flume 或者 logstash 上传到日志中心(kafka 集群),然后共 Track、Storm、Spark 及其它系统实时分析处理日志,并将日志持久化存储到 HDFS 供离线数据分析处理,或写入 ElasticSearch 提供数据查询。整体架构如图 2-1 所示。 [图片] 图2-1 原有日志系统架构 随着接入的应用的越来越多,接入的日志量越来越大,逐渐出现一些问题和新的需求,主要在以下几个方面: 业务日志没有统一的规范,业务日志格式各式各样,新应用接入无疑大大的增加了日志的分析、检索成本。 多种数据日志数据采集方式,运维成本较高。 日志平台收集了大量用户日志信息,当时无法直接的看到某个时间段,哪些错误信息较多,增加定位问题的难度。 存储方面: 采用了 Es 默认的管理策略,所有的 index 对应 3*2 shard(3 个 primary,3 个 replica),有部分 index 数量较大,对应单个 shard 对应的数据量就会很大,导致有 hot node,出现很多 bulk request rejected,同时磁盘 IO 集中在少数机器上; 对于 bulk request rejected 的日志没有处理,导致业务日志丢失; 日志默认保留 7 天,对于 ssd 作为存储介质,随着业务增长,存储成本过于高昂; 另外 Elasticsearch 集群也没有做物理隔离,Es 集群 oom 的情况下,使得集群内全部索引都无法正常工作,不能为核心业务运行保驾护航。 三、现有系统演进 日志从产生到检索,主要经历以下几个阶段:采集->传输->缓冲->处理->存储->检索,详细架构如图 3-1 所示 [图片] 图3-1 现有系统架构 3.1日志接入 日志接入目前分为两种方式,SDK 接入和调用 Http Web 服务接入 SDK 接入:日志系统提供了不同语言的 SDK,SDK 会自动将日志的内容按照统一的协议格式封装成最终的消息体,并最后最终通过 TCP 的方式发送到日志转发层(rsyslog-hub); Http Web 服务接入:有些无法使用 SDk 接入日志的业务,可以通过 Http 请求直接发送到日志系统部署的 Web 服务,统一由 web protal 转发到日志缓冲层的 kafka 集群。 3.2日志采集 [图片] 现在有 rsyslog-hub 和 web portal 做为日志传输系统,rsyslog 是一个快速处理收集系统日志的程序,提供了高性能、安全功能和模块化设计。之前系统演进过程中使用过直接在宿主机上部署 flume 的方式,由于 flume 本身是 java 开发的,会比较占用机器资源而统一升级为使用 rsyslog 服务。为了防止本地部署与 kafka 客户端连接数过多,本机上的 rsyslog 接收到数据后,不做过多的处理就直接将数据转发到 rsyslog-hub 集群,通过 LVS 做负载均衡,后端的 rsyslog-hub 会通过解析日志的内容,提取出需要发往后端的 kafka topic。 3.3日志缓冲 Kafka 是一个高性能、高可用、易扩展的分布式日志系统,可以将整个数据处理流程解耦,将 kafka 集群作为日志平台的缓冲层,可以为后面的分布式日志消费服务提供异步解耦、削峰填谷的能力,也同时具备了海量数据堆积、高吞吐读写的特性。 3.4日志切分 日志分析是重中之重,为了能够更加快速、简单、精确地处理数据。日志平台使用 spark streaming 流计算框架消费写入 kafka 的业务日志,Yarn 作为计算资源分配管理的容器,会跟不同业务的日志量级,分配不同的资源处理不同日志模型。 整个 spark 任务正式运行起来后,单个批次的任务会将拉取的到所有的日志分别异步的写入到 ES 集群。业务接入之前可以在管理台对不同的日志模型设置任意的过滤匹配的告警规则,spark 任务每个 excutor 会在本地内存里保存一份这样的规则,在规则设定的时间内,计数达到告警规则所配置的阈值后,通过指定的渠道给指定用户发送告警,以便及时发现问题。当流量突然增加,es 会有 bulk request rejected 的日志会重新写入 kakfa,等待补偿。 3.5日志存储 原先所有的日志都会写到 SSD 盘的 ES 集群,logIndex 直接对应 ES 里面的索引结构,随着业务增长,为了解决 Es 磁盘使用率单机最高达到 70%~80% 的问题,现有系统采用 Hbase 存储原始日志数据和 ElasticSearch 索引内容相结合的方式,完成存储和索引; Index 按天的维度创建,提前创建index会根据历史数据量,决定创建明日 index 对应的 shard 数量,也防止集中创建导致数据无法写入。现在日志系统只存近 7 天的业务日志,如果配置更久的保存时间的,会存到归档日志中; 对于存储来说,Hbase、Es 都是分布式系统,可以做到线性扩展。 四、多租户 随着日志系统不断发展,全网日志的 QPS 越来越大,并且部分用户对日志的实时性、准确性、分词、查询等需求越来越多样。为了满足这部分用户的需求,日志系统支持多租户的的功能,根据用户的需求,分配到不同的租户中,以避免相互影响。 [图片] 针对单个租户的架构如下: [图片] SDK:可以根据需求定制,或者采用天网的 TrackAppender 或 SkynetClient; Kafka 集群:可以共用,也可以使用指定 Kafka 集群; Spark 集群:目前的 Spark 集群是在 yarn 集群上,资源是隔离的,一般情况下不需要特地做隔离; 存储:包含 ES 和 Hbase,可以根据需要共用或单独部署 ES 和 Hbase。 五、现有问题和未来规划 目前,有赞日志系统作为集成在天网里的功能模块,提供简单易用的搜索方式,包括时间范围查询、字段过滤、NOT/AND/OR、模糊匹配等方式,并能对查询字段高亮显示,定位日志上下文,基本能满足大部分现有日志检索的场景,但是日志系统还存在很多不足的地方,主要有: 缺乏部分链路监控:日志从产生到可以检索,经过多级模块,现在采集,日志缓冲层还未串联,无法对丢失情况进行精准监控,并及时推送告警。 现在一个日志模型对应一个 kafka topic,topic 默认分配三个 partition,由于日志模型写入日志量上存在差异,导致有的 topic 负载很高,有的 topic 造成一定的资源浪费,且不便于资源动态伸缩。topic 数量过多,导致partition 数量过多,对 kafka 也造成了一定资源浪费,也会增加延迟和 Broker 宕机恢复时间。 目前 Elasticsearch 中文分词我们采用 ikmaxword,分词目标是中文,会将文本做最细粒度的拆分,但是日志大部分都是英文,分词效果并不是很好。 上述的不足之处也是我们以后努力改进的地方,除此之外,对于日志更深层次的价值挖掘也是我们探索的方向,从而为业务的正常运行保驾护航。 文末福利 4月27日(周六)下午13:30 有赞技术中间件团队联合Elastic中文社区 围绕Elastic的开源产品及周边技术 在杭州举办一场线下技术交流活动 本次活动免费开放,限额200名 扫描下图二维码,回复“报名”即可参加 [图片] 欢迎参加,咱们一起聊聊~
2019-04-15