首页 文章 精选 留言 我的

精选列表

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

Jmix 1.5 新功能概览 - 企业级少代码 Web 快速开发框架

最近我们发布了 Jmix 的最新 1.5 正式版本。本文中,我们将介绍 1.5 版本中引入的主要新功能和改进。 如需了解更新的详细信息以及如何升级,请参考 Jmix 文档中的 最近更新 部分。 Studio UI/UX 改进 首先我们看一下在更新了 Studio 后你可能发现的一些 UI 层面的变化。 我们通过对不熟悉 Jmix 的开发者进行几轮的测试后发现,当前的 UI 可视化设计器有些过于复杂了。对于第一次使用 Studio 的用户来说,三个工具窗口和多个 XML 编辑和界面预览面板容易使人感到不知所错。另外,我们发现用户更偏向使用当前编辑器窗口顶部的操作面板,并且更习惯通过点击鼠标右键查找可用的功能。 因此,我们决定移除静态的组件工具箱面板,而改为通过几种不同的方式打开工具箱弹窗的交互模式。这几种不同的方式包括:从顶部操作面板打开,从组件层级结构的右键菜单打开,以及从源代码编辑器中的 「Generate」 菜单打开。新的工具箱弹窗支持搜索可用组件,也支持将组件拖放至 UI 层级结构或者源码中: ▲ Studio 添加组件 UI 组件层级结构和组件属性面板现在合并成了单一的工具窗口,称为 Jmix UI,默认位于 IDE 的右侧。因此,UI 可视化设计器最后仅保留一个工具窗口,而组件工具箱可以通过不同的方式打开。 Studio 界面中的另一个不太好用的功能是 「Code Snippets」 工具箱。尽管对于没有 Jmix 开发经验的人来说,这个功能非常有用,但是却很难被注意到。所以,我们也修改了这个面板的展示方式:现在,在编辑 Spring bean 或者 UI 控制器时,可以通过顶部操作面板的按钮或者 「Generate」 菜单打开,并且代码段的窗口也是以弹窗的方式展示。 ▲ Studio 代码片段 Flow UI 改进 我们一直在持续改进 Flow UI 的功能,使其更接近作为 Jmix 中主要的 UI 技术这一目标。 在这个版本中,我们将 Flow UI 的核心升级到 Vaadin 23.3 并且集成了几个新的组件。 TabSheet 当需要将大量 UI 组件放入单个视图时,TabSheet 是必不可少的。使用 Jmix 最常见的场景就是开发类似 ERP 这样的后台系统,而这种系统中,TabSheet 是一个典型需求。 在以前的版本中,Jmix 只提供了 Tabs 组件,该组件并不是容器,需要在不同的布局之间进行编程切换。而 Vaadin 23.3 提供了功能齐全的 TabSheet,这样我们可以完全用声明式的方式集成: <tabSheetwidth="100%"> <tabid="mainTab"label="Main"> <formLayoutid="form"dataContainer="userDc">...</formLayout> </tab> <tabid="additionalTab"label="Onboardingsteps"> <vbox> <hbox>...</hbox> <dataGridwidth="100%"dataContainer="stepsDc">...</dataGrid> </vbox> </tab> </tabSheet> ▲ Flow UI TabSheet MultiSelectComboBox 在最新的 Vaadin 中也提供了多选下拉框组件,使用该组件用户可以在下拉列表中选择多个值,并且在字段中很好地显示选择的内容。我们已经在 Jmix 集成该组件,并添加了数据绑定,因此可用于展示或修改实体的集合属性。下面的示例中,我们用这个组件管理产品和标签的多对多关系: <instanceid="productDc" class="com.company.demo.entity.Product"> <fetchPlanextends="_base"> <propertyname="tags"fetchPlan="_base"/> </fetchPlan> <loader/> </instance> <collectionclass="com.company.demo.entity.Tag"id="allTagsDc"> <fetchPlanextends="_base"/> <loaderid="allTagsDl"> <query> <![CDATA[selectefromTage]]> </query> </loader> </collection> <!--...--> <formLayoutid="form"dataContainer="productDc"> <textFieldid="nameField"property="name"/> <multiSelectComboBoxproperty="tags"itemsContainer="allTagsDc"/> </formLayout> ▲ Flow UI MultiSelectComboBox 上传控件 基于 Vaadin 的 Upload 组件,我们开发了两个 Flow UI 的组件:FileStorageUploadField 和 FileUploadField。前一个用来将文件上传至文件存储,返回 FileRef 对象,可以保存在实体属性中。后一个返回字节数组,这个字节数组是直接保存在一个实体中的。 这两个组件的声明式用法非常简单:只需要设置一个带有实体实例的数据容器,然后配置 FileRef 或字节数组类型的实体属性名称即可: <fileStorageUploadFieldid="uploadField" dataContainer="userDc"property="picture"/> 图片 图片组件现在也支持 Jmix 的数据绑定,可以绑定至 FileRef 或字节数组类型的实体属性: <imageid="image" dataContainer="userDc"property="picture" height="280px"width="200px"classNames="user-picture"/> 如果需要配置图片的放置方式,可以用 CSS 样式。例如,需要在缩放图像同时保持其宽高比,可以创建下面这个 CSS 类,并在组件的 classNames 属性中指定: .user-picture{ object-fit:contain; } Tooltip Tooltip(提示窗)可以在 UI 组件旁边的小弹窗中展示组件的附加信息。鼠标悬停或者键盘聚焦都可以维持它的展示状态。 对于支持提示窗的组件,Studio UI 设计器会在组件属性面板展示 Add 按钮: ▲ Flow UI 添加提示窗 在 XML 中则是通过组件内部的元素定义: <textFieldid="nameField"property="name"> <tooltiptext="Productname"position="BOTTOM_START"/> </textField> ▲ Flow UI 提示窗 通用过滤器 过滤器是经典 UI 中最受欢迎的组件之一,支持用户根据不同的条件筛选数据,包括实体属性、引用、JPQL 查询和条件运算符。打个形象的比喻,过滤器就像是一把用于结构化数据搜索的瑞士军刀,开发人员只需在界面中放置过滤器,用户就可以自定义并按需使用。 在 Jmix 1.5,我们在 Flow UI 中添加了具有基本功能的通用过滤器:用户可以基于整个实体关系图创建任意数量的属性条件。与 Flow UI 中的其他组件一样,过滤器也是响应式的: ▲ Flow UI 响应式过滤器 而且,对于响应式的 breakpoints,过滤器还支持在其内部 XML 元素 responsiveSteps 进行配置: <genericFilterid="filter"dataLoader="usersDl" summaryText="Myfilter"> <responsiveSteps> <responsiveStepminWidth="0"columns="1"/> <responsiveStepminWidth="800px"columns="2"/> <responsiveStepminWidth="1200px"columns="3"/> </responsiveSteps> </genericFilter> 显然,过滤器是有状态的,而且在不同的视图之间导航或刷新网页时应保持其状态。否则,用户设置过的筛选条件将会丢失,例如,在详情页编辑数据后返回列表页的情况。Jmix 提供了 queryParameters facet,用于保存当前 URL 和筛选条件的映射,这样可以确保在不同的视图间导航时过滤器能保持正确的过滤状态,并且能提供包括筛选条件在内的页面深度链接(Deep link)。Facet 的最简单配置就是直接设置它所控制的过滤器组件: <facets> <queryParameters> <genericFiltercomponent="filter"/> </queryParameters> </facets> 通用过滤器的研发还在继续,我们计划在 2023 年 6 月的版本中让 Flow UI 的过滤器具有通用 UI 过滤器的所有功能。 带有 Flow UI 的扩展组件 在 1.5 中,我们为下列开源组件提供了 Flow UI: 多租户 Quartz 定时任务 应用程序设置 表格导出操作 在使用 Flow UI 的项目中可以直接通过 Studio 的扩展组件市场安装。 Flow UI 菜单 Flow UI 中的主菜单结构与经典 UI 不同:每个扩展组件都有自己的根节点菜单、有预定义的顺序,而且没有通用的 “管理” 菜单。对于试验和原型系统来说,这种默认的菜单结构已经够用,但对于实际的应用来说,往往还是需要一个自定义的菜单结构。因此,可以从 “Composite” 模式切换到 “Single” 模式并定义自己的菜单结构。 以前,许多开发人员尽可能避免使用 “Single” 模式,因为在项目中添加新扩展组件时,这种模式会有问题:新扩展组件的菜单项没有出现在主菜单中,并且不清楚要怎么添加。 现在,这个问题已经在 Flow UI 的菜单设计器中得到解决。一旦切换到 “Single” 模式,设计器就会在左侧显示一个包含扩展组件所有菜单项的面板,这些菜单也可以在主菜单使用。这样一来,在添加了新的扩展组件之后,只需要将扩展组件的菜单拖放到主菜单中合适的位置即可。 ▲ Flow UI 菜单设计器 Excel 导出 Jmix 应用程序中最常用的功能之一是能够一键将 UI 表格中展示的数据导出到 Excel。这个功能在最初设计时是用来精确导出用户当前能看到的所有数据,即通过过滤器选择的当前页面的数据。但是很多时候用户希望能导出过滤器筛选的所有数据,而不仅仅是当前页面。 在 1.5 中,我们改进了表格导出操作扩展组件提供的 excelExport 操作。现在,如果用户在导出对话框中选择 “所有行”,则会导出所有数据。考虑到性能和服务器内存使用情况,数据加载会分批次执行。 该功能同时支持经典 UI 和 Flow UI。 悲观锁 UI Jmix 现在提供了一个用于管理悲观锁的默认 UI。位于经典 UI 的 “管理” 菜单和 Flow UI 的 “系统” 菜单中。 系统管理员可以查看当前锁的列表,并在需要时进行手动删除。 Liquibase changelog Jmix 的一个优势是能帮助开发人员创建和运行用于数据库版本控制的 Liquibase changelog。Studio 会针对数据模型和数据库结构之间的差异生成 changelog,并在启动应用程序时运行这些更改脚本。因此,当在测试或生产环境中启动一个新版本的应用时,会自动在连接的数据库上运行那些新添加的 changelog。 但是,这个简单的流程并不能满足所有的需求,有时候需要在没有 Studio 或应用程序的情况下运行 Liquibase,比如,在一个 CI 服务器上通过 Liquibase CLI 或 Gradle 插件运行 changelog。 在以前的版本中,这是不可能实现的,因为项目的 root changelog 文件没有定义扩展组件提供的数据库变更。但是 changelog 能正确运行是因为,Jmix 会从项目配置中获取使用的扩展组件信息,并在运行 Liquibase 之前在内存中动态创建正确的 changelog。 从 Jmix 1.5 开始,我们修改了这个机制,项目的 root changelog 文件始终是完整的,可以通过 Liquibase CLI 或 Gradle 插件执行。每当添加或删除扩展组件时,Studio 都会自动更新 changelog 包含新的内容。此外,当启动应用程序时,Studio 会检查 root changelog 中包含的内容与项目的扩展组件是否匹配。如果发现不匹配,Studio 会显示通知对话框,并建议添加或删除对扩展组件 changelog 的引入。 Jmix 工具窗口中,通过双击数据存储下的 Liquibase 节点即可打开 root changelog: ▲ Flow UI root changelog 下一步? 下一个 Jmix 的功能版本将在 2023 年 6 月发布,在这个版本中,我们将更新框架底层技术栈的版本,包括 Spring、Spring Boot、Eclipselink 以及 Vaadin。这次更新后,将会要求最低使用 Java 17 作为开发和运行 Jmix 程序的基线版本。 另一个重要的里程碑是为报表和 BPM 扩展组件实现 Flow UI 的界面模块。 未来版本的详细路线图请访问 GitHub 项目。1.5 的后续补丁版本会按照大约每个月一次的频率发布,提供常规更新和升级。 欢迎通过我们的 论坛 提供反馈和问题。谢谢大家对 Jmix 的支持和建议! 资源:👉🏻Jmix 适合我吗? 👉🏻 中文官网

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

