技术文章

认识长轮询:配置中心是如何实现推送的?

别说谁变了你拦得住时间么 提交于 2021-02-19 10:42:25
一 前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈了。配置中心正是为了解决此类问题应运而生的,特别是在微服务架构体系中,更倾向于使用配置中心来统一管理配置。 配置中心最核心的能力就是配置的动态推送,常见的配置中心如 Nacos、Apollo 等都实现了这样的能力。在早期接触配置中心时,我就很好奇,配置中心是如何做到服务端感知配置变化实时推送给客户端的,在没有研究过配置中心的实现原理之前,我一度认为配置中心是通过长连接来做到配置推送的。事实上,目前比较流行的两款配置中心:Nacos 和 Apollo 恰恰都没有使用长连接,而是使用的长轮询。本文便是介绍一下长轮询这种听起来好像已经是上个世纪的技术,老戏新唱,看看能不能品出别样的韵味。文中会有代码示例,呈现一个简易的配置监听流程。 二 数据交互模式 众所周知,数据交互有两种模式:Push(推模式)和 Pull(拉模式)。 推模式指的是客户端与服务端建立好网络长连接,服务方有相关数据,直接通过长连接通道推送到客户端。其优点是及时,一旦有数据变更,客户端立马能感知到;另外对客户端来说逻辑简单,不需要关心有无数据这些逻辑处理。缺点是不知道客户端的数据消费能力,可能导致数据积压在客户端

JVM

…衆ロ難τιáo~ 提交于 2021-02-19 10:41:42
如果需要热部署,使用“双亲委派”是不行的,如何打破“双亲委派”呢~ 一. 源代码 “双亲委派”源代码如下(ClassLoader.java): public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { //

LTD网站版和系统版两种SaaS版本系统,它们有什么区别?

南楼画角 提交于 2021-02-19 10:37:06
在前不久LTD发布的调价通知中,我们可以看到有“网站版”和“系统版”两种系统。 这两种系统旨在为不同的客户人群、针对不同需求给予更加全面的服务方案。 “网站版”和“系统版”有什么区别? “网站版”系统用户可以免费享受基础建站服务和互动表单、客户管理服务,首年免费第二年续费仅需99元, 而企业网站版则是在基础版至上去除了广告,添加了极速官微和电子名片功能。商城网站版则是在此基础上支持社交商城以及相应的营销应用。 “系统版”的用户则可以在“网站版”的基础上,享受到营销推广功能。 包括手机APP官微中心管理、SEO优化设置、CDN流量增加、多媒体储存容量提升、客户数据回收管理等多项功能,能够体验到完整的营销SaaS服务。 为什么要设定“网站版”和“系统版”? 1、“网站版”的推出,主要是为了满足小微企业和个人在传统的网站升级迭代方面的需求,让这部分客户在成本更低的基础上获得性能更好的网站。 目前仍然有不少企业选择购买虚拟主机、智能建站等服务来进行建站,但其中一部分人搭建出来的网站既不方便分享,又不能同步小程序,还没有社交功能。 因此,我们为这部分客户提供新一代营销SaaS系统,功能更全面、性能更好、价格更低的网站,大大降低了用户购买建站服务的门槛,还能够确保企业网站能够迭代更新。 2、“网站版”的主要服务对象是一部分表示“仅需要网站”的客户群体。 而“系统版”提供的主要是数字化营销的功能

人脸识别/车牌识别系统安防视频云服务EasyCVR支持大华SDK语音对讲

别说谁变了你拦得住时间么 提交于 2021-02-19 09:58:00
TSINGSEE青犀视频平台EasyCVR内,已经能够通过国标GB28181协议实现语音对讲功能,在大华SDK的研发方面,也开发了该功能,本文和大家分享下。 EasyCVR语音对讲主要用于实现本地平台与前端设备所处环境间的语音交互,解决本地平台需要与现场环境语音交流的需求。 调用流程图: 流程说明: 完成SDK初始化流程。 初始化成功后,调用 CLIENT_LoginEx2 登录设备。 调用 CLIENT_SetDeviceMode 参数 emType 为 DH_TALK_SERVER_MODE 将对讲模式设置为服务器对讲模式。 调用 CLIENT_SetDeviceMode 参数 emType 为 DH_TALK_ENCODE_TYPE,设置语音对讲编码信息。 调用 CLIENT_SetDeviceMode 参数 emType 为 DH_TALK_SPEAK_PARAM,设置语音对讲参数。 调用CLIENT_SetDeviceMode 参数emType为DH_TALK_TRANSFER_MODE,设置语音对讲转发模式。非转发模式,即本地PC与登录的设备之间实现语音对讲;转发模式,即本地PC与登录设备相应通道上连接的前端设备之间实现语音对讲。 调用 CLIENT_StartTalkEx,设置回调函数并开始语音对讲。在回调函数中,对于设备发过来的音频数据,用户自行处理

JUnit5学习之一:基本操作

a 夏天 提交于 2021-02-19 09:57:40
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 关于《JUnit5学习》系列 《JUnit5学习》系列旨在通过实战提升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下: 基本操作 Assumptions类 Assertions类 按条件执行 标签(Tag)和自定义注解 参数化测试(Parameterized Tests)基础 参数化测试(Parameterized Tests)进阶 综合进阶(终篇) 本篇概览 本文是《JUnit5学习》系列的第一篇,通过实战学习在SpringBoot框架下JUnit5的基本功能,全篇章节如下: JUnit5简介 SpringBoot对JUnit5的依赖 常用注解简介 5版本已废弃的注解介绍 进入实战环节,先介绍版本和环境信息 创建《JUnit5学习》系列源码的父工程 创建子工程,编码体验常用注解 关于JUnit5 JUnit是常用的java单元测试框架,<font color="blue">5</font>是当前最新版本,其整体架构如下(图片来自网络): 2. 从上图可见,整个JUnit5可以划分成三层:顶层框架(Framework)、中间的引擎(Engine),底层的平台

PHP对接淘宝客api完成APP引流优惠券

我的梦境 提交于 2021-02-19 09:18:44
淘宝客现在对多数人来说已经耳熟能详了,属于CPS(Cost Per Sale),一种网络广告收费标准,以实际销售产品数量来换算广告刊登金额。其他收费标准还有常见的CPC(Cost Per Click 按点击次数收费),和按周期展示收费,周期过后下架等。以前接触这方面也比较少,这里就不详细介绍了,下面开始进入如何从懵圈到把接口对接到APP通过应用的流量实现佣金收入。 注册账号 首先在没有对接api前需要去注册一个阿里几个平台的账号,也可以直接用个人/企业 淘宝账号直接登录。 1.淘宝联盟: https://pub.alimama.com/ 2.淘宝开放平台: http://open.taobao.com/ 申请推广位 登录进淘宝联盟,点击“活动推广”,然后选择“推广管理”,这里看你要做的是什么,是web就选择网站管理,app就选择APP管理。不过不管是网站还是APP都是要有雏形已经上线,网站需要内容足够丰富且有备案,APP需要在某应用市场上架,最后就是新建推广填写表单提交审核即可。 ​ 记录key和Secret和下载SDK 提交完成大概一到三个工作日会有结果,成功后点击“查看权限”这时候就可以把App key记录下来,安卓和苹果是分开的,也就是后面调用接口要按系统传入不同的key和secret了。然后点击“查看”就会进入到淘宝开放平台指定的应用详情

栈------表达式求值

99封情书 提交于 2021-02-19 08:38:04
栈的应用---表达式求值 1.简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00 13.36 Source 浙大计算机研究生复试上机考试-2006年 #include <iostream> #include <stack> #include < string > #include <cstdio> using namespace std; stack < double > opnd; // 运算对象栈 stack< char > optr; // 运算符号栈 void f() // 取栈顶元素运算 { double tmp; char key= optr.top(); optr.pop(); double x= opnd.top(); opnd.pop(); double y= opnd.top(); opnd.pop(); switch

栈运用之——中缀表达式到后缀表达式的转换及运算

孤街浪徒 提交于 2021-02-19 08:37:51
利用栈可以很方便实现中缀表达式到后缀表达式的转换,下面来介绍具体规则: 从左至右遍历中缀表达式,将运算符入栈 遇到操作数,直接输出,添加到后缀表达式; 栈为空时,遇运算符,直接入栈; 遇到左括号,直接入栈; 遇左括号,执行出栈,直至弹出的左括号,括号不输出; 遇其他运算符:加减乘除,弹出所有优先级 大于 或 等于 该运算符的栈顶元素,然后将该元素入栈; 最终将栈中元素依次出栈。 例:(a+b)*c*(d-e/f) ————> ab+c*def/-* 下面我们再来看后缀表达式的运算,规则如下: 从 左至右遍 历表达式,遇到 数字 就进 入栈 ;遇到符号,则将 栈顶的两个元素 拿出,第一个栈顶元素作为 操作数 ,第二个栈顶元素作为 被操作数 ,进行运算,然后将结果 入栈 。 来源: oschina 链接: https://my.oschina.net/u/2835802/blog/745339

香橙派R1 Plus开发板使用OpenWRT镜像的操作说明

天涯浪子 提交于 2021-02-19 08:28:59
香橙派 R1 Plus 电脑开发板 采用瑞芯微RK3328 四核64位处理器,拥有1GB DDR4内存、双千兆网口、TF卡插槽、散热风扇接口等功能接口,支持openWRT等操作系统,板子其中一个千兆网口是 USB3.0 转接的,实测转发速率能达到900MB以上 , 适合作为家庭路由器使用,其中,r1plus的openwrt系统已经配置好,可以直接用作路由器。 openwrt镜像的安装和烧写 Linux 镜像的方法是一样的,大家可以参考下香橙派官方的使用手册。下文对系统的使用做简单的说明: 1、OpenWRT 版本 2、OpenWRT 系统默认登录账号和密码 使用前建议先更改一个比较安全的密码用于 web 登录和 ssh 登录。 3. 第一次启动前扩容 TF 卡中的 rootfs 1) 烧录完 OpenWRT 的镜像后,需要手动对系统 rootfs 进行扩容,才能使用 TF 卡 全部空间 2) 首先在 Ubuntu PC 上安装 gparted 3) 用读卡器将烧录好 OpenWRT 镜像的 TF 卡插入电脑,并打开 gparted,在右上角 选择你的 TF 卡,一般为/dev/sdb 4) 右键点击你要扩容的那个分区,选择“更改大小/移动” 5) 将未分配的空间全部分配给 rootfs,将滑块拖到最右边,然后点击“调整大小/ 移动” 6) 点击上方的“√”,并点击“应用

【Qt开发】StyleSheet使用总结

人盡茶涼 提交于 2021-02-19 08:26:17
概述 转眼七年过去了,我是一个彻底拥抱过MFC的人,记得老大的一个需求要把按钮做成圆角,并添加背景颜色,做前端html的可能认为很简单,然而放到MFC上那可真的是很...很麻烦的,自定义类继承Button ,新手估计还搞不定,怎么也有上百行代码,实在不友好,Qt诞生大大简化了这些工作,只需要使用QSS(Qt Style Sheet)就可以轻松做到,最近详细了解了QSS,做了个百度网盘的登录界面,整理好我会把源码放出来,供大家参考。 QSS语法 background-color:rgb(6, 168, 255);    背景色 color:red;                字体颜色 border-radius:5px;            边框圆角半径 border:2px solid green;         边框2像素,实现,绿色 font:10pt;               字体大小10 设置QSS方法 方法一:UI界面设置 鼠标到按钮上右键,"改变样式表",在编辑样式表对话框中添加QSS样式。 方法二:程序添加 每一个控件都有 setStyleSheet (const QString &styleSheet)方法,样式字符串直接传参即可,例: ui.pushButton1->setStyleSheet("QPushButton{background-color