首页 文章 精选 留言 我的

精选列表

搜索[在线课堂],共10010篇文章
优秀的个人博客,低调大师

链课堂01 | 解密超级账本-Fabric运行机制

01 引言 区块链已成为当下最受关注的技术。从最初比特币的爆红,到基于以太坊的ICO项目遍地开花,大众的目光被各类应运而生的加密货币牵引着,交易投资的热情日益高涨。相比之下,区块链技术相关的企业项目却没有得到太多关注。 然而,国内众多知名企业,如京东、华为等,都在积极部署企业级的区块链项目。并且,他们无一例外地选择了可监管、部分去中心化、高性能的联盟链。 联盟链究竟有何“魅力”,能得到如此多大企业的青睐?今天,小编将通过介绍一个基于联盟链的项目—Hyperledger Fabric,为大家抛砖引玉。 说起联盟链,就不得不提到超级账本(Hyperledger)。它是linux基金会下的一个区块链项目,由科技公司如IBM、英特尔,金融公司如GP摩根,以及其他联合机构于2015年提出。目前,Hyperledger已有140多个成员,其中1/4来自中国。中国技术组主要由万达、华为、IBM构成,职责包括中国地区及中国会员的需求提供,以及代码的推进。大量基于超级账本技术的企业界区块链项目已经成功落地。 Hyperledger包括4个框架项目:Sawtooth、Iroha、Fabric、Burrow。Fabric是其中最广为人知的一个,也是最早加入超级账本的顶级项目。它具有完备的权限和审查管理、细粒度的隐私保护,以及可插拔、可扩展的实现框架。目前代码提交数量近6000次,核心代码约10万行,可以说是一个相当的活跃的项目。 本文将主要介绍Fabric的运行机制和原理,之后还会陆续更新包括更深层的Fabric开发指南,及更广阔的Fabric应用场景和实例等内容,大家敬请期待。 02 架构 Fabric在2017年7月发布1.0正式版,相对于实验版本(发布于2016 年 9 月),在扩展性、可维护性、安全性、业务隔离等方面实现大幅度的提升和改进,更加接近于企业级应用场景。下面,我们直接通过1.0版本进入Fabric的世界。 图1. Fabric 1.0 架构图 图2. 运行时架构 Identity,也就是身份管理。由于身份管理的重要性,Fabric把原有的Membership service抽离出来作为单独的模块Fabric-CA。Fabric作为非许可网络,采用数字证书机制来实现对身份的鉴别和权限控制,CA节点实现了PKI服务,负责对身份证书的生成、撤销等。 Chaincode(链码)源自智能合约的思想,并进行了进一步扩展,支持Java、Go等高级编程语言。运行时靠容器和状态机实现处理逻辑。 Blockchain&Transactions,Fabric采用和公有链类似的区块链存储结构。运行时有File System(Blockchain)、Block Index、World State、History Index四个存储结构,其中World State存储一组变量的集合,支持CouchDB,提供丰富的富查询接口。 图3. 账本存储 底层采用P2P网络和gRPC协议实现对分布式账本结构的连通,包括Peer、OSNs、Client等参与角色。通过Gossip协议进行状态同步、数据分发和成员探测。 除了基于命令行的客户端外,Fabric提供多种语言的SDK,包括Node.js、Python、Java、Go等,SDK封装了底层gRPC接口的调用,提供更完善的客户端和开发支持。在区块链网络里,节点和chaincode会发送events来触发一些监听动作,方便与其他外部系统的集成。 03 多通道 图4.多通道示例 通道(channel)与绑定到该通道上的配置和数据(包括交易、账本、链码实例、成员身份等),一起构成一条完整的区块链(Chain)。Peer节点可以基于应用访问控制策略来订阅任意数量的通道,这些Peer只接受订阅通道上的区块数据。通道与通道之间数据相互隔离和保密,通道外的成员无法访问通道内数据。 04 交易流程 图5. Fabric交易流程 客户端(SDK)登录CA获得签名证书(ECert)。 客户端(SDK)向一定的背书节点(Endorser)发送交易请求(Proposal)。 背书节点(Endorser)进行权限检验,并模拟Chaincode交易,结果Yes/No,并签名返回背书结果(Endorserment)。 客户端(SDK)收到足够多的背书(Endorserment),检查背书数量及是否合法。 客户端(SDK)把经过背书的交易发送到排序节点(Orders)。 排序节点(Orders)对读写集排序,并根据出块配置构造区块(Block)。并发送区块到确认节点(Committer)。 确认节点(Committer)对区块(Block)、交易读写集、背书策略等进行校验,写入Blockchain并更新World State DB。 05 共识机制 在0.6版本,Fabric支持PBFT(实用拜占庭容错算法)共识算法,1.0及以后版本中不再支持。之所以把0.6版本中的PBFT共识算法暂时取消可能是因为: 1、PBFT提供(n-1)/3的容错性,但是O(N^2)消息复杂度使得随着节点的增加,交易性能大幅下降。 2、Fabric是准入型网络,对PBFT这种共识算法要求不高。 Fabric 1.0版本共识过程包括背书、排序、和验证三个环节的保障。 背书 Chaincode在实例化的时候,需要指定背书策略。如: AND(‘Org1.member’, ‘Org2.member’, ‘Org3.member’) ,请求3个org成员的签名。 OR(‘Org1.member’, ‘Org2.member’) 请求两个Org中的任意一个Org的成员的签名。 OR(‘Org1.member’, AND(‘Org2.member’, ‘Org3.member’)) ,请求来自Org1 的成员签名,或者来自Org2 的成员和来自Org3 的成员签名。 排序 Orderer的排序分Solo和Kafka两种模式; Solo:单节点排序功能,实验性质,不具备可扩展性和容错,不能够在生产环境使用;Kafka:集群排序,支持CFT容错,支持可持久化和可扩展性。可在生产环境使用。 验证 由Committer Peer完成,对排序后的一批交易进行提交到账本之前最终检查的过程。交易合法与否都会上链,在交易状态位体现是否是合法交易,不合法交易不会改变World State。 06 特征 除了以上提到的具有数据隔离、模块化、支持高级语言的Chaincode等外,它和Bitcoin和Ethereum等公有链相比还有更多的不一样: 代币 Fabric上没有代币机制,仅提供了一张类似白纸一样的平台,完全靠自己去实现;公有链的节点是逐利型的,代币一种激励制度,来保证网络的安全和可持续性。而Fabric作为准入型网络,节点具有很大的可信度和目的性,自然代币就不是很必要。 Block打包 Fabric出块可配置时间、大小,甚至交易的上限大小,非常灵活。另外Fabric不出空块,只有有交易时才会出块;公有链因其激励机制,定时出块,一定程度上浪费了存储。而且作为共识的一部分,出块时间和块大小很难改变。 最终性 Fabric基于No-op(无需共识)或者PBFT共识具有最终性,一旦达成共识就不可逆转,更适合一些企业场景如金融业务等;公有链以Pow为代表的概率性算法没有最终性,共识结果则是临时的,随着时间推移或某种强化,共识结果被推翻的概率越来越小,成为事实上的最终结果。 监管和隐私 基于PKI证书体系,Fabric可以实现交易的追踪、认责、不可抵赖、数据授权访问、监管和审计等特性;公有链数据全公开、完全匿名且无监管,成为了部分不法分子的交易天堂。 性能 Fabric作为一个非许可的联盟区块链,参与节点不会过多,可达几百甚至上千并发。相对于比特币或者以太坊等公有链的几十并发有很大的提升。 07 小结 Fabric的可插拔、高性能、完整的身份管理机制及丰富的开发模块支持更容易与企业应用相结合。小编相信,Fabric未来将在金融乃至更广阔的领域大放异彩。 猎豹区块链研究中心 · 最全最干的区块链资讯 · 求关注 ~

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

杨老师课堂之JavaScript案例手动切换轮播图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/79905879 JavaScript案例之手动切换轮播图片 效果图: 思路: 1.先做界面 1.1制作按钮及点击触发事件 1.2引入一张图片 2.书写Css 2.1跳转div盒子的布局(宽、高、边框线、水平居中、文字居中...) 3.JavaScript 3.1 定义一个变量 i 即原图的数字名称 3.2定义函数:将变量i进行自增。 3.3通过id获取图片元素所在位置,并在后面输出图片路径及图片名称i 的变量 3.4判断:当图片到达最后一张,将图片变量重置为0,进行循环递加到原图的图片名称1上去 参考代码: Html代码 <div "> <input type="button" value="手动切换" onclick="changeImg()" /> <img src="img/1.jpg" width="100%" id="img1"/> </div> CSS代码: <style type="text/css"> div{ width: 500px; height: 350px; border: 1px solid white; margin: auto; text-align: center; } </style> JavaScript代码 <script type="text/javascript"> var i = 0; function changeImg(){ i++; document.getElementById("img1").src="img/"+i+".jpg" if(i==5){ i=0; } } </script> 作者: 杨校 出处:http://blog.csdn.net/kese7952 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询。

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

在线日志分析项目解读

1,日志的采集 从flume agent 上的数据一般分到两条线上一条是kafka 集群 ,后期可以用流式处理(spark streaming 或storm 等等)一条是到hdfs,后期可以用hive处理, 业界叫lambda架构 architecture (一般公司的推荐系统,就是用这种架构) flume-ng agent 采集收集日志后,聚合在一个节点上(也可以不聚合) 为什么要聚合?为什么不直接写到kafka集群? 假如公司规模比较大,有无数个flume节点,这么多都连kafka,会增加复杂度,有个聚合节点(会是多个节点组成,防止单节点挂了),还可以对日志格式统一处理,筛选不要的数据 hdfs 可以永久保存数据,mr 可以处理多久数据都行 kafka 集群数据可以存储一定时间不能长期存储,sparkstreaming 只能处理一定时间访问内数据 storm 流 数据源 nginx 日志,mysql 日志,tomcat 日志等等-> flume -> kafka 消息件 消息发送到这里缓存数据一段时间 -> spark streaming+spark sql on yarn cluster (实时计算) -> 存储 1.->redis adminLTE + flask 前端组件 + echarts3 集成到监控的系统上 2.->influxdb 时序分布式数据库 grafana 可视化组件(这两种结合比较好) (elk kibana ) 存储+可视化分析 画图工具 http://www.processon.com/ 本文转自 skinglzw 51CTO博客,原文链接:http://blog.51cto.com/skinglzw/1967271,如需转载请自行联系原作者

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

在线升级glance镜像技巧

0.背景 我们经常需要更新glance镜像,比如上传的镜像可能有配置问题,或者我们需要对已有的镜像进行软件包升级或者预装一些新的软件包等。当时着手这件事是由于我们对cloud-init进行了大量的patch,需要同步到glance镜像中,如果重新制作镜像然后传输到生产环境再上传,不仅工作非常繁琐,还非常消耗时间,我们希望能够在原来的镜像基础之上直接升级cloud-init。 1.通过快照方式更新镜像 最简单的方式是通过创建一个云主机,然后更新cloud-init后创建快照形成新的镜像(注意删除/var/lib/cloud下的文件,否则cloud-init下次启动时不会重新拉取metadata)。可是我们遇到的问题是,老版本的cloud-init在L版中注入密码和密钥都失败,并且安装的qemu-guest-agent不支持修改密码,因此完全没有办法登录云主机。因此必须另辟蹊径。 2.glance存储后端使用本地文件系统 于是我们想到把镜像挂载到本地文件系统中,然后chroot到镜像文件系统环境中进行升级配置。如果glance镜像使用本地文件系统作为存储后端,镜像格式为raw,挂载镜像就非常简单了: losetup/dev/loop0image.img kpartx-a/dev/loop0 mount/dev/mapper/loop0p1/mnt/image 如果是qcow2格式,需要安装qemu-nbd工具包,并且加载nbd内核模块: modprobenbdmax_part=63 qemu-nbd-c/dev/nbd0image.img mount/dev/nbd0p1/mnt/image 如果镜像文件系统中使用LVM,可以使用以下方法初始化: vgscan vgchange-ay mount/dev/VolGroupName/LogVolName/mnt/image chroot进行后执行相关操作后,卸载镜像文件系统: umount/mnt/image vgchange-anVolGroupName killallqemu-nbd kpartx-d/dev/loop0 losetup-d/dev/loop0 以上方法参考Mounting-raw-and-qcow2-vm-disk-images。 本文重点不在于基于本地文件系统作为存储后端的情况,重点介绍基于Ceph存储后端的操作方法,下文将详细介绍过程。 3.基于Ceph存储后端的更新方法 我们知道使用ceph作为存储后端时,镜像首先会生成一个以snap命名的快照,比如glance有一个镜像id为35fcb79c-43a1-4b59-83d7-f4e46a524419,则在rbd中有对应的image,命名与glance镜像id一致,我们查看其快照: rbdsnapls--imageopenstack-images/35fcb79c-43a1-4b59-83d7-f4e46a5244192>/dev/null 输出: SNAPIDNAMESIZE 94604snap20480MB 我们不能直接修改快照snap,因为它是protect的,只能读不能写。直接修改镜像的话不能同步到快照中,并且出错也不好回滚。 因此我们的做法是先复制一个rbd image副本. 首先使用glance命令行工具获取需要更新的镜像的id: IMAGE_ID=$(glanceimage-list--name"CentOS7.164bit2>/dev/null|awk--re-interval'/\w{8}-.*/{print$2}') 使用rbd命令拷贝一份镜像副本,假设POOL变量为glance使用的ceph池: rbdcp$POOL/${IMAGE_ID}$POOL/${IMAGE_ID}_copy 挂载镜像到本地文件系统中: rbdmap$POOL/${IMAGE_ID}_copy #/dev/rbd0 mount/dev/rbd0p1/mnt 注意由于镜像是Linux文件系统,因此通常只有一个根分区,如果是windows镜像,第一个分区通常是隐藏分区,C盘是第二个分区,因此挂载时注意选择rbd0p2,其中p表示partition。 挂载到本地后,可以拷贝软件包、配置模板等到镜像文件系统中,比如/mnt/root/,然后chroot到镜像文件系统中: cd/mnt#/mnt是我们需要chroot的根目录 #mount-tprocprocproc/#挂载proc #TouseaninternetconnectioninthechrootenvironmentcopyovertheDNSdetails: cp/etc/resolv.confetc/resolv.conf#覆盖即可,生成云主机会自动覆盖 #Tochangerootintoabashshell: chroot/mntbash#chroot到/mnt中,如果提示bash命令找不到,使用绝对路径试试chroot/mnt/bin/bash #初始化环境变量 source/etc/profile source~/.bashrc #如果提示找不到ls等命令,需要手动设置PATH变量:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin #Tip:Optionally,createauniqueprompttobeabletodifferentiateyourchrootenvironment: exportPS1="(chroot)$PS1" 接下来就可以执行命令对镜像进行更新了,比如更新cloud-init: yumremovecloud-init#Removetheoldversionpackage rpm-icloud-init-0.7.6-bzr1.el7.centos.noarch.rpm#Installthepacakge 升级qemu-guest-agent: yuminstall-yqemu-guest-agent rpm-aq|grepqemu-guest-agent #qemu-guest-agent-2.3.0-4.el7.x86_64 执行完所有的更新操作后,完成以下清理工作: yumcleanall rm-rf/root/*#危险!!!删除根目录下拷贝的临时文件,执行前确认无有用文件! exit#退出chroot环境 cd#切换到家目录,工作目录不能位于/mnt,否则卸载不了 umount--recursive/mnt/#如果busy怎么办?lsof查看哪个进程占用,如果还是不行试试使用--lazy参数 rbdunmap/dev/rbd0#从rbd中卸载 最后需要更新glance,我们的方法是先创建一个glance空镜像实例,不需要指定镜像文件,只是占个坑,拿到新镜像id: NEW_IMAGE_ID=`glanceimage-create|grepid|awk'{print$4}'`||{echo'Error:glanceimage-createfailed!';exit1;} 接下来更新我们的rbd image,命名为新创建镜像实例id并设置快照: rbdmv$POOL/${IMAGE_ID}_copy$POOL/${NEW_IMAGE_ID} rbd--pool=$POOL--image=${NEW_IMAGE_ID}--snap=snapsnapcreate rbd--pool=$POOL--image=${NEW_IMAGE_ID}--snap=snapsnapprotect 最后更新glance镜像元数据: glanceimage-update--name="$DISPLAY_NAME"--disk-format=raw--container-format=bare--is-public=True${NEW_IMAGE_ID} glanceimage-update--propertyimage_meta="$image_meta"${NEW_IMAGE_ID} glanceimage-update--propertyhw_qemu_guest_agent=yes$IMAGE_ID #... #updateimagelocation FSID=`ceph-s|grepcluster|awk'{print$2}'` glanceimage-update--locationrbd://$FSID/$POOL/$IMAGE_ID/snap${NEW_IMAGE_ID} if[[$IMAGE_LABEL=="Windows"||$IMAGE_LABEL=="windows"]];then glanceimage-update--propertyhw_video_model=qxl--propertyhw_video_ram=64--propertyos_admin_user=Administrator$IMAGE_ID fi 最后对新镜像进行功能验证,如果没有问题,就可以安全的删除老的镜像了。 作者:付广平 来源:51CTO

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

杨老师课堂之JavaScript右下角广告弹框

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/80290779 预览效果图: Html代码: <html> <body> <div id="silu"> <button onclick="tips_pop()">3秒后会在右下角自动弹出窗口,如果没有弹出请点击这个按钮</button> </div> <div id="winpop"> <div class="title">您有新的短消息!<span class="close" onclick="tips_pop()">X</span></div> <div class="con">1条未读信息(</div> </div> </body> </html> Css代码: #winpop { width: 200px; height: 0px; position: absolute; right: 0; bottom: 0; border: 1px solid #666; margin: 0; padding: 1px; overflow: hidden; display: none; } #winpop .title { width: 100%; height: 22px; line-height: 20px; background: #FFCC00; font-weight: bold; text-align: center; font-size: 12px; } #winpop .con { width: 100%; height: 90px; line-height: 80px; font-weight: bold; font-size: 12px; color: #FF0000; text-decoration: underline; text-align: center; } #silu { font-size: 12px; color: #666; position: absolute; right: 0; text-align: right; text-decoration: underline; line-height: 22px; } .close { position: absolute; right: 4px; top: -1px; color: #FFF; cursor: pointer; } JavaScript代码: window.onload=function(){//加载 document.getElementById('winpop').style.height='0px'; setTimeout("tips_pop()",800);//3秒后调用tips_pop()这个函数 } function tips_pop(){ var MsgPop=document.getElementById("winpop"); var popH=parseInt(MsgPop.style.height);//将对象的高度转化为数字 if (popH==0){ MsgPop.style.display="block";//显示隐藏的窗口 show=setInterval("changeH('up')",2); } else { hide=setInterval("changeH('down')",2); } } function changeH(str) { var MsgPop=document.getElementById("winpop"); var popH=parseInt(MsgPop.style.height); if(str=="up"){ if (popH<=100){ MsgPop.style.height=(popH+4).toString()+"px"; } else{ clearInterval(show); } } if(str=="down"){ if (popH>=4){ MsgPop.style.height=(popH-4).toString()+"px"; } else{ clearInterval(hide); MsgPop.style.display="none"; //隐藏DIV } } } 作者: 杨校 出处:https://blog.csdn.net/kese7952 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询。

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

杨老师课堂之JavaScript案例之自动切换轮播图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/79905203 JavaScript案例之自动切换轮播图片 效果图: 思路: 1.先做界面 1.1制作按钮及点击触发事件 1.2引入一张图片 2.书写Css 2.1跳转div盒子的布局(宽、高、边框线、水平居中、文字居中...) 3.JavaScript 3.1定义“初始化”函数, 设置定时器 时间为3000毫秒 3.2定义一个变量 i 即原图的数字名称 3.3定义函数:将变量i进行自增。 3.4通过id获取图片元素所在位置,并在后面输出图片路径及图片名称i 的变量 3.5判断:当图片到达最后一张,将图片变量重置为0,进行循环递加到原图的图片名称1上去 参考代码: Html代码 <body onload="init()"> <div "> <input type="button" value="手动切换" onclick="changeImg()" /> <img src="img/1.jpg" width="100%" id="img1"/> </div> </body> CSS代码: <style type="text/css"> div{ width: 500px; height: 350px; border: 1px solid white; margin: auto; text-align: center; } </style> JavaScript代码 <script type="text/javascript"> function init(){ setInterval("changeImg()",3000);//轮播图片显示的定时操作 } var i = 0; function changeImg(){ i++; document.getElementById("img1").src="img/"+i+".jpg"///获取图片位置并设置src属性值 if(i==5){ i=0; } } </script> 作者: 杨校 出处:http://blog.csdn.net/kese7952 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询。

资源下载

更多资源
Mario

Mario

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

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文件系统,支持十年生命周期更新。

WebStorm

WebStorm

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

用户登录
用户注册