内核优化之PSI篇:快速发现性能瓶颈,提高资源利用率

欢迎关注【字节跳动 SYS Tech】公众号。字节跳动 SYS Tech 聚焦系统技术领域,与大家分享前沿技术动态、技术创新与实践、行业技术热点分析等内容。 背景介绍 了解操作系统原理的同学应该知道,业务进程的运行性能取决于多种系统资源的分配。比如进程需要等待某些 IO 的返回,需要从伙伴系统分配内存,可能会由于 memory cgroup 的限制或者系统内存的水线配置而进行内存回收,进程运行需要调度器分配 CPU 时间,可能由于 CPU cgroup 的 quota 配置或者系统负载较大而等待调度器的调度。 所以一个进程的运行过程实际上是一个不断等待不断执行的过程,过多的等待会对进程的吞吐和延时造成负面影响,是否有一种内核机制能够量化这些等待时间呢? PSI 通过 hook CPU 调度器和 hook 一些 IO 和 memory 的关键点,来得到一个线程开始等待某种资源和结束等待某种资源的时间点以及程序运行的时间,然后用移动平均算法算出一个表示 pressure stall information 的百分比来量化。 用途 PSI 监控机制给我们提供了一种实时量化指标,反映业务进程的吞吐和延时,是否有某种系统资源上的瓶颈。这可以帮助我们了解特定业务进程的资源需求,协助业务的部署密度。并且可以根据 PSI 指标,动态调节业务的部署和资源的分配,来保证特定业务的性能要求和系统的健康程度。 使用接口 监控接口 PSI 通过 /proc 文件系统导出了三个接口文件,用于反映实时的系统级别的 CPU,memory 和 IO 压力。 # cat /proc/pressure/cpu some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 # cat /proc/pressure/memory some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 # cat /proc/pressure/io some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 其中的 some 表示至少有一个线程有资源瓶颈的时间比例,full 表示所有线程都有资源瓶颈的时间比例。 full 状态相当于整个系统由于资源瓶颈没有执行任何 productive 的代码,白白浪费了 CPU 资源。而 some 则是某些线程有资源瓶颈,另外的线程还是在利用 CPU 资源执行 productive 的代码。 avg10,avg60,avg300 则是在 10s,60s,300s 的时间窗口计算的移动平均百分比,表示资源瓶颈状态的时间比例,可以给我们短期、中期和长期的量化了解。total 则是资源瓶颈状态的绝对时间积累,我们也可以对 total 的变化进行监控来发现延时抖动的情况。 trigger 接口 除了读取这些接口文件获取实时指标外,我们还可以写入这些接口文件向内核注册 trigger,通过select(),poll() 或 epoll() 等待 trigger 事件的发生。 # 150ms threshold for partial memory stall in 1sec time window echo "some 150000 1000000" > /proc/pressure/memory # 50ms threshold for full io stall measured within 1sec time window echo "full 50000 1000000" > /proc/pressure/io trigger 示例代码 #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <string.h> #include <unistd.h> /* * Monitor memory partial stall with 1s tracking window size * and 150ms threshold. */ int main() { const char trig[] = "some 150000 1000000"; struct pollfd fds; int n; fds.fd = open("/proc/pressure/memory", O_RDWR | O_NONBLOCK); if (fds.fd < 0) { printf("/proc/pressure/memory open error: %s\n", strerror(errno)); return 1; } fds.events = POLLPRI; if (write(fds.fd, trig, strlen(trig) + 1) < 0) { printf("/proc/pressure/memory write error: %s\n", strerror(errno)); return 1; } printf("waiting for events...\n"); while (1) { n = poll(&fds, 1, -1); if (n < 0) { printf("poll error: %s\n", strerror(errno)); return 1; } if (fds.revents & POLLERR) { printf("got POLLERR, event source is gone\n"); return 0; } if (fds.revents & POLLPRI) { printf("event triggered!\n"); } else { printf("unknown event received: 0x%x\n", fds.revents); return 1; } } return 0; } cgroup接口 使用cgroup-v2 时 PSI 还提供了 per-cgroup 的 pressure stall information 接口,用于监控和跟踪特定 cgroup 的资源瓶颈状态。 cgroupfs 的 mount 点的每个子目录都有三个文件接口:cpu.pressure,memory.pressure,io.pressure。读取文件内容的形式和 /proc/pressure 一样,同样也可以进行写入注册 trigger 事件。 性能优化 PSI 机制为我们提供了一种实时量化系统级别或 cgroup 级别是否存在资源瓶颈的指标,对于调度部署业务负载和资源分配有很好的指导作用,而且可以明确业务进程的吞吐和延时方面存在的资源瓶颈。 但是 PSI 机制不是没有开销的,它 hook 了调度器和 IO,memory 等热点路径,统计等待资源的时间并计算比例,这些都是有开销的。为了在生产环境常态化开启 PSI 特性,我们需要解决 PSI 的性能开销问题。 问题场景 我们在线上场景遇到的一起 PSI 性能问题的 perf top 热点,其中 psi_task_change() 热点比较高,对当时业务进程的吞吐和延时都有较大的负面影响。 代码分析 psi_task_change() 的热点开销问题可能有两个方面的原因:一个是它本身执行比较耗时,另一个是它被调用的频率太高。 psi_task_change()函数的作用通过名字可知,在 PSI 的所有 hook 点都会发生 task 状态的变化,比如开始等待 memory,结束等待 memory,开始等待 CPU,结束等待 CPU 等,因此该函数调用频率较高。 另外psi_task_change()内部实现不仅需要改变该 task 的状态,还要改变 task 所在每个 cgroup 的状态,改变前需要统计上个状态的时间。 详情参见以下代码片段: void psi_task_change(struct task_struct *task, int clear, int set) { int cpu = task_cpu(task); struct psi_group *group; bool wake_clock = true; void *iter = NULL; if (!task->pid) return; psi_flags_change(task, clear, set); /* * Periodic aggregation shuts off if there is a period of no * task changes, so we wake it back up if necessary. However, * don't do this if the task change is the aggregation worker * itself going to sleep, or we'll ping-pong forever. */ if (unlikely((clear & TSK_RUNNING) && (task->flags & PF_WQ_WORKER) && wq_worker_last_func(task) == psi_avgs_work)) wake_clock = false; while ((group = iterate_groups(task, &iter))) psi_group_change(group, cpu, clear, set, wake_clock); } 通过以上代码分析,我们发现有两个可以优化的方向:尽量减少psi_task_change()的调用,以及尽量减少psi_group_change()的调用。 代码优化 1. 利用共同的cgroup 我们需要知道的一个捷径是当task A切换到task B时,如果A和B存在共同的cgroup时,其实cgroup的状态是没有变化的,只是task A和task B的状态变化了。 所以根据这个事实我们可以优化发生频率比较高的task_switch hook,不再遍历改变task A的所有cgroup,然后再次遍历task B的所有cgroup,而是进行整合:只改变task A和task B的不同cgroup分支,直到相同的cgroup停止,减少psi_task_change()的调用开销。 2. 减少sleep导致的状态切换 sleep before: psi_dequeue() while ((group = iterate_groups(prev))) # all ancestors psi_group_change(prev, .clear=TSK_RUNNING|TSK_ONCPU) psi_task_switch() while ((group = iterate_groups(next))) # all ancestors psi_group_change(next, .set=TSK_ONCPU) sleep after: psi_dequeue() nop psi_task_switch() while ((group = iterate_groups(next))) # until (prev & next) psi_group_change(next, .set=TSK_ONCPU) while ((group = iterate_groups(prev))) # all ancestors psi_group_change(prev, .clear=common?TSK_RUNNING:TSK_RUNNING|TSK_ONCPU) 通过以上对比可知:优化掉了 psi_dequeue 触发的 psi_group_change() 调用,将状态的改变整合放到了psi_task_switch(),减少了 cgroup 的状态切换开销。 总结 PSI 的优化成果已经合入上游的主线内核,也合入了 veLinux 开源的 5.4 内核版本,现在部署的 5.4 内核都已经常态化开启了 PSI 机制,配合 cgroup-v2 的使用会更好地帮助我们发现业务性能的资源瓶颈,以及动态的自适应运维和资源分配。 社区也已经存在基于 PSI 机制的 OOMD(out of memory daemon)service,可以更好地应对系统 OOM 的场景,同时在字节内部也积极开发和应用基于 PSI 机制的动态资源管控程序,以在保证业务性能的同时,提高资源利用率。 veLinux 内核 GitHub 地址:https://github.com/bytedance/kernel

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

干货分享 | HZERO系列组件之数据分发组件(一),广播表快速入门

企业的信息化系统,通常会存在业务系统服务和HZERO系统服务相互独立,表数据也进行分库存储的情况,然而在众多业务系统服务中,存在很多场景需要用到HZERO平台的Iam_user(用户)表,因此我们需要将用户表分发到其他数据库里。 普通的解决方式是通过定时调度任务或者在代码中埋点,编写同步代码的方式让两个系统两个数据库实例的用户数据保持一致。 但设想一下,如果我们需要同步的不仅仅是用户,还有角色、用户权限、员工、组织、部门等等数据呢?编写代码的方式不仅会增加开发量,还可能会有数据延迟、程序BUG等影响。 所以这里要引入数据分发组件,在保障同步性能的同时,能大大降低数据分发的工作量。 数据分发组件概述 基于CloudCanal社区版,HZERO提供了一个集成组件,进行API和操作流程的封装,主要功能是实现全局表的数据分发功能,灵活设置可按服务分DB,该组件主要的使用场景包括需要用到全局表的情况,例如用户表等。 当然,不使用HZERO的操作入口,从CloudCanal官方提供的管理界面进行配置也能达到效果,不过在这我们还是建议使用HZERO进行统一的管理。 组件坐标 管理端组件在Hzero-Admin服务中依赖使用。 <dependency> <groupId>org.hzero.plugin</groupId> <artifactId>admin-datasync</artifactId></dependency> 组件配置说明 在Hzero-Admin服务中添加好依赖后,还需配置以下信息才能正常使用。 hzero: admin: cloudCanal: # 服务地址, 安装CloudCanal组件后,CloudCanal的访问地址 serverUrl: ${HZERO_CLOUDCANAL_SERVER_URL:http://cloudcanal.hzero.com} # 应用KEY,从CloudCanal的管理员用户账号信息中获取,与appSecret相对应,具体获取方式可参考`CloudCanal`的官方文档 appKey: ${HZERO_CLOUDCANAL_APP_KEY:ak**********************************} # 应用秘钥,从CloudCanal的管理员用户账号信息中获取,与appKey相对应,具体获取方式可参考`CloudCanal`的官方文档 appSecret: ${HZERO_CLOUDCANAL_APP_SECRET:sk*********************************} # 管理帐户,CloudCanal的管理员账户 account: ${HZERO_CLOUDCANAL_ACCOUNT:test@clougence.com} # 管理密码,CloudCanal的管理员账户的密码 password: ${HZERO_CLOUDCANAL_PASSWORD:********************} # 登录认证Cookie域,需要保证CloudCanal的访问地址要与hzero的界面前端在同一个域里,否则不能以无登录的方式直接跳转到CloudCanal的管理界面 domainUrl: ${HZERO_CLOUDCANAL_DOMAIN_URL:.hzero.com} 组件安装 安装教程 详细教程可参考以下路径:https://www.clougence.com/cc-doc/quick/quick_start/ 修改默认验证码 CloudCanal社区版为了体验便利,默认设置了777777验证码,但是我们希望提高数据安全性,降低数据泄露风险。CloudCanal也提供修改默认验证码的功能,我们按照以下步骤配置即可。 操作步骤: 1、进入CloudCanal社区版解压目录 /console_data/cloudcanal/console/conf; 2、编辑Business-output.properties文件和以下参数Console.config.product.trial.verify_code=777777; 3、重启Console容器。 准备数据库账号 CloudCanal在做MySQL源端或对端的数据迁移同步时,需要提供的账号有一些赋权,基于数据安全和规范的考虑,我们建议新建数据库账号,不要使用权限最大的账号。 MySQL源端 全量迁移:迁移库表的SELECT权限,Information_schema SELECT权限 增量同步:SELECT,REPLICATION SLAVE,REPLICATION CLIENT权限,Information_schema SELECT权限 MySQL对端 全量迁移/增量同步:迁移库表的 INSERT/UPDATE/DELETE/DDL权限,Information_schema SELECT权限 系统自动心跳(可选) 默认心跳语句:CREATE DATABASE权限 组件基础配置 新建MYSQL数据源 路径:平台层菜单平台治理>数据分发>CloudCanal 通过以上路径进入CloudCanal管理界面。 目前HZERO系统能方便管理的只有MySql类型,若要分发其他类型数据库,请参照官方文档直接在CloudCanal系统中配置 : 1、可以使用阿里云账号,也可以使用自建账号密码模式(一般习惯用账号密码模式,权限分配比较简单); 2、网络地址最好填写内网,避免网络延迟; 3、按步骤填写后点击测试链接。 创建来源表 路径:平台层菜单平台治理>数据分发>广播表通过以上路径进入广播表管理界面 点击广播表操作栏上的【新建】按钮进入来源表创建页面。依次选择集群,网关类型为公网,数据源为我的数据源,库为Hzero_platform,表为Iam_user,点击【确定】后完成来源表的创建。 创建目标表 选中刚创建的来源表,点击目标表操作栏上的 新建按钮进入目标表创建页面。依次选择网关类型为公网,数据源为我的数据源,库为Order_sys,表不做更改, 默认与来源表保持一致,为Iam_user,点击确定后完成目标表的创建。 重复以上操作,只是这次库选择Payment_sys。 等待片刻,分别进入数据库的Order_sys与Payment_sysDB,可以看到Iam_user数据已经同步过来,而且后续的其他操作也会同步到其他两个DB中的对应表里。 通过以上几步简单的配置,就能完成两个数据库实例间的数据同步,不仅避免定时任务同步、代码埋点同步带来的一系列问题,而且CloudCanal是通过监听MySQL的增量日志实现的增量同步,在不影响应用服务器性能的情况下,正常情况下延迟不会超过1秒。 下篇我们将讲述数据分发组件之ElasticSearch同步方案,敬请期待。 联系我们 产品试用请登录开放平台。请在 PC 端打开: https://open.hand-china.com/market-home/trial-center/ 产品详情请登录开放平台: https://open.hand-china.com/document-center/ 如有疑问登录开放平台提单反馈: https://open.hand-china.com/ ▲ 更多精彩内容,扫码关注“四海汉得”公众号​​​​​​​

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

微软Skype即将迎来重大升级:带来快速、有趣、愉悦和流畅的体验

微软今天发布预告,表示 Skype 目前正在积极开发中,新版本有望在未来几个月内和大家见面。随着最近面向消费者的 Microsoft Teams 的推出,大多数人认为微软将退出 Skype。不过微软今天透露了 Skype 的未来计划,目标是建立一个改进的、更快的、可靠的、看起来超级现代的Skype。 作为Skype 中重要的部分之一,微软称其为“call stage”(通话舞台)。新版在通话期间显示的网格将很快包含通话中的每个人,无论他们是否启用了视频。这将使所有参与者并排在一起,包括你自己在主界面上的视频。 微软还为这个视图添加了新的主题和布局,为Skype的主要通话界面提供了一些亟需的定制功能。你将能够在扬声器视图、网格视图、大型图库、共同模式,甚至是内容视图之间进行选择--可以选择只显示启用视频的人。 Skype 新的彩色主题很快就会出现,包括按钮梯度,移动端改进的侧板,以及整个应用程序的流畅设计图标。没有头像的 Skype 用户也将获得彩色渐变,以便更容易区分聊天内容。 在团队博文中写道:“虽然我们喜欢设计上的变化,但我们知道它们还不够我们需要专注于性能,以使体验令人愉悦”。微软声称,它在 Android 版本的“关键场景”中的性能提高了 2000% 以上,在桌面版本的 Skype 中提高了 30%。 微软还承诺在未来的 Skype 变革中支持所有浏览器。Skype团队说:“我们相信,无论你使用什么浏览器或设备,Skype的体验都应该是无缝的、可访问的和可靠的,所以我们正在增加对所有浏览器的支持。我们希望确保无论你使用哪种设备、平台或浏览器,Skype都能给你带来美好的体验”。 其中一些改进现在已经上线,而其他改进将在未来几个月内推出。自定义通知声音是近期新功能的一部分,而新的TwinCam功能让你在通话中添加手机摄像头,似乎会在以后推出。 微软肯定是在关注Skype的广泛改进。这是微软自2014年开始调整Skype以来的最新一次重新设计,随后在2017年进行了类似Snapchat的设计,在2018年进行了另一次重新设计,干掉了类似Snapchat的激进变化,此后又对桌面和移动应用进行了大量修改。 【责任编辑:未丽燕 TEL:(010)68476606】

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

快速体验鸿蒙Liteos-A:IMX6ULL的QEMU系统(Windows版本)

1. 简介 QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,让用户可以更有真实感地使用QEMU来模拟IMX6ULL板子。 1.1 100ASK-QEMU特点: 模拟网卡 模拟LCD显示功能 模拟led灯、按键 模拟at24cxx i2c存储芯片,直接可以通过用户态操作看到效果 模拟触摸屏(单点触摸) 后续会逐渐增加更多的模拟硬件模块 1.2 已经移植的系统 Linux 鸿蒙Liteos-A 2. 使用QEMU 2.1 下载 下载本GIT仓库: git clone https://gitee.com/weidongshan/qemu_image_for_imx6ull.git 也可以直接到文末下载完整的资源包! 如果你下载的是zip包,解压后目录名太长,会导致GUI界面无法显示。 把目录名改短即可。 2.2 体验Linux 双击运行env.bat, 在里面执行linux.bat即可启动Linux,输入root登录。 1. 体验LCD和触摸屏 执行如下命令: [root@qemu_imx6ul:/]# myfb-test /dev/fb0 // 在屏幕上画同心圆 [root@qemu_imx6ul:/]# ts_test // 可在开发板的LCD界面使用鼠标点击、画线 [root@qemu_imx6ul:/]# // 按ctrl+shift+c退出程序 2. 体验LED 执行如下命令,观察开发板上第1个LED: [root@qemu_imx6ul:~]# insmod 100ask_led.ko [root@qemu_imx6ul:~]# ls /dev/100ask_led0 /dev/100ask_led0 [root@qemu_imx6ul:~]# ledtest /dev/100ask_led0 on [root@qemu_imx6ul:~]# ledtest /dev/100ask_led0 off 3. 体验按键 执行如下命令,并在"设备管理器"中点击"buttons"按钮显示出按键的操作界面 [root@qemu_imx6ul:~]# insmod 100ask_led.ko // 如果前面执行过,这里不需要再次执行 [root@qemu_imx6ul:~]# cd button_driver_qemu/ [root@qemu_imx6ul:~/button_driver_qemu]# insmod button_drv.ko [root@qemu_imx6ul:~/button_driver_qemu]# insmod board_100ask_qemu_imx6ull.ko [root@qemu_imx6ul:~/button_driver_qemu]# ./button_led_test 4. 读写I2C EEPROM AT24C02 首先在“设备管理器”中打开at24c02的界面,然后执行以下命令测试: // 0x50是AT24C02的I2C设备地址 [root@qemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 r 0 // 读地址0 data: , 0, 0x00 [root@qemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 w 1 0x58 // 写地址1,写入0x58 效果如下: 5. 通过ssh登录开发板 本GIT仓库中,env.bat启动的是终端软件ConEmu,它比Windows命令行稍微好用点。 但是它不支持键盘的箭头,可以通过ssh登录开发板。 linux.bat中设置了端口转换,如下: 可以使用其他ssh软件,比如MobaXterm通过23端口远程登录开发板,操作更方便。 2.3 体验鸿蒙Liteos-A 双击运行env.bat, 在里面执行harmony_liteos.bat即可启动、进入Liteos-A。 1. 执行shell命令 执行help命令,可以看到支持的SHELL命令,如下: 2. 执行数码相框GUI程序 注意:必须用“./bin/digitpic”,不能用绝对路径“/bin/digitpic”注意:这个GUI程序是我们自己写得,很丑,与鸿蒙无关。 3. 退出程序 执行task命令确定进程号,然后执行“kill -9 PID”杀掉进程,比如: 3. 常见问题 3.1 不能放在中文目录下 否则会提示无法加载文件,比如: 3.2 目录名不能有空格 否则有如下提示: 3.3 目录名太长 如果你下载的是zip包,解压后目录名太长,会导致GUI界面无法显示。 把目录名改短即可。 3.4 ConEmu无法运行 系统原因,错误提示如下: 可以尝试运行另一个程序: 如果ConEmu程序都无法执行,直接双击harmony_liteos.bat或linux.bat,它使用DOS命令行作为终端,有乱码。 3.5 退出程序 注意:ctrl+c是退出QEMU,也就是退出Linux或Liteos-A。 要退出Linux中的当前程序:使用 ctrl+shift+c。 Liteos-A中没有当前程序,只能使用kill命令杀死进程。 3.6 鼠标无法移出开发板界面 当你的鼠标点击QEMU的GUI界面时,鼠标将无法移出这个GUI界面。 这时可以通过快捷键“Ctrl+Alt+g”把鼠标从GUI界面中退出来。 文章后续内容和相关附件可以点击下面的原文链接前往学习 原文链接:https://harmonyos.51cto.com/posts/4507#bkwz 想了解更多关于鸿蒙的内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com/#bkwz

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

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等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册