首页 文章 精选 留言 我的

精选列表

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

ECS建站很easy

云服务器 Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务。使用ECS无需采购硬件设备,只需根据业务需要,随时创建实例。 ECS 实例是一个虚拟的计算环境,一个实例就等同于一台虚拟机。 了解了ECS是什么,那又该怎么用呢?如何把自己的网站部署在阿里云ECS上? 简版步骤来袭,尊的灰常容易(前提是你得买好ECS啊,优惠券拿去用~https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=5la9okbu&utm_source=5la9okbu): tips:紫色高亮部分是你需要输入的代码,可以直接复制粘贴,……是安装进程,不用管,看到关键词password让你输密码就输密码,看到complete就是安装成功了。黑色盖住的部分是你的主机,怎么能让你知道我的呢,当然要打马赛克啦~ 1. 下载个putty,用putty 连IP,默认SSH协议,22端口 2. 登录ECS服务器,用户名root,密码你懂的 3. 配apache login as: root root@IP地址's password:(输密码不显示,不是没输上) Welcome to aliyun Elastic Compute Service! [root@iZuf687rahr7p93eokhxlwZ ~]# yum -y install httpd(安装apache,注意空格) …… …… …… httpd-tools.x86_64 0:2.2.15-60.el6.centos.6 Complete!(安装成功) [root@iZuf687rahr7p93eokhxlwZ ~]# adduser -d /var/www/html siteadmin(添加一个Linux用户 siteadmin 并指定新增用户的远程登录默认访问路径为 /var/www/html) ………… ………… [root@iZuf687rahr7p93eokhxlwZ ~]# passwd siteadmin(设密码) Changing password for user siteadmin. …… …… passwd: all authentication tokens updated successfully. [root@iZuf687rahr7p93eokhxlwZ ~]# chown -Rf siteadmin.siteadmin /var/www/html(授予siteadmin 用户权限) [root@iZuf687rahr7p93eokhxlwZ ~]# service httpd start(启动apache) Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.16.1.116 for ServerName [ OK ](启动成功) [root@iZuf687rahr7p93eokhxlwZ ~]# 4. 浏览器输入公网IP,出apache欢迎页 5. Filezilla 输公网IP即主机地址,用户名siteadmin,密码自己设置的,端口22,连ECS 6. 把网站程序和页面解压后拖拽到ECS的/var/www/html路径的 空目录列表 中 7. 刷新浏览器公网IP,出现网站首页。

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

管理 Kubernetes 应用,So easy!

您可能会遇到的挑战 在云环境中,应用发布与管理会变得十分复杂。本地开发完成的应用需要登录到每一台服务器进行发布和部署;后续还会有应用的重启,扩容等。服务器的不断增加对于运维人员将是一个极大的挑战。 开发/测试/线上环境差异性,交付流程复杂,新应用上线效率低,风险高。 针对该挑战,如何应对? 企业级分布式应用服务(EDAS)提供了一个可视化的控制台,同时支持普通应用(WAR/JAR部署)和Kubernetes应用(通用Docker镜像部署)两种应用类型,无论集群规模多大,都可以在控制台上轻松地进行应用生命周期管理和运维。 EDAS 为 Kubernetes 应用全新打造如下功能 镜像化部署 Kubernetes应用以通用Docker镜像部署,支持私有,阿里云和官方Docker镜像。能一键部署通用服务Redis,mysql,nginx等,秒级启动,极大提升交付效率。 应用生命周期管理 EDAS提供了完整的kubernetes应用生命周期的管理,包括创建,部署升级,应用扩缩和删除应用等。 Kubernetes应用生命周期管理主要包含应用发布、管理、配置三大类功能: 应用发布包含:应用创建、部署升级; 应用管理包含:应用扩缩、删除应用; 应用配置包含:容器高级设置(如增加或修改环境变量等)、负载均衡、更改规格等设置。 提供负载均衡能力和故障自动修复 Kubernetes应用分为有状态和无状态两种类型。当前版本只支持无状态应用。无状态应用可以有多个Pod,系统自动关联SLB,提供负载均衡能力,让请求随机分配给Pod处理。外部进入的流量可以通过负载均衡进行分流。 在无状态应用的Pod运行失败或出现故障时,可以自动重启或者快速迁移,保证应用的高可用。但无状态应用重新部署时不保存实例数据。 立即在 EDAS 上发布第一个 Kubernetes 应用吧。如何上手? 还不了解企业级分布式应用服务(EDAS)?看这里

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

So Easy~

演练事件处理程序有点难 ECS实例系统事件是影响实例运行状态的有计划或非预期事件。为了ECS实例上的业务平稳运行,最佳的做法是通过程序自动化地处理事件。您可以参考这篇文章:使用OpenAPI自动化处理ECS系统事件但这里有一个问题,程序写完了不好测试。系统事件是系统在特定场景下生成的,不一定能人工触发;ECS实例跑的很稳定,总是不出问题,几个月也没等到一个事件。我们需要一种方式来方便地演练事件处理程序。 ECS演练OpenAPI ECS提供了一对用来演练事件处理程序的OpenAPI:CreateSimulatedSystemEvents和CancelSimulatedSystemEvents,分别用来创建和取消模拟系统事件。什么是模拟系统事件?模拟系统事件是专门用来演练系统事件处理程序的。通过设置一个模拟系统事件,您可以从OpenAPI

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

so easy

近年来随着互联网强势的发展浪潮,越来越多的企业选择跨境出海,扩展海外市场。而想要在一个陌生市场最快速地吸引到用户,一定不能缺少的就是丰富多样的各类活动。然而活动在带来大流量的同时,也带来了一些问题,比如以下这些状况: 秒杀活动开启后,活动页面崩溃 限时抢购活动,用户点击抢购按钮无反应 游戏活动期间,用户无法登陆 活动期间,用户支付失败 这些活动很容易吸引非常多的用户,在同一时间段涌入同一个 App 或者页面。这使得短时间内对服务器的并发请求数激增,很容易导致服务器崩溃。我也是在了解这些后,才知道每年我参与秒杀活动失败的真正原因。 什么是高并发 了解高并发之前,我们要先知道并发数是什么?并发数是指系统同时能处理的请求数量,这也是反应系统的负载能力的指数之一。 高并发是指在同一个时间点内出现大量用户请求访问服务器,这些请求其实是 update 修改数据库数据,通常在接到请求后 update 会进行锁表,等待一个请求执行完毕后才能处理下一个请求。而如果客户请求累计的数量超过了数据库链接限制,服务器会返回链接超时。同时请求过多,还会导致同一条数据添加两次,无法保证数据的一致性。 而跨境业务因为身处全球不同的网络环境、发展程度、运营模式、拥堵程度的场景下,很难针对高并发进行可用性和容错性的性能优化。偏偏跨境业务想要扩展又免不了要面对网站促销、活动并发、临时流量突发的状况。如果你无法智能调控分配带宽,就会让服务负载压力过大,进而影响网络连通性,导致用户流失。 同时,相较于国内,跨境业务面对恶意攻击的发生概率直线上升,例如 DDoS 攻击就是其中一种。事实上,DDoS 是另一种形式的高并发。面对这种恶性行为,如果自主的服务器和带宽没有一定的防攻击能力,可能会造成大量的用户流失。 考虑到成本和时间问题,接入云服务商成了不二选择。 又拍云海外加速 又拍云服务集合分布式架构、大带宽负载均衡网关、OpenStack 虚拟化云处理,打造集松耦合、可弹性扩容、集中资源池化的高效能服务。 可用性 又拍云担负着庞大数据,对于处理大流量请求有着丰富经验,能够保证提供稳定可靠的高可用服务。 又拍云采用边缘计算的分布式网络架构,全球 Anycast 网络覆盖 90 个国家,200 多个城市,可以让客户端数据优先选择就近节点进行分析、处理和存储,摒除跨运营商访问的延迟和卡顿,保证数据传输稳定流畅。 同时边缘节点完成部分处理,也能减轻数据中心集中处理的压力,进一步减少过度访问之类情况的出现,保证服务稳定可用。配合分段缓存预加载功能,能有效降低源站带宽压力,避免因为突发大量请求导致的源站崩溃。 又拍云海外加速服务同时支持 TLS 1.3,HTTP/2 和 AMP 等最新的 Web 标准,并允许部署自定义 JavaScript,依靠分布式网络架构能够快速将更新同步至全球节点。 容错性 又拍云针对跨境业务对于网关和数据网关的高并发性能需求,进行了针对性的大流量大并发的网关改造。 同时针对突发性高并发请求,系统每 5 分钟一次进行一次数据采样,根据实时数据自动调度。一旦有服务器出现硬件故障,就会自动识别并剥离出集群,从而保证服务器集群部署负载均衡,不影响用户每一次的实际访问。 此外考虑到用户源站可能出现的问题,又拍云海外加速提供对应容灾机制,支持用户多个源站地址自主设置主备关系及各自轮询权重,进一步减少因高并发引发的故障问题。 安全性 海外业务发展过程中,经常会面对各类恶意攻击,比如 DDoS 攻击就是攻击方对用户源站发送尽可能多的网络访问请求,形成流量洪流来冲击源站系统。 针对攻击,又拍云海外加速拥有强大的流量攻击防护能力,除去 T 级别的全网流量调度和清洗外,也支持 TCP、UDP、HTTP/HTTTPS 等多种协议,可防护 SYN Flood、ACK Flood、UDP Flood、CC 等多种类型攻击。 基于多年网站运维及防护经验,又拍云海外加速提供方式针对性护措施,以保护源站安全和业务的正常访问: 又拍云 CDN 网络能够隐藏源站地址,避免源站被 DDoS 流量直接攻击,确保源站的访问正常; 又拍云安全防护部署了多个高防服务器,具有较强抗攻击、抗干扰、安全性能好的特性,帮助网站直接拒绝 DDoS 攻击; 调度平台将攻击流量牵引至就近的清洗节点清洗,并将清洗后的流量回源到服务器,确保正常流量的访问。 特有分布式网络架构则也保证了新规则能在 30s 内实现全球同步,针对每一次攻击试试更新专有防御规则,进一步减少攻击带来的站点崩溃,保证正常用户的流畅访问。 推荐阅读 跨境电商 2 大技术难题,到底该如何解决? 游戏出海浪潮下,这些技术难点该如何攻克

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

在Vue中使用JSX,很easy的

摘要:JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javascript 的灵活性,同时又兼具 html 的语义化和直观性。 本文分享自华为云社区《在 Vue 中如何使用 JSX,就这么简单!【建议收藏】》,作者:纸飞机 。 JSX是什么 JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javascript 的灵活性,同时又兼具 html 的语义化和直观性。(个人建议灵活度强的部分组件可以用JSX来代替,整个项目JSX属实没必要) XML学习地址(学与不学可随意,了解就ok):https://www.w3school.com.cn/xml/index.asp 用template的弊端:https://www.mk2048.com/blog/blog_h1c2c22ihihaa.html 为什么要在 Vue 中使用 JSX 有时候,我们使用渲染函数(render function)来抽象组件,渲染函数不是很清楚的参见官方文档, 而渲染函数有时候写起来是非常痛苦的,所以只需要有个了解。 渲染函数:https://cn.vuejs.org/v2/guide/render-function.html#%E5%9F%BA%E7%A1%80 createElement( 'anchored-heading', { props: { level: 1 } }, [ createElement('span', 'Hello'), ' world!' ] ) 其对应的模板是下面: <anchored-heading :level="1"> <span>Hello</span> world! </anchored-heading> 你看这写起来多费劲,这个时候就派上 JSX 上场了。在Vue 中使用 JSX,需要使用 Babel 插件,它可以让我们回到更接近于模板的语法上,接下来就让我们一起开始在 Vue 中写 JSX 吧。 创建项目并配置Babel vue create vue-jsx # 选择vue2的 安装依赖: npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props # or yarn add @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props 配置 .babelrc(babel.config.js) : module.exports = { presets: [ '@vue/cli-plugin-babel/preset', ['@vue/babel-preset-jsx', { 'injectH': false }] ] } 配置后我们启动项目: yarn serve demo结构图: 配置了babel.config.js后,我们把App.vue引入的HelloWorld.vue改为HelloWorld.js,并且删除HelloWorld.js中关于template和style,以及script标签。 export default { name: 'HelloWorld', props: { msg: String } } JSX基础用法 这里展示在 Vue 中书写一些基础内容。 纯文本、动态内容、标签使用、自定义组件、样式和class import myComponent from './myComponent' import './HelloWorld.css' // 创建一个组件button const ButtonCounter = { name: "button-counter", props: ["count"], methods: { onClick() { this.$emit("change", this.count + 1); } }, render() { return ( <button onClick={this.onClick}>数量 {this.count}+</button> ); } }; export default { name: 'HelloWorld', components: { myComponent }, data () { return { text:'hello 纸没了飞机', inputText:'我吃了', count: 0 } }, props: { msg: String }, watch: {}, methods: { onChange(val) { this.count = val; alert(this.count) } }, render() { // const {text,inputText,count} = this //通过解构,下方return片段中就不需要this return ( <div> <h3>内容</h3> {/* 纯文本 */} <p>hello, I am Gopal</p> {/* 动态内容 */} <p>{ this.text }</p> <p>hello { this.msg }</p> {/* 输入框 */} <input/> {/* 自定义组件 */} <myComponent/> <ButtonCounter style={{ marginTop: "10px" }} count={this.count} type="button" onChange={this.onChange} /> </div> ); } } 题外话:创建组件那里大家可以多学学const 创建的ButtonCounter组件的那种方式。在React中也是经常会这么创建的。 这么看的话和在template里写没有多大区别,标签该是啥还是啥没有变化。那么这么一想的话,style呢,class呢?接下来就是style和class样式的写法(包括动态样式) 我们先给h3绑定一个class为colorRed: <h3 class="colorRed">内容</h3> 审查元素发现直接写class绑定是可以的: 那么class的样式怎么写呢?毕竟js文件里写<style></style>貌似是不行的! 1、全局样式 App.vue <style> .colorRed{ color: red; } </style> 2、引入一个css文件或者配合style-loader引入一个less、sass、stylus文件 注意:都需要安装配置对应的loader,既然都是JSX了,那我们用stylus来讲解下,相信less、sass大家都会了。stylus是一个省略了{},靠缩紧来识别的css编译器。(不想用stylus可跳过,样式这块可随意) yarn add global stylus yarn add --dev stylus stylus-loader 各种style安装见:https://www.cnblogs.com/jimc/p/10265198.html 安装完成后新建HelloWorld.styl,然后引入。 stylus的使用:https://www.jianshu.com/p/5fb15984f22d stylus官网:https://stylus.zcopy.site/ 控制台stylus报错见:https://blog.csdn.net/csdn_zhoushengnan/article/details/109448369 vscode编辑期报错:安装编辑器stylus语法插件,并重启 效果: 行内样式style: <p style="color:blue">hello, I am Gopal</p> 动态绑定class和style <p style={this.isGreen?'color:green':''}>{ this.text }</p> <p class={this.isYellow?'colorYellow':''}>hello { this.msg }</p> <p style={this.isRed?colorRed:''}>红色的文字</p> 属性绑定和普通HTML一样的 毕竟class和style可都是html的属性,这点相信大家都知道的。 <input placeholder="我是placeholder" /> <input placeholder={placeholderText} /> {/* 解构N个属性,要啥放啥 */} <div {...attrObj} /> 效果: 常用指令 template常用指令:v-html | v-text、v-if、v-for、v-modal等。template的指令在JSX是无法使用的,故需要一些写法,请看下面。 我新建个instructions.js用来示范指令这块。在App.vue中引入。 v-html | v-text 在 JSX 里面,如果要设置 dom 元素的 innerHTML,就用到 domProps。 render() { const { htmlCode } = this return ( <div> <div domPropsInnerHTML={htmlCode}></div> </div> ); } 虽然v-text有domPropsInnerText,但没有用的必要。 v-if 分简单的和复杂的。 简单: render() { let bool = false return ( <div> { bool ? <button>按钮1</button> : <button>按钮2</button>} </div> ); } 复杂: render() { let num = 3 if(num === 1){ return( <button>按钮1</button> ) } if(num === 2){ return( <button>按钮2</button> ) } if(num === 3){ return( <button>按钮3</button> ) } } v-for 就使用 map 方法来实现,在react中也是如此。 render(h) { var list = [1,2,3] return( <div> { list.map(item => <button>按钮{item}</button>) } </div> ) } v-modal 注意:新版 vue-cli4 中,已经默认集成了 JSX 语法对 v-model 的支持,可以直接使用 <input v-model={this.value}> 如果你的项目比较老,也可以安装插件 babel-plugin-jsx-v-model 来进行支持 我可是cli4,我来验证下: 验证结果:(通过) 当然以上两种方式你都不想搞,你也可以手动支持,这就涉及到监听事件了,请向下看。 监听事件及事件修饰符 监听事件想到用 onChange, onClick等。 需要注意的是,传参数不能使用 onClick={this.removePhone(params)},这样子会每次 render 的时候都会自动执行一次方法 应该使用 bind,或者箭头函数来传参 methods: { handleClick(val){ alert(val) } }, <button type="button" onClick={this.handleClick.bind(this, 11)}>点击bind</button> <button type="button" onClick={() => this.handleClick(11)}>点击箭头函数</button> 上面提到的用过监听事件来实现v-modal <input type="text" value={this.text} onInput={this.input}/> methods: { input(e){ this.text = e.target.value } }, 除此之外,还可以使用对象的方式去监听事件: render() { return ( <input value={this.content} on={{ focus: this.$_handleFocus, input: this.$_handleInput }} nativeOn={{ click: this.$_handleClick }} ></input> ) } 其他事件的使用同理都是加on。 事件修饰符 和指令一样,除了个别的之外,大部分的事件修饰符都无法在JSX中使用,这时候你肯定已经习惯了,肯定有替代方案的。 .stop : 阻止事件冒泡,在JSX中使用event.stopPropagation()来代替 .prevent:阻止默认行为,在JSX中使用event.preventDefault() 来代替 .self:只当事件是从侦听器绑定的元素本身触发时才触发回调,使用下面的条件判断进行代替 if (event.target !== event.currentTarget){ return } .enter与keyCode: 在特定键触发时才触发回调 if(event.keyCode === 13) { // 执行逻辑 } 除了上面这些修饰符之外,尤大大为了照顾我们这群CV仔,还是做了一点优化的,对于.once,.capture,.passive,.capture.once,尤大大提供了前缀语法帮助我们简化代码 render() { return ( <div on={{ // 相当于 :click.capture '!click': this.$_handleClick, // 相当于 :input.once '~input': this.$_handleInput, // 相当于 :mousedown.passive '&mousedown': this.$_handleMouseDown, // 相当于 :mouseup.capture.once '~!mouseup': this.$_handleMouseUp }} ></div> ) } 如果有参数传递给方法,不能直接(参数),会在页面中立即触发,需要我在下面这种写法: clickOnce(val) { alert(val); }, <button type="button" on={{ '~click': ()=>this.clickOnce('只能点一次'), }} > 事件修饰符点击一次 </button> 使用范围(结合第三方ui组件) 不仅仅在 render 函数里面使用 JSX,而且还可以在 methods 里面返回 JSX,然后在 render 函数里面调用这个方法。并且也可以直接使用例如elementui等ui组件。 JSX 还可以直接赋值给变量、例如使用elementui的el-dialog。(您在测试该案例时记得安装elemnt) methods: { $_renderFooter() { return ( <div> <el-button>确定</el-button> <el-button onClick={ () =>this.closeDialog() }>取消</el-button> </div> ); }, openDialog(){ this.visible = true }, closeDialog(){ this.visible = false } }, render() { const buttons = this.$_renderFooter(); return ( <div> <Button onClick={ () =>this.openDialog() }>打开Dialog</Button> <el-dialog visible={this.visible}> <div>弹窗内容</div> <template slot="footer">{buttons}</template> </el-dialog> </div> ); } 插槽 插槽就是子组件中提供给父组件使用的一个占位符,插槽分为默认插槽,具名插槽和作用域插槽,下面我依次为您带来每种在JSX中的用法与如何去定义插槽。 默认插槽 使用默认插槽 使用element-ui的Dialog时,弹框内容就使用了默认插槽,在JSX中使用默认插槽的用法与普通插槽的用法基本是一致的,如下代码所示: render() { return ( <ElDialog title="弹框标题" visible={true}> {/*这里就是默认插槽*/} <div>这里是弹框内容</div> </ElDialog> ) } 自定义默认插槽 在Vue的实例this上面有一个属性slots,这个上面就挂载了一个这个组件内部的所有插槽,使用this.slots,这个上面就挂载了一个这个组件内部的所有插槽,使用this.slots.default就可以将默认插槽加入到组件内部。 export default { props: { visible: { type: Boolean, default: false } }, render() { return ( <div class="custom-dialog" vShow={this.visible}> {/**通过this.$slots.default定义默认插槽*/} {this.$slots.default} </div> ) } } 使用: <myComponent visible={true} slot>我是自定义默认插槽</myComponent> 另vShow相当于 v-show,不代表别的也可以这样! 具名插槽 使用具名插槽 有时候我们一个组件需要多个插槽,这时候就需要为每一个插槽起一个名字,比如element-ui的弹框可以定义底部按钮区的内容,就是用了名字为footer的插槽。 render() { return ( <ElDialog title="弹框标题" visible={true}> <div>这里是弹框内容</div> {/** 具名插槽 */} <template slot="footer"> <ElButton>确定</ElButton> <ElButton>取消</ElButton> </template> </ElDialog> ) } 自定义具名插槽 在上节自定义默认插槽时提到了slots,对于默认插槽使用this.slots,对于默认插槽使用this.slots.default,而对于具名插槽,可以使用this.$slots.footer进行自定义。 render() { return ( <div class="custom-dialog" vShow={this.visible}> {this.$slots.default} {/**自定义具名插槽*/} <div class="custom-dialog__foolter">{this.$slots.footer}</div> </div> ) } 使用: <myComponent visible={true}> <template slot="footer"> <ElButton>确定</ElButton> <ElButton>取消</ElButton> </template> </myComponent> 作用域插槽 使用作用域插槽 有时让插槽内容能够访问子组件中才有的数据是很有用的,这时候就需要用到作用域插槽,在JSX中,因为没有v-slot指令,所以作用域插槽的使用方式就与模板代码里面的方式有所不同了。比如在element-ui中,我们使用el-table的时候可以自定义表格单元格的内容,这时候就需要用到作用域插槽。 <myComponent1 visible={this.visible} {...{ scopedSlots: { test: ({ user }) => { // 这个user就是子组件传递来的数据,同理可这样拿到el-table的row,不过test得是default,不过案例还是我这样 <div style="color:blue;">快来啊,{user.name},看看这个作用域插槽</div> }, }, }} ></myComponent1> 自定义作用域插槽 子组件中通过 {this.$scopedSlots.test({ user: {name:‘纸飞机’}})} 指定插槽的名称是 test,并将 user 传递给父组件。父组件在书写子组件标签的时候,通过 scopedSlots 值指定插入的位置是 test,并在回调函数获取到子组件传入的 user 值 注意:作用域插槽是写在子组件标签中的,类似属性。而不是像具名插槽放在标签内部 新建个作用域插槽.js // 一个为jsx的子组件(玩玩插槽) export default { name: "myComponent", data() { return { }; }, props: { visible: { type: Boolean, default: false, }, listData: { type: Array, default: function() { return []; }, }, }, render() { return ( <div vShow={this.visible}> {/**自定义作用域插槽*/} <div class="item"> {this.$scopedSlots.test({ user: {name:'纸飞机'} })} </div> </div> ); }, }; 效果: 函数式组件 函数式组件是一个无状态、无实例的组件,详见官网说明,新建一个 FunctionalComponent.js 文件,内容如下: // export default ({ props }) => <p>hello {props.message}</p>; // 或者推荐下方写法 export default { functional: true, name: "item", render(h, context) { console.log(context.props) return <div style="color:red;font-size:18px;font-weight:bold">{context.props.message}</div>; }, }; HelloWorld.js中使用: <funComponent message="展示下函数式组件"></funComponent> 效果: 代码地址 https://codechina.csdn.net/qq_32442973/vue2-jsx-demo.git 后记 无论你是要用vue2的jsx还是vue3的jsx都没有本质区别,毕竟vue3是向下兼容vue2的;倘若你真的要学vue3的JSX,我建议你学完vue2的再去学;另我不推荐在vue中所有的组件和页面都用JSX,两者需要权衡利弊;同时也不必担心JSX和template的相互嵌套,两者是可以互相嵌套的。 参考: https://www.cnblogs.com/ainyi/p/13324222.html https://www.jb51.net/article/205764.htm https://cn.vuejs.org/v2/guide/render-function.html#事件-amp-按键修饰符 https://www.cnblogs.com/htoooth/p/6973238.html https://www.jianshu.com/p/84b708c80598 https://cloud.tencent.com/developer/article/1704608 点击关注,第一时间了解华为云新鲜技术~

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

Easy Retry 发布第一个 1.0.0

分布式系统大行其道的当前,系统数据的准确性和正确性是重大的挑战,基于CAP理论,采用柔性事务,保障系统可用性以及数据的最终一致性成为技术共识 为了保障分布式服务的可用性,服务容错性,服务数据一致性 以及服务间掉用的网络问题。依据"墨菲定律",增加核心流程重试, 数据核对校验成为提高系统鲁棒性常用的技术方案 特性 易用性业务接入成本小。避免依赖研发人员的技术水平,保障重试的稳定性 灵活性能够动态调整配置,启动/停止任务,以及终止运行中的重试数据 操作简单分钟上手,支持WEB页面对重试数据CRUD操作。 数据大盘实时管控系统重试数据 多样化退避策略Cron、固定间隔、等级触发、随机时间触发 容器化部署服务端支持docker容器部署 高性能调度平台支持服务端节点动态扩容和缩容 多样化重试类型支持ONLY_LOCAL、ONLY_REMOTE、LOCAL_REMOTE多种重试类型 重试数据管理可以做到重试数据不丢失、重试数据一键回放 支持多样化的告警方式邮箱、企业微信、钉钉、飞书 客户端与服务端数据交互图 #系统架构图 分布式系统重试的重要性 在分布式系统中,由于网络延迟、节点故障、消息丢失等原因,操作可能会失败。重试机制在分布式系统中显得尤为重要,以下是一些原因: 网络不可靠性:在分布式系统中,由于网络的不可靠性,消息可能会丢失或延迟。重试机制可以确保消息被发送和接收,从而提高系统的可靠性和消息传递的可靠性。 事务处理:在分布式系统中,事务可能会因为网络延迟等原因失败。重试机制可以确保事务被正确提交,从而保证数据的最终一致性。 节点故障:分布式系统可能会由于节点故障而导致部分或全部服务不可用。重试机制可以确保节点重新启动后,服务能够自动恢复并继续运行。 提高系统可用性:重试机制可以确保在发生异常情况时,系统能够尝试自动恢复,避免出现系统宕机或无响应的情况,从而提高系统的可用性和稳定性。 重试机制在分布式系统中非常重要,可以提高系统的可靠性、性能和消息传递的可靠性,同时还可以确保数据的一致性和服务的可用性。 重试的风险 重试放大风险: 这种指数放大的效应很可怕,会加大直接整体系统的负载,最坏情况下被调用的服务流量可能放大到r倍,不仅不能请求成功,导致整体的负载继续升高,甚至直接打挂 无限重试问题: 如果不设置重试次数会使得业务线程一直被重试占用,这样会导致服务的负载线程暴增直至服务宕机. 数据安全: 基于内存重试会可能造成数据丢失风险 网络阻塞: 重试次数过多或重试间隔时间过短,就有可能导致大量的请求同时发送,从而导致网络拥塞和负载增加。 业内成熟重试组件对比 区别 SpringRetry GuavaRetry EasyRetry 编程语言 Java Java Java 退避策略 支持多种策略 支持多种策略 支持多种策略 依赖生态 Spring 框架 不依赖任何框架 Spring框架、GuavaRetry 重试类型 内存重试 内存重试 多种策略 内存重试+服务重试 存储介质 内存 内存 内存+数据库 是否管控重试流量 否 否 支持多维度管控(单机重试管控、链路重试管控、重试流速管控等) 数据安全 会丢失重试数据 会丢失重试数据 基于LOCAL_REMOTE或ONLY_REMOTE持久化数据 管理重试数据 不支持 不支持 支持暂停、停止、新增、修改重试数据

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册