首页 文章 精选 留言 我的

精选列表

搜索[增删改查],共8589篇文章
优秀的个人博客,低调大师

涂鸦科技:支撑从零暴数十亿数据的背后,竟无专职运维!

直播视频 (点击图片查看视频) 幻灯下载地址: https://oss.aliyuncs.com/yqfiles/76d3bb80d4a9da17ababada8f56ecd8b.pdf 3月23日云栖社区在线实时分享顺利结束,本次由涂鸦科技技术总监柯都敏分享了涂鸦科技云上架构设计和借助阿里云实现轻运维高可用性监控的实战经验,同时也介绍了网络安全、权限控制等特定场景下如何利用阿里云产品解决特定的问题题。本次视频直播的整理文章、视频、幻灯片整理完毕,如下内容。 架构演变历程 初创公司的团队刚起步时一般规模都不是很大,并且成员能力各异,而且为了公司的长远发展,初始的架构需要设计的尽可能优秀。因此在设计时需要考虑到架构性能、扩展、代码安全、测试等等问题。 图一 第一代轻架构 在涂鸦科技设计第一代架构时,业务量并不是很大。在设计之初,对整个架构进行了简

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

通义灵码用户说 | 编程智能体+MCP加持,秒附近蜜雪冰城

通义灵码现在已经全面支持 Qwen3,并支持智能体模式,具备自主决策、环境感知、工具使用等能力,可以根据开发者的编码诉求,使用工程检索、文件编辑、终端等工具,可以端到端地完成编码任务。同时,支持开发者配置 MCP 工具,编码更加贴合开发者工作流程。 同时,支持同一个会话流中切换智能问答、文件编辑、智能体模式,开发者在会话过程中,无需新建会话即可根据诉求自由切换会话模式。 近期,通义灵码上线了 AI IDE,小编就抢先体验了一把! 下面带大家详细了解和体验下通义灵码 AI IDE 的部分功能: 1、问答和自动补全 通义灵码经过海量优秀开源代码数据训练,可根据当前代码文件及跨文件的上下文,为您生成行级/函数级代码、单元测试、代码优化建议等。沉浸式编码心流,秒级生成速度,让用户更专注在技术设计,高效完成编码工作。 2、智能体/文件编辑 智能体模式具备自主决策、环境感知、工具使用等能力,可以根据开发者的编码诉求,使用工程检索、文件编辑、终端等工具,可以端到端完成编码任务。同时,支持开发者配置 MCP 工具,编码更加贴合开发者工作流程。 输入框输入 # ,可触发上下文选择窗口,进行文件检索,同时支持多种不同的文件类型操作。 3、行间对话 行间会话(Inline Chat)支持开发者在代码编辑器区域进行对话,可以通过自然语言对话的方式进行单个文件内的代码修改或进行即时提问,代码生成。 快捷键:⌘ ⇧ I(Ctl Shift I)直接唤起会话窗口 唤起行间会话窗口后,输入需求描述后可以进行两种模式与通义灵码互动: 行间编辑(Edit):在会话窗口中输入需求描述后,输入 Enter(Ctrl Enter),通义灵码可根据需求内容、选择的代码片段、相关上下文等,对当前代码文件进行修改; 行间问答(Ask):在会话窗口中输入需求描述后,输入⌘ Enter(Ctrl Enter),可直接进行问答。 通义灵码新增 Inline Chat 能力,开发者在代码编辑区直接对话,问题即时解决 4、MCP工具 通义灵码借助MCP标准化接口的支持,可以灵活扩展与不同数据源链接,使其智能体能力更大强大,场景更加丰富,可以满足更多个性化的需求。 用户可以选择连接现有的MCP服务或自行开发专属的 MCP 服务,例如魔搭社区 MCP 市场、Higress MCP 市场等热门市场,已经提供了丰富的 MCP 服务,可以自行探索发现更多符合您需求的解决方案,加速项目开发与创新。 手动添加一个高德MCP服务: { "mcpServers": { "amap-amap-sse": { "url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key" } } } 使用时需要切换回智能体,搜下我家附近有几家蜜雪冰城。 5、记忆能力 通义灵码提供了长期记忆能力,在开发者与通义灵码的对话过程,会逐渐形成针对开发者个人、工程、问题等相关的丰富记忆,并自动进行相关的记忆整理和更新。 可通过单击「用户名」-「个人设置」-「记忆管理」,查看已经形成的记忆内容、作用范围等。同时,对于不需要的记忆,可以进行删除。 让通义灵码越用越懂你?使用记忆功能,打造你的专属编程搭档 6、智能预测(NES 功能) NES 智能预测技术,是通义灵码特有的功能,能够预测开发者下一步可能编辑的代码位置,并自动生成建议代码,可以快速的迭代项目,减少手动操作。该功能默认是开启状态。 在 IDE 中选择Settings > Lingma,在 NES Settings 中启用 Enable NES(Next Edit Suggestion)。该功能默认处于关闭状态;启用后,推荐方式默认为 Auto,Code Shifting 配置项默认为 No。 设置推荐方式时,提供三种选择: Inline 、 Side by Side 和 Auto 。当选择Inline 或 Auto 时,将出现 Code Shifting 配置项,而选择 Side by Side 时则不会出现,Code Shifting 用于控制是否会通过移动代码在行间腾出空间,以便显示代码建议。请根据以下方式说明选择您所需的方式: Auto(默认):Auto 方式会根据场景自行选择 Inline 、 Side by Side 方式,当存在变更代码的像素宽度和 NES 提示的像素宽度大于编辑器可视区域宽度,展示为 Inline,否则展示为 Side by Side。 Inline:当 NES 开关开启,且方式选择为 Inline,根据用户配置是否使用下浮效果(即通过移动代码在行间腾出空间)。 上新功能!通义灵码行间建议预测 NES 使用方法 最后 AI编程现在不在单纯的只是"辅助工具",而是一款帮助你提高开发效率亲密伙伴,他更懂你的开发习惯。通义灵码 AI IDE 通过AI重构编程流程,将重复性的工作自动化,彻底释放开发者的创造力。 想要抢先体验的小伙伴,可以通过下面的链接下载体验了!! 下载:https://lingma.aliyun.com/download 文档:https://help.aliyun.com/zh/lingma/product-overview/introduction-of-lingma 用户原文:体验了下这款国产AI IDE,彻底放弃IDEA

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

漏补缺,这些热门开源项目你都知道么?「GitHub 热点速览」

本期热点速览的周榜部分的项目,基本上每周都会在 GitHub Trending 见到它们的身影,因为它们实在太火了。一般来说,这些火爆的项目大家都耳熟能详,但是为了防止有些小伙伴不怎么逛 GitHub,以及并没有翻阅之前的月刊或者是热点速览。借着这个大家不怎么搞新项目的假期,索性收集下常见的 5 个开源项目,如果你认识这些项目,就当温故知新了。 在本周特推部分,依旧是 2 个新晋热榜项目,一个用 Go 写 HTML,一个则是想搞定 Postman 的 API 工具。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 1. 本周特推 1.1 用 Go 写 HTML:templ 1.2 API 神器:bruno 2. GitHub Trending 周榜 2.1 从零构建你的技术栈:build-your-own-x 2.2 Windows 激活:Microsoft-Activation-Scripts 2.3 你的 App 服务:appwrite 2.4 代码格式化:black 2.5 Windows 实用集:PowerToys 3. HelloGitHub 热评 3.1 自定义屏幕点击:gkd 3.2 菜单栏番茄时钟:TomatoBarz 4. 往期回顾 1. 本周特推 1.1 用 Go 写 HTML:templ 主语言:Go New templ 一个适用于 Go 语言的 HTML 模板语言,你可以在 Go 中编写 HTML。 GitHub 地址→https://github.com/a-h/templ 1.2 API 神器:bruno 主语言:JavaScript New Bruno 是一个开源的 IDE,可以用来探索、测试 API。作为一个创新 API 客户端,它希望改变 Postman 及其类似 API 工具的现状。它会将集合存储在文件系统的文件夹中,并用纯本文标记语言 Bru 来保存相关的 API 请求。 Bruno 只支持离线使用,并没有打算添加云同步功能。为了保护数据安全,Bruno 会将数据保留在你的设备上,而非云端。 GitHub 地址→https://github.com/usebruno/bruno 2. GitHub Trending 周榜 2.1 从零构建你的技术栈:build-your-own-x 本周 star 增长数 2,050+ 正如项目所说,这个项目合集是为了让你从零开始,逐步学会某门技术。作为一个实操中掌握技术的项目,build-your-own-x 可以让你搞定 3D 渲染、搭建自己的机器人,做一个自己的数据库等等。 GitHub 地址→https://github.com/codecrafters-io/build-your-own-x 2.2 Windows 激活:Microsoft-Activation-Scripts 本周 star 增长数:1,100+ 有了 Microsoft-Activation-Scripts,激活 Windows 和 Office 不再是问题。它注重开源、减少反病毒软件的检测,这个用到 HWID、Ohook、KMS38、在线 KMS 激活方法的工具,一定能帮你解决 Windows 的激活问题。 GitHub 地址→https://github.com/massgravel/Microsoft-Activation-Scripts 2.3 你的 App 服务:appwrite 本周 star 增长数:2,250+,主语言:TypeScript、PHP 一个适用于 Flutter、Vue、Angular、React、iOS、Android 的完整后端服务。Appwrite 基于 Docker 提供的微服务库可应用于网页端,移动端,以及后端。Appwrite 支持用户验证、外部授权、用户数据读写检索、文件储存、图像处理、云函数计算等多种服务,此外它提供了可视化界面,方便开发者高效地开发应用. GitHub 地址→https://github.com/appwrite/appwrite 2.4 代码格式化:black 本周 star 增长数:1,850+,主语言:Python 一个绝对不向不规范妥协的代码格式化库 black,你无需手动调整代码格式,交给 black,它会帮你格式化你的 Python 代码。经过 Black 格式化过的代码保证了风格统一,你只需要专注代码编写便好。 # in: def very_important_function(template: str, *variables, file: os.PathLike, engine: str, header: bool = True, debug: bool = False): """Applies `variables` to the `template` and writes to `file`.""" with open(file, 'w') as f: ... # out: def very_important_function( template: str, *variables, file: os.PathLike, engine: str, header: bool = True, debug: bool = False, ): """Applies `variables` to the `template` and writes to `file`.""" with open(file, "w") as f: ... GitHub 地址→https://github.com/psf/black 2.5 Windows 实用集:PowerToys 本周 star 增长数:1,700+,主语言:C#、C++ Microsoft PowerToys 是一套实用工具,希望提升进阶用户的 Windows 使用体验,提高工作效率。 GitHub 地址→https://github.com/microsoft/PowerToys 3. HelloGitHub 热评 在这个章节,我们将会分享下本周 HelloGitHub 网站上的热评项目,HG 开源项目评价体系刚上线不久,期待你的评价。 3.1 自定义屏幕点击:gkd 主语言:Kotlin 该项目是基于无障碍功能的手机自动点击工具,支持自定义或订阅点击规则,可用来自动完成点击跳过广告、同意按钮、领红包等操作。 HG 评价地址→https://hellogithub.com/repository/9fa01263b1eb408596722394362ec55b 3.2 菜单栏番茄时钟:TomatoBarz 主语言:Swift 这是一款 macOS 上的番茄时钟应用,它小巧精致、界面简洁,支持设置工作和休息间隔、提示音、全局热键等功能。 HG 评价地址→https://hellogithub.com/repository/0984b4e33d9546eb9275470a339352a9 4. 往期回顾 往期回顾: 后浪搞的在线版 Windows 12「GitHub 热点速览」 什么是 x10 开发工具?「GitHub 热点速览」 以上为 2023 年第 38 个工作周的 GitHub Trending 🎉如果你 Pick 其他好玩、实用的 GitHub 项目,来 HelloGitHub 和大家一起分享下哟 🌝

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

Bee 2.1.8 支持 Spring Boot 3.0.11,支持 active 命令行,支持多改增删

天下大势,分久必合!Hibernate/MyBatis+ plus +Sharding JDBC + Jpa+ Spring data+ GraphQL+ App ORM (Android, 鸿蒙)= Bee Spring Cloud 微服务使用数据库更方便:Bee + Spring Boot; 轻松支持多数据源,Sharding,Mongodb. 要整合一堆的工具,还不如只用一个小巧又功能强大的工具。犹如 JAVA 界的数据源连接池 Hikari, 文件虽小,功能却不赖! Bee2.1.8整合Spring-bootboot3.0.11 Spring Cloud 微服务使用数据库更方便:Bee + Spring Boot; 轻松支持多数据源,Sharding,Mongodb. 更快的开发 Spring Cloud 微服务的新组合,Bee 整合 Spring Boot, 让你瞬间拥有两样快速开发利器! ORM BeeSharding 分库分表就是那么简单,对开发透明,不影响业务,简单易用,文件小,性能好;支持 Mongodb,支持JDBC,还支持Android 和 Harmony;可以同时使用多种不同类型的数据库。 Bee,互联网新时代的 Java ORM 工具,更快、更简单、更自动,开发速度快,运行快,更智能 Spring Boot是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot可以帮助我们进行快速应用开发。 并且提供 bee-spring-boot-starter. maven 依赖: <!-- https://mvnrepository.com/artifact/org.teasoft/bee-spring-boot --> <dependency> <groupId>org.teasoft</groupId> <artifactId>bee-spring-boot</artifactId> <version>2.1.8.boot3.0.11</version> </dependency> gradle: implementation group: 'org.teasoft', name: 'bee-spring-boot', version: '2.1.8.boot3.0.11' 直接使用相应 starter: <dependency> <groupId>org.teasoft</groupId> <artifactId>bee-spring-boot-starter</artifactId> <version>2.1.8.boot3.0.11</version> <type>pom</type> </dependency> Bee 还整合了 spring boot 的其它版本, https://mvnrepository.com/artifact/org.teasoft/bee-spring-boot V2.1.8(2023.中秋版·LTS版) 1.1 兼容spring boot命令行active选择环境, 如:java -jar springbootDemo.jar --spring.profiles.active=dev,会觖发bee-dev.properties 1.2 兼容spring boot数据源配置,如spring.datasource.url 1.3 不启动应用,直接运行main方法,bee.properties没有配置数据源时,也可以使用application.properties的spring boot单数据源配置 2.多表关联插入,更新,删除 3.DateUtil增加判断日期格式,计算年龄 4.通过Excel创建表,支持更多数据库 5.提供默认的BeeSimpleDataSource,支持在bee.properties里配置多数据源(不使用spring boot时,也可以), 不使用Spring boot,单独使用Bee时,DataSourceBuilderFactory 也能自启动。 6.Javabean支持生成Swagger注解 7.MongodbObjSQLRichExt完善拦截器及上下文信息管理 8.Mongodb打印日志,查询所有字段时,默认不显示要查询的字段;可以通过bee.osql.showMongoSelectAllFields配置控制是否显示 9.GridFs注解支持SELECT查询类型,当查询实体时,可以自动关联查出相应的文件(MongoDB),GridFs文件类型支持byte[] 10.修复 bug. V2.1.8 https://www.oschina.net/news/258983/bee-2-1-8-released demo工程: https://gitee.com/automvc/bee-starter-demo 主要接口少,使用简单,学习成本低 主要的面向对象和自定义 sql, 存储过程的接口: 性能好: 部分应用实例展示: 下期功能预告: 你还想添加什么功能,请到评论区告诉我们! 码云上的项目首页: https://gitee.com/automvc/bee-springboot https://gitee.com/automvc/bee github: https://github.com/automvc/bee

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

净利劲10%:中国联通“三板斧”如何做到斧斧到位?

2020年是充满挑战的一年,对于运营商来说,日子也不好过。中国联通董事长兼首席执行官王晓初坦诚,2020年疫情对公司经营带来一定挑战,特别是在业务拓展、新用户发展、5G建设和坏账风险等方面。但疫情加速经济数字化的转型升级需求,也为中国联通带来新商机。 中国联通在港交所公布的2020年全年业绩显示,中国联通报告期内实现服务收入2758亿元,同比上升4.3%;净利润达125亿元,同比增长10.3%。从反转到领先,再次上演的精彩戏码也进一步彰显出中国联通的创新力。 开源节流“三板斧”,斧斧到位 财报显示,2020年中国联通资本开支总额为676亿元,低于年初预计的700亿元,自由现金流保持强劲,达到379亿元,同比上升约43.56%。这与中国联通的共建共享,精准投入和价值经营“三板斧”策略紧密相关。 共建共享,纵深挺进。王晓初表示,公司2020年投入5G资本开支约为340亿元,与中国电信完成新增共建共享5G基站约30万个,使5G总基站规模达到38万个,历史上首次实现覆盖规模与主导运营商基本相当。共建共享已累计为双方公司节省网络建设成本超过760亿元,网络运营成本大幅降低,并大大缩短了网络建设周期。 其实不止5G建设,中国联通与中国电信在共建共享方面的合作加速向“纵深”挺进。在4G网络方面,新增4G共享基站17万座,双方共节省投资90亿元,加大探索推进农村、室分一张4G网的力度。 在基础资源方面,双方累计共建共享骨干光缆7000多公里、杆路4.1万公里、 管道2.1万公里,双方共节省投资22亿元,推进杆路、管道等传输资源共建共享共维。 网业协同,精准投入。财报显示,2020年中国联通在资本开支方面强化网业协同,紧跟市场需求,动态精准投入。2020年中国联通676亿元开支中,移动网络,固网宽带及数据基础设施、传输网及其他三方面的占比分别为56%、29%和15%,有效支撑业务转型,并取得明显成效。 5G/4G/传输/基础设施方面将加强共建共享和存量资源优化共享;2G/3G网减频精简,降低网运成本,重耕频谱资源;加速网络SDN化、NFV化、云化和智能化。IP骨干、智能城域及OTN基本已实现100% SDN化,5G核心网已实现100%NFV化 。固网宽带方面以千兆接入为重点,北方保持领先,南方通过社会化合作提升规模和利用率。 值得注意的是,中国联通预期2021年资本开支为700亿,其中5G开支约350亿,占比七成。在开支方面,中国联通将延续这一策略,移动网络,固网宽带及数据基础设施、传输网及其他三方面的占比也将继续优化为57%、29%和14%。 张弛有度,价值经营。在成本管控方面,中国联通高效管控营销费用,促进价值经营。 财报显示,2020年中国联通的销售费用仅为304.61亿元,同比下降9.2%;主要益于中国联通紧跟效益和价值配置资源,自律理性规范竞争;加强数字化转型,线上线下一体化协同发展;利用大数据分析,赋能精准营销和存量保有;推动平台型异业合作规模发展;将打造大流量APP,持续提升数字化获客能力。 在雇员薪酬及福利方面,中国联通的开支大幅提升,达到557.4亿元,同比增10.3%,主要由于公司持续推进激励机制改革,强化激励与绩效挂钩,同时加大引入创新人才。此外,中国联通还利用AI技术实现智能监控巡检、故障处理、基站和IDC节能,2020 节约成本超过2亿元。 业务稳中有进,5G开支2023年会有下降 财报显示,2020年中国联通固网创新业务两开花,移动业务动力也止负转正。 中国联通2020年固网宽带接入收入同比增长2.4%,达到人民币426亿元。固网宽带用户净增262万户,总数达到8610万户。融合业务在固网宽带用户中的渗透率达到64%,同比提升5个百分点。 2020年,中国联通自主能力稳步提升,创新业务发展根基不断夯实。年内,产业互联网业务收入同比增长30.0%,达到427亿元,占整体服务收入比例提高至15.5%。其中ICT业务收入人民币134亿元,同比增长33.4%;IDC及云计算业务收入达到人民币234亿元,同比增长26.1%;物联网业务及大数据业务收入分别达到42亿元和17亿元,同比分别增长39.0%和39.8%。受创新业务和固网宽带业务良好增长拉动,中国联通固网服务收入达到人民币1169亿元,同比增长10.6%。 值得强调的是,2020年中国联通移动业务发展动力持续释放,移动服务收入及用户ARPU已连续三个季度双双环比上升。2020年,中国联通的移动服务收入达到1567亿元,同比止负转正;移动用户ARPU达到42.1元,同比提升4.1%;手机上网总流量增长16.5%,手机用户月户均数据流量达到约9.7GB。 在业界说明会上,王晓初表示,截至去年年底,5G用户的ARPU在70元左右,预计随着新增用户的增加,未来5G的ARPU值会略微有所下降,但是可以肯定的是,明年从3G、4G用户转至5G用户的总体ARPU值会提升超过10%。 2020年是5G大规模发展元年。中国联通紧抓时机,将价值经营和服务体验贯穿始终,推动5G业务规模发展。年内,中国联通5G套餐用户达到7083万户,5G套餐用户渗透率达到23%,高于行业平均的 20%。 随着5G网络覆盖进一步完善,以VR/AR游戏、高清4K/8K视频为代表的应用场景不断优化,终端渗透率持续提高,中国联通将努力推动5G用户继续快速提升,有效带动移动业务持续健康发展。 在谈到5G未来的投资趋势时,王晓初表示,2020~2022年基本维持700亿左右的投资,其中5G的投资占到350亿左右,持续3年后,5G的投资就将开始进入下降阶段。除非5G话务量找到新的突破点引发5G流量的迅速上升,那样的话会再进行及时地调整。 “我们希望通过5G建设能迅速把5G应用抓上去,主要是产业互联网领域,我们目前已经在6个行业逐步形成了自有的产品,包括医疗、教育等等,促使了云收入增长达到约63%。此外,在5G公众市场上,除了正常的流量供给之外,逐步形成广泛应用。”

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

3月数据库流行度排行 图型数据库2年500%

新的一年,我们继续关注美国数据库知识网站DB-engines发布的数据库流行度排行榜。三月的榜单可以说是平淡无奇,前十名的名次都没有变化。从积分上来看,只有Oracle增长了近30个积分,变化较大。可能受到了Oracle新一代集成系统发布的影响吧。 2015年3月数据库流行度排行榜 但是从数据库类型上看,回顾历史,我们会得到惊人的发现。下面是自2013年2月开始,不同数据库类型的发展情况。从图表中可以明显地看出,图型数据库一马当先,在过去两年里,增长幅度高达5倍。研究机构Forrester最近的一项报告也预言,到2017年,图型数据库将占企业的25%。 数据库类型发展表 在数据库流行度排行榜中,位列前三的图型数据库分别是Neo4J(No.23),Titan(No.53),OrientDB(No.63)。 图型数据库新闻回顾 2015年1月,Neo4J宣布新增2千万美元投资。 2015年1月,Datastax收购TitanDB背后的Aurelius公司,计划将图形数据库模型和Apache Cassandra,Solr一道融合进自己的企业级数据库平台。 一些主要的关系型数据库厂商已经宣布在旗舰级产品中支持图形数据库模型,比如Oracle和DB2都全面支持图形数据库模型RDF。 附:DB-Engines的排名主要根据5个因素来进行:Google以及Bing搜索引擎的关键字搜索数量、Google Trends的搜索数量、Indeed网站中的职位搜索量、LinkedIn中提到关键字的个人资料数以及Stackoverflow上相关的问题和关注者数量。 原文链接:http://www.searchdatabase.com.cn/showcontent_88014.htm

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

每日一博 | 还在用 ES 日志吗,快看看石墨文档 Clickhouse 日志架构玩法

1 背景 石墨文档全部应用部署在Kubernetes上,每时每刻都会有大量的日志输出,我们之前主要使用SLS和ES作为日志存储。但是我们在使用这些组件的时候,发现了一些问题。 成本问题: SLS个人觉得是一个非常优秀的产品,速度快,交互方便,但是SLS索引成本比较贵 我们想减少SLS索引成本的时候,发现云厂商并不支持分析单个索引的成本,导致我们无法知道是哪些索引构建的不够合理 ES使用的存储非常多,并且耗费大量的内存 通用问题: 如果业务是混合云架构,或者业务形态有SAAS和私有化两种方式,那么SLS并不能通用 日志和链路,需要用两套云产品,不是很方便 精确度问题:SLS存储的精度只能到秒,但我们实际日志精度到毫秒,如果日志里面有traceid,SLS中无法通过根据traceid信息,将日志根据毫秒时间做排序,不利于排查错误 我们经过一番调研后,发现使用Clickhouse能够很好的解决以上问题,并且Clickhouse省存储空间,非常省钱,所以我们选择了Clickhouse方案存储日志。但当我们深入研究后,Clickhouse作为日志存储有许多落地的细节,但业界并没有很好阐述相关Clickhouse采集日志的整套流程,以及没有一款优秀的Clickhouse日志查询工具帮助分析日志,为此我们写了一套Clickhouse日志系统贡献给开源社区,并将Clickhouse的日志采集架构的经验做了总结。先上个Clickhouse日志查询界面,让大家感受下石墨最懂前端的后端程序员。 2 架构原理图 我们将日志系统分为四个部分:日志采集、日志传输、日志存储、日志管理。 日志采集:LogCollector采用Daemonset方式部署,将宿主机日志目录挂载到LogCollector的容器内,LogCollector通过挂载的目录能够采集到应用日志、系统日志、K8S审计日志等 日志传输:通过不同Logstore映射到Kafka中不同的Topic,将不同数据结构的日志做了分离 日志存储:使用Clickhouse中的两种引擎数据表和物化视图 日志管理:开源的Mogo系统,能够查询日志,设置日志索引,设置LogCollector配置,设置Clickhouse表,设置报警等 以下我们按照这四大部分,阐述其中的架构原理 3 日志采集 3.1 采集方式 Kubernetes容器内日志收集的方式通常有以下三种方案 DaemonSet方式采集:在每个 node 节点上部署LogCollector,并将宿主机的目录挂载为容器的日志目录,LogCollector读取日志内容,采集到日志中心。 网络方式采集:通过应用的日志 SDK,直接将日志内容采集到日志中心 。 SideCar方式采集:在每个 pod 内部署LogCollector,LogCollector只读取这个 pod 内的日志内容,采集到日志中心。 以下是三种采集方式的优缺点: DaemonSet方式 网络方式 SideCar方式 采集日志类型 标准输出+文件 应用日志 部署运维 一般,维护DaemonSet 低,维护配置文件 日志分类存储 可通过容器/路径等映射 业务独立配置 支持集群规模 取决于配置数 无限制 适用场景 日志分类明确、功能较单一 性能要求极高的场景 资源消耗 中 低 我们主要采用DaemonSet方式和网络方式采集日志。DaemonSet方式用于ingress、应用日志的采集,网络方式用于大数据日志的采集。以下我们主要介绍下DeamonSet方式的采集方式。 ​ 3.2 日志输出 从上面的介绍中可以看到,我们的DaemonSet会有两种方式采集日志类型,一种是标准输出,一种是文件。 引用元乙的描述:虽然使用 Stdout 打印日志是 Docker 官方推荐的方式,但大家需要注意:这个推荐是基于容器只作为简单应用的场景,实际的业务场景中我们还是建议大家尽可能使用文件的方式,主要的原因有以下几点: Stdout 性能问题,从应用输出 stdout 到服务端,中间会经过好几个流程(例如普遍使用的JSON LogDriver):应用 stdout -> DockerEngine -> LogDriver -> 序列化成 JSON -> 保存到文件 -> Agent 采集文件 -> 解析 JSON -> 上传服务端。整个流程相比文件的额外开销要多很多,在压测时,每秒 10 万行日志输出就会额外占用 DockerEngine 1 个 CPU 核; Stdout 不支持分类,即所有的输出都混在一个流中,无法像文件一样分类输出,通常一个应用中有 AccessLog、ErrorLog、InterfaceLog(调用外部接口的日志)、TraceLog 等,而这些日志的格式、用途不一,如果混在同一个流中将很难采集和分析; Stdout 只支持容器的主程序输出,如果是 daemon/fork 方式运行的程序将无法使用 stdout; 文件的 Dump 方式支持各种策略,例如同步/异步写入、缓存大小、文件轮转策略、压缩策略、清除策略等,相对更加灵活。 从这个描述中,我们可以看出在docker中输出文件在采集到日志中心是一个更好的实践。所有日志采集工具都支持采集文件日志方式,但是我们在配置日志采集规则的时候,发现开源的一些日志采集工具,例如fluentbit、filebeat在DaemonSet部署下采集文件日志是不支持追加例如pod、namespace、container_name、container_id等label信息,并且也无法通过这些label做些定制化的日志采集。 agent类型 采集方式 daemonset部署 sidecar部署 ilogtail 文件日志 能够追加label信息,能够根据label过滤采集 能够追加label信息,能够根据label过滤采集 fluentbit 文件日志 无法追加label信息,无法根据label过滤采集 能够追加abel信息,能够根据label过滤采集 filebeat 文件日志 无法追加label信息,无法根据label过滤采集 能够追加label信息,能够根据label过滤采集 ilogtail 标准输出 能够追加label信息,能够根据label过滤采集 能够追加label信息,能够根据label过滤采集 fluentbit 标准输出 能够追加label信息,能够根据label过滤采集 能够追加abel信息,能够根据label过滤采集 filebeat 标准输出 能够追加label信息,能够根据label过滤采集 能够追加label信息,能够根据label过滤采集 基于无法追加label信息的原因,我们暂时放弃了DeamonSet部署下文件日志采集方式,采用的是基于DeamonSet部署下标准输出的采集方式。 ​ 3.3 日志目录 以下列举了日志目录的基本情况 目录 描述 类型 /var/log/containers 存放的是软链接,软链到/var/log/pods里的标准输出日志 ​标准输出 /var/log/pods 存放标准输出日志 ​标准输出 /var/log/kubernetes/ master存放Kubernetes 审计输出日志 标准输出 /var/lib/docker/overlay2 存放应用日志文件信息 文件日志 /var/run 获取docker.sock,用于docker通信 文件日志 /var/lib/docker/containers 用于存储容器信息 两种都需要 因为我们采集日志是使用的标准输出模式,所以根据上表我们的LogCollector只需要挂载/var/log,/var/lib/docker/containers两个目录。 3.3.1 标准输出日志目录 应用的标准输出日志存储在/var/log/containers目录下,​文件名是按照K8S日志规范生成的。这里以nginx-ingress的日志作为一个示例。我们通过ls /var/log/containers/ | grep nginx-ingress指令,可以看到nginx-ingress的文件名。 nginx-ingress-controller-mt2wx_kube-system_nginx-ingress-controller-be3741043eca1621ec4415fd87546b1beb29480ac74ab1cdd9f52003cf4abf0a.log ​ 我们参照K8S日志的规范:/var/log/containers/%{DATA:pod_name}_%{DATA:namespace}_%{GREEDYDATA:container_name}-%{DATA:container_id}.log。可以将nginx-ingress日志解析为: pod_name:nginx-ingress-controller-mt2w namespace:kube-system container_name:nginx-ingress-controller container_id:be3741043eca1621ec4415fd87546b1beb29480ac74ab1cdd9f52003cf4abf0a 通过以上的日志解析信息,我们的LogCollector 就可以很方便的追加pod、namespace、container_name、container_id的信息。 ​ 3.3.2 容器信息目录 应用的容器信息存储在/var/lib/docker/containers目录下,目录下的每一个文件夹为容器ID,我们可以通过cat config.v2.json获取应用的docker基本信息。 3.4 LogCollector采集日志 3.4.1 配置 我们LogCollector采用的是fluent-bit,该工具是cncf旗下的,能够更好的与云原生相结合。通过Mogo系统可以选择Kubernetes集群,很方便的设置fluent-bit configmap的配置规则。 3.4.2 数据结构 ​fluent-bit的默认采集数据结构 @timestamp字段:string or float,用于记录采集日志的时间 log字段:string,用于记录日志的完整内容 Clickhouse如果使用@timestamp的时候,因为里面有@特殊字符,会处理的有问题。所以我们在处理fluent-bit的采集数据结构,会做一些映射关系,并且规定双下划线为Mogo系统日志索引,避免和业务日志的索引冲突。 _time_字段:string or float,用于记录采集日志的时间 _log_字段:string,用于记录日志的完整内容 例如你的日志记录的是{"id":1},那么实际fluent-bit采集的日志会是{"_time_":"2022-01-15...","_log_":"{\"id\":1}" 该日志结构会直接写入到kafka中,Mogo系统会根据这两个字段_time_、_log_设置clickhouse中的数据表。 3.4.3 采集 如果我们要采集ingress日志,我们需要在input配置里,设置ingress的日志目录,fluent-bit会把ingress日志采集到内存里。 然后我们在filter配置里,将log改写为_log_ 然后我们在ouput配置里,将追加的日志采集时间设置为_time_,设置好日志写入的kafka borkers和kafka topics,那么fluent-bit里内存的日志就会写入到kafka中 日志写入到Kafka中_log_需要为json,如果你的应用写入的日志不是json,那么你就需要根据fluent-bit的parser文档,调整你的日志写入的数据结构:https://docs.fluentbit.io/manual/pipeline/filters/parser 4 日志传输 Kafka主要用于日志传输。上文说到我们使用fluent-bit采集日志的默认数据结构,在下图kafka工具中我们可以看到日志采集的内容。 在日志采集过程中,会由于不用业务日志字段不一致,解析方式是不一样的。所以我们在日志传输阶段,需要将不同数据结构的日志,创建不同的Clickhouse表,映射到Kafka不同的Topic。这里以ingress为例,那么我们在Clickhouse中需要创建一个ingress_stdout_stream的Kafka引擎表,然后映射到Kafka的ingress-stdout Topic里。 5 日志存储 我们会使用三种表,用于存储一种业务类型的日志。 Kafka引擎表:将数据从Kafka采集到Clickhouse的ingress_stdout_stream数据表中 createtablelogger.ingress_stdout_stream ( _source_String, _pod_name_String, _namespace_String, _node_name_String, _container_name_String, _cluster_String, _log_agent_String, _node_ip_String, _time_Float64, _log_String ) engine=KafkaSETTINGSkafka_broker_list='kafka:9092',kafka_topic_list='ingress-stdout',kafka_group_name='logger_ingress_stdout',kafka_format='JSONEachRow',kafka_num_consumers=1; 物化视图:将数据从ingress_stdout_stream数据表读取出来,_log_根据Mogo配置的索引,提取字段在写入到ingress_stdout结果表里 CREATEMATERIALIZEDVIEWlogger.ingress_stdout_viewTOlogger.ingress_stdoutAS SELECT toDateTime(toInt64(_time_))AS_time_second_, fromUnixTimestamp64Nano(toInt64(_time_*1000000000),'Asia/Shanghai')AS_time_nanosecond_, _pod_name_, _namespace_, _node_name_, _container_name_, _cluster_, _log_agent_, _node_ip_, _source_, _log_AS_raw_log_,JSONExtractInt(_log_,'status')ASstatus,JSONExtractString(_log_,'url')ASurl FROMlogger.ingress_stdout_streamwhere1=1; 结果表:存储最终的数据 createtablelogger.ingress_stdout ( _time_second_DateTime, _time_nanosecond_DateTime64(9,'Asia/Shanghai'), _source_String, _cluster_String, _log_agent_String, _namespace_String, _node_name_String, _node_ip_String, _container_name_String, _pod_name_String, _raw_log_String, statusNullable(Int64), urlNullable(String), ) engine=MergeTreePARTITIONBYtoYYYYMMDD(_time_second_) ORDERBY_time_second_ TTLtoDateTime(_time_second_)+INTERVAL7DAY SETTINGSindex_granularity=8192; 6 总结流程 日志会通过fluent-bit的规则采集到kafka,在这里我们会将日志采集到两个字段里 _time_字段用于存储fluent-bit采集的时间 _log_字段用于存放原始日志 通过mogo,在clickhouse里设置了三个表 app_stdout_stream: 将数据从Kafka采集到Clickhouse的Kafka引擎表 app_stdout_view: 视图表用于存放mogo设置的索引规则 app_stdout:根据app_stdout_view索引解析规则,消费app_stdout_stream里的数据,存放于app_stdout结果表中 最后mogo的UI界面,根据app_stdout的数据,查询日志信息 7 Mogo界面展示 查询日志界面 设置日志采集配置界面 以上文档描述是针对石墨Kubernetes的日志采集,想了解物理机采集日志方案的,可以在下文中找到《Mogo使用文档》的链接,运行docker-compose体验Mogo 全部流程,查询Clickhouse日志。限于篇幅有限,Mogo的日志报警功能,下次在讲解。 ​ 8 资料 github地址: https://github.com/shimohq/mogo Mogo文档:https://mogo.shimo.im Mogo使用文档:https://mogo.shimo.im/doc/AV62KU4AABMRQ fluent-bit文档:https://docs.fluentbit.io/ K8S日志 6 个 K8S 日志系统建设中的典型问题,你遇到过几个:https://developer.aliyun.com/article/718735 一文看懂 K8S 日志系统设计和实践:https://developer.aliyun.com/article/727594 9 个技巧,解决 K8S 中的日志输出问题:https://developer.aliyun.com/article/747821 直击痛点,详解 K8S 日志采集最佳实践:https://developer.aliyun.com/article/749468?spm=a2c6h.14164896.0.0.24031164UoPfIX Clickhouse Clickhouse官方文档:https://clickhouse.com/ Clickhouse作为Kubernetes日志管理解决方案中的存储:http://dockone.io/article/9356 Uber 如何使用 ClickHouse 建立快速可靠且与模式无关的日志分析平台?:https://www.infoq.cn/article/l4thjgnr7hxpkgpmw6dz 干货 | 携程ClickHouse日志分析实践:https://mp.weixin.qq.com/s/IjOWAPOJXANRQqRAMWXmaw 为什么我们要从ES迁移到ClickHouse:https://mp.weixin.qq.com/s/l4RgNQPxvdNIqx52LEgBnQ ClickHouse 在日志存储与分析方面作为 ElasticSearch 和 MySQL 的替代方案:https://mp.weixin.qq.com/s/nJXorcgi0QfXPCKr_HdUZg 快手、携程等公司转战到 ClickHouse,ES 难道不行了?:https://mp.weixin.qq.com/s/hP0ocT-cBCeIl9n1wL_HBg 日志分析下ES/ClickHouse/Loki比较与思考:https://mp.weixin.qq.com/s/n2I94X6tz2jOABzl1djxYg

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

2019年Java中高级面试题总结(7),228道系列漏补缺!

2019年Java面试题中高级系列228道 Java面试题(一) 第一篇更新1~20题的答案解析 第二篇更新21~50题答案解析 第三篇更新51~95题答案解析 Java面试题(二) 第四篇更新1~20题答案解析 第五篇更新21~50题答案解析 第六篇更新51~80题答案解析 Java 面试题(二) 81、说出几条 Java 中方法重载的最佳实践? 82、在多线程环境下,SimpleDateFormat 是线程安全的吗? 83、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式? 84、Java 中,怎么在格式化的日期中显示时区? 85、Java 中 java.util.Date 与 java.sql.Date 有什么区别? 86、Java 中,如何计算两个日期之间的差距? 87、Java 中,如何将字符串 YYYYMMDD 转换为日期? 89、如何测试静态方法?(答案) 90、怎么利用 JUnit 来测试一个方法的异常? 91、你使用过哪个单元测试库来测试你的 Java 程序? 92、@Before 和 @BeforeClass 有什么区别? 93、怎么检查一个字符串只包含数字?解决方案 94、Java 中如何利用泛型写一个 LRU 缓存? 95、写一段 Java 程序将 byte 转换为 long? 96、在不使用 StringBuffer 的前提下,怎么反转一个字符串? 97、Java 中,怎么获取一个文件中单词出现的最高频率? 98、如何检查出两个给定的字符串是反序的? 99、Java 中,怎么打印出一个字符串的所有排列? 100、Java 中,怎样才能打印出数组中的重复元素? 101、Java 中如何将字符串转换为整数? 102、在没有使用临时变量的情况如何交换两个整数变量的值? 103、接口是什么?为什么要使用接口而不是直接使用具体类? 104、Java 中,抽象类与接口之间有什么不同? 105、除了单例模式,你在生产环境中还用过什么设计模式? 106、你能解释一下里氏替换原则吗? 107、什么情况下会违反迪米特法则?为什么会有这个问题? 108、适配器模式是什么?什么时候使用? 109、什么是“依赖注入”和“控制反转”?为什么有人使用? 110、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类? 111、构造器注入和 setter 依赖注入,那种方式更好? 112、依赖注入和工程模式之间有什么不同? 113、适配器模式和装饰器模式有什么区别? 114、适配器模式和代理模式之前有什么不同? 115、什么是模板方法模式? 本次更新81~115题的答案解析 81、说出几条 Java 中方法重载的最佳实践? 下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。b)不要重载参数数量一致,而只是参数顺序不同的方法。c)如果重载的方法参数个数多于 5 个,采用可变参数。 82、在多线程环境下,SimpleDateFormat 是线程安全的吗? 不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。 83、Java 中如何格式化一个日期?如格式化为 ddMMyyyy的形式? Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。参见答案中的示例代码,代码中演示了将日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。 84、Java 中,怎么在格式化的日期中显示时区? 使用SimpleDateFormat来实现格式化日期,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如将SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,强力推荐 joda-time 库。 85、Java 中 java.util.Date 与 java.sql.Date 有什么区别? 86、Java 中,如何计算两个日期之间的差距? 87、Java 中,如何将字符串 YYYYMMDD 转换为日期? 89、如何测试静态方法? 可以使用 PowerMock 库来测试静态方法。 90、怎么利用 JUnit 来测试一个方法的异常? 对需要测试异常的代码使用try,catch语句块。比如:public void testException(){try{Long.parseLong(null);} catch(NumberFormatException expected){}}然后使用Junit的fail函数,对于没有抛出预期异常的代码 91、你使用过哪个单元测试库来测试你的 Java 程序? 92、@Before 和 @BeforeClass 有什么区别? @Before :在每个测试方法之前都执行一次, 方法需要声明为public@beforeclass :只在类中执行一次, 必须声明为public static 93、怎么检查一个字符串只包含数字?解决方案 用Java自带的函数、用正则表达式、用ascii码判断 94、Java 中如何利用泛型写一个 LRU 缓存? 这是一种混合的数据结构,我们需要在哈希表的基础上建立一个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚至提供可覆盖回收策略的方法。唯一需要我们注意的事情是,改链表的顺序是插入的顺序,而不是访问的顺序。但是,有一个构造函数提供了一个选项,可以使用访问的顺序。 95、写一段 Java 程序将 byte 转换为 long? 96、在不使用 StringBuffer 的前提下,怎么反转一个字符串? 97、Java 中,怎么获取一个文件中单词出现的最高频率? 这是一道算法面试题,Java中文的比较多。1、将文件内容存入String字符串中。2、利用split()函数分割字符串,因为直接替换英文空格或者,逗号分隔就可以了,中文类似,分隔得到一个数组。 3、遍历数组中所有的单词,统计结果Map 中,key=单词,value=单词出现的次数。 4、使用TreeSet类型,对Map中的结果进行排序,依据统计次数。5、输出最高的排序的前N名结果 98、如何检查出两个给定的字符串是反序的? 思路主要是,从开始字符,和另外一个从末尾字符比较,先判断长度是否相同,不同直接不可能反文。然后再比较。 99、Java 中,怎么打印出一个字符串的所有排列? 100、Java 中,怎样才能打印出数组中的重复元素? 101、Java 中如何将字符串转换为整数? String s="123";int i;第一种方法:i=Integer.parseInt(s);第二种方法:i=Integer.valueOf(s).intValue(); 102、在没有使用临时变量的情况如何交换两个整数变量的值? 加减法、乘除法、异或法。欢迎大家关注我的公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。 103、接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。 104、Java 中,抽象类与接口之间有什么不同? Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。 105、除了单例模式,你在生产环境中还用过什么设计模式? 这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。 106、你能解释一下里氏替换原则吗? 首先,这是编译器的要求,如果不这么做,无法通过编译。其次,面向对象的编程,其中继承有个大原则,任何子类的对象都可以当成父类的对象使用。 107、什么情况下会违反迪米特法则?为什么会有这个问题? 迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。 108、适配器模式是什么?什么时候使用? 适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。 109、什么是“依赖注入”和“控制反转”?为什么有人使用? 控制反转(IOC)是 Spring 框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲 new 了,你就说你要干啥,然后外包出去就好~依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 110、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类? a.接口用于规范,抽象类用于共性.b.声明方法的存在而不去实现它的类被叫做抽象类c.接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。 111、构造器注入和 setter 依赖注入,那种方式更好? 每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。 112、依赖注入和工程模式之间有什么不同? 虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。 113、适配器模式和装饰器模式有什么区别? 虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。 114、适配器模式和代理模式之前有什么不同? 这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。 115、什么是模板方法模式? 模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

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

2019年总结:Java中高级面试题228道系列(6),漏补缺!

2019年Java面试题中高级系列228道 Java面试题(一) 第一篇更新1~20题的答案解析 第二篇更新21~50题答案解析 第三篇更新51~95题答案解析 Java面试题(二) 第四篇更新1~20题答案解析 第五篇更新21~50题答案解析 Java面试题(二) 51、ArrayList 与 LinkedList 的不区别? 52、用哪两种方式来实现集合的排序? 53、Java 中怎么打印数组? 54、Java 中的 LinkedList 是单向链表还是双向链表? 55、Java 中的 TreeMap 是采用什么树实现的?(答案) 56、Hashtable 与 HashMap 有什么不同之处? 57、Java 中的 HashSet,内部是如何工作的? 58、写一段代码在遍历 ArrayList 时移除一个元素? 59、我们能自己写一个容器类,然后使用 for-each 循环码? 60、ArrayList 和 HashMap 的默认大小是多数? 61、有没有可能两个不相等的对象有有相同的 hashcode? 62、两个相同的对象会有不同的的 hash code 吗? 63、我们可以在 hashcode() 中使用随机数字吗? 64、Java 中,Comparator 与 Comparable 有什么不同? 66、在我 Java 程序中,我有三个 socket,我需要多少个线程来处理? 67、Java 中怎么创建 ByteBuffer? 68、Java 中,怎么读写 ByteBuffer ? 69、Java 采用的是大端还是小端? 70、ByteBuffer 中的字节序是什么? 71、Java 中,直接缓冲区与非直接缓冲器有什么区别? 72、Java 中的内存映射缓存区是什么? 73、socket 选项 TCP NO DELAY 是指什么? 74、TCP 协议与 UDP 协议有什么区别? 75、Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答案) 76、Java 中,编写多线程程序的时候你会遵循哪些最佳实践? 77、说出几点 Java 中使用 Collections 的最佳实践 78、说出至少 5 点在 Java 中使用线程的最佳实践。 79、说出 5 条 IO 的最佳实践(答案) 80、列出 5 个应该遵循的 JDBC 最佳实践 本篇更新21-50题的答案 51、ArrayList 与 LinkedList 的不区别? 最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。 52、用哪两种方式来实现集合的排序? 你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。 53、Java 中怎么打印数组? 你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println()方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。 54、Java 中的 LinkedList 是单向链表还是双向链表? 是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。 55、Java 中的 TreeMap 是采用什么树实现的? Java 中的 TreeMap 是使用红黑树实现的。 56、Hashtable 与 HashMap 有什么不同之处? 这两个类有许多不同的地方,下面列出了一部分:a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。 57、Java 中的 HashSet,内部是如何工作的? HashSet 的内部采用 HashMap 来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的key,只允许有一个 null key,意思就是 HashSet 中只允许存储一个 null 对象。 58、写一段代码在遍历 ArrayList 时移除一个元素? 该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。 59、我们能自己写一个容器类,然后使用 for-each 循环码? 可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。 60、ArrayList 和 HashMap 的默认大小是多数? 在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16 个元素(必须是 2 的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段: // from ArrayList.java JDK 1.7 private static final int DEFAULT_CAPACITY = 10; //from HashMap.java JDK 7 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 61、有没有可能两个不相等的对象有有相同的 hashcode? 有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的 hashcode 值,但是没有关于不相等对象的任何规定。 62、两个相同的对象会有不同的的 hash code 吗? 不能,根据 hash code 的规定,这是不可能的。欢迎大家关注我的公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。 63、我们可以在 hashcode() 中使用随机数字吗? 不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。 64、Java 中,Comparator 与 Comparable 有什么不同? Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。 65、为什么在重写 equals 方法的时候需要重写 hashCode 方法? 因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。 66、在我 Java 程序中,我有三个 socket,我需要多少个线程来处理? 这个需要看你是并行处理还是串行处理了。 67、Java 中怎么创建 ByteBuffer? byte[] bytes = new byte[10]; ByteBuffer buf = ByteBuffer.wrap(bytes) ;``` 68、Java 中,怎么读写 ByteBuffer ? 69、Java 采用的是大端还是小端? 70、ByteBuffer 中的字节序是什么? 71、Java 中,直接缓冲区与非直接缓冲器有什么区别? 72、Java 中的内存映射缓存区是什么? 73、socket 选项 TCP NO DELAY 是指什么? 74、TCP 协议与 UDP 协议有什么区别? 75、Java 中,ByteBuffer 与 StringBuffer 有什么区别? # 76、Java 中,编写多线程程序的时候你会遵循哪些最佳实践? a)给线程命名,这样可以帮助调试。 b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。 c)如果可以,更偏向于使用 volatile 而不是 synchronized。 d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。 e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。 77、说出几点 Java 中使用 Collections 的最佳实践 a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是Vector。 b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。 c)使用接口代表和访问集合,如使用 List 存储 ArrayList,使用 Map 存储HashMap 等等。 d)使用迭代器来循环集合。 e)使用集合的时候使用泛型。 # 78、说出至少 5 点在 Java 中使用线程的最佳实践。 这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该: a)对线程命名 b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。 c)使用线程池 # 79、说出 5 条 IO 的最佳实践 IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你应用的关键路径上避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践: a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。 b)使用 NIO 和 NIO2 c)在 finally 块中关闭流,或者使用 try-with-resource 语句。 d)使用内存映射文件获取更快的 IO。 # 80、列出 5 个应该遵循的 JDBC 最佳实践 有很多的最佳实践,你可以根据你的喜好来例举。下面是一些更通用的原则: a)使用批量的操作来插入和更新数据 b)使用 PreparedStatement 来避免 SQL 异常,并提高性能。 c)使用数据库连接池 d)通过列名来获取结果集,不要使用列的下标来获取。 # 最后 欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

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

斯诺登说Allo并不安全:FBI随时能你的聊天记录

Google 最近在 Android 和 iOS 平台上同时推出了一款智能 IM 应用 Allo,该应用结合了 Google Assistant 语音助手和图像识别等人工智能技术,并很快就获得大批用户。但这一 Android 7.0 上的官方 IM 应用也引发了人们对于信息安全的担忧,例如“棱镜们”事件的曝光者,现在旅居俄罗斯的爱德华·斯诺登。 斯诺登最近在 Twitter上发文称:“什么是 Allo?就是一个 Google 用来记录你发送的每条信息的 App,并根据要求将它们提供给警方。” 斯诺登的此番言论还是有依据的。跟 WhatsApp 和苹果的 iMessage 等 IM 应用不同,用户在 Google Allo 上发送的信息将会被存储到 Google 的服务器上,因为 Google 认为用户发送的信息可以用来训练 Google 的机器学习系统,让系统帮助用户作出更合理的回复。 作为一款 IM 应用,Allo 的主要卖点是“智能聊天”。它不仅能让用户与朋友保持联系,还能在应用内搜索信息,并能让用户在聊天时得到人工智能的帮助。例如 Allo 能够自动分析当前对话的上下文和图片信息,自动帮助准备好可能会回复的信息。这个智能回复的功能在手机上无法完成的,需要服务器端的算法进行分析,因此 Allo 需要把信息上传到服务器上。苹果的 Siri 智能语音助手也采用了这个原理,将用户的语音信息上传到云端进行处理,但苹果承诺不会储存用户的语音信息。 在今年 5 月份的 Google I/O 开发者大会上 Google 就已经承认了这一点,但它同时也承诺用户发送的信息只会“短暂”地存储在 Google 的服务器上,并且数据的传输和存储方式都是加密的,同时用户可以选择删除这些信息。 但目前主流的 IM 应用,例如 WhatsApp、iMessage 和微信等都采用了端对端的加密传输方式,也就是说一个用户发送的信息将直接传输给其他另一个用户,信息并不会被存储在提供商的服务器上。 Google Allo 这种将用户发送的信息存储在服务器的做法引发了大量批评,因为这完全与目前的主流信息服务商的隐私策略不符,而且也不符合 Google 一贯的价值观。 另外,斯诺登还担忧警察能够随时查询用户的聊天信息,这也是有可能发生的。例如在美国,FBI 和 NSA 等机构是可以通过“美国外国情报监视法庭”(US foreignintelligence surveillance court)来像科技公司提交数据查阅申请的。根据 Facebook和 Google 等公司披露的数据,仅在 2015 年上述机构就已经发出了超过 1500 份数据拦截申请。 不过在中国,将用户的数据存储在服务器上是官方强制施行的。今年 6 月国家网信办发布了一份《移动互联网应用程序信息服务管理规定》,规定 APP 提供者应当严格落实信息安全管理责任,依法履行“对注册用户进行基于移动电话号码等真实身份信息认证”“记录用户日志信息,并保存六十日”等义务。 “现在我们可以免费下载 Google 邮箱,Google 地图,接下来就是 Google 监控了,这就是 Allo。不要使用 Allo!”斯诺登在 Twitter 上这样警告道。 本文转自d1net(转载)

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

手把手学IOT服务端API编程[8、按设备名信息]|MVP讲堂

作者:阿里云MVP洵云 上节回顾:手把手学IOT服务端API编程[7、查询设备申请信息]|MVP精选 上节介绍设备申请 信息 查询后,其实在实际使用过程中,有些用户在设备 注册 完成后,有时候用户还需要通过产品key值和设备名称来查询设备的信息,在这种情况下 服务 端提供了相应的 API 接口供用户调用,从而做 自 己的应用;本节就对于有这种需求的情况,如何通过服务端提供接口来实现相应的功能; 接下来我们看一下具体实现; 1、脚本实现: 我们按照接口的要求,在框架页面上,提供产品的key值和设备名称这两个个输入 参数 框给用户输入; 产品KEY:<input type="text" name="pkey6"> 设备名称:<input type="text" name="devname6"> 而在实际的实现代码中,我

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

金山办公半年报:AI 月活用户突破 2900 万,WPS365 营收暴 62%

金山办公(688111)发布2025年半年报,展现出稳健的增长态势。公司上半年实现营业收入26.57亿元,同比增长10.12%;归属于母公司所有者净利润7.47亿元,同比增长3.57%;;扣非净利润7.27亿元,同比增长5.77%。 AI技术的深度应用为金山办公带来显著效果。截至6月30日,WPS AI月活跃用户数达2951万,较2024年底的1968万实现大幅增长。WPS Office全球月度活跃设备数创历史新高,达6.51亿,同比增长8.56%,其中PC版月活3.05亿,移动版月活3.46亿。 个人业务方面,WPS个人业务收入17.48亿元,同比增长8.38%。国内累计年度付费个人用户数4179万,同比增长9.54%;海外付费用户189万,收入1.29亿元。海外市场通过优化本地运营及AI权益部署,用户增长效率持续提升。 企业级市场表现亮眼,WPS365业务收入3.09亿元,同比增长62.27%,成为公司业务增长新引擎。该业务加速行业解决方案落地,在教育领域覆盖双一流院校达75%,服务超1000家高校及2000万师生。 在政企领域,WPS365推出"企业大脑"解决方案,整合AI Hub、AI Docs和Copilot Pro,新增中国联通、长江三峡集团、中国电气装备集团等标杆客户。升级后的智能文档库表格识别召回准确率高达95%以上,多格式文档解析能力行业领先。 报告期内,金山办公发布WPS AI3.0并推出原生Office办公智能体——WPS灵犀,通过"双向改造"重新定义AI与办公软件的融合模式。WPS灵犀获评2025世界人工智能大会"镇馆之宝"奖项,具备多轮对话、修改可控、格式保留等优势。 创新功能包括AI改文档的"左侧Office、右侧灵犀"同屏交互方式,WPS AIPPT支持自然语句动态优化大纲,以及业内首个支持"聊文档"的灵犀语音助手。WPS知识库支持一键升级云文档,单文件解析量级达500M。 公司2025上半年研发投入9.59亿元,同比增长18.70%,研发费用率约36%。截至报告期末,研发人员3533人,占总员工数比例约66%,为技术突破提供坚实支撑。 东吴证券和华创证券研报均看好金山办公在AI+企业服务领域的投资价值,认为公司在AI Agent规模化落地背景下具有重要机会。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册