??xml version="1.0" encoding="utf-8" standalone="yes"?>BlogJava-paulwonghttp://www.qpkxbc.shop/paulwong/zh-cnSat, 24 Aug 2019 09:42:00 GMTSat, 24 Aug 2019 09:42:00 GMT60淘宝千万Uƈ发分布式架构?4ơ演q?/title><link>http://www.qpkxbc.shop/paulwong/archive/2019/08/16/434451.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 16 Aug 2019 02:05:00 GMT</pubDate><guid>http://www.qpkxbc.shop/paulwong/archive/2019/08/16/434451.html</guid><wfw:comment>http://www.qpkxbc.shop/paulwong/comments/434451.html</wfw:comment><comments>http://www.qpkxbc.shop/paulwong/archive/2019/08/16/434451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.qpkxbc.shop/paulwong/comments/commentRss/434451.html</wfw:commentRss><trackback:ping>http://www.qpkxbc.shop/paulwong/services/trackbacks/434451.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>一、概q?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">本文以淘宝作Z子,介绍从一百个q发到千万q发情况下服务端的架构的演进q程Q同时列丑և每个演进阶段会遇到的相关技术,让大家对架构的演q有一个整体的认知Q文章最后汇M一些架构设计的原则?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>二、基本概?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在介l架构之前,Z避免部分读者对架构设计中的一些概念不了解Q下面对几个最基础的概念进行介l:</p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>1Q分布式</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ中的多个模块在不同服务器上部|Ԍ卛_UCؓ分布式系l,如Tomcat和数据库分别部v在不同的服务器上Q或两个相同功能的Tomcat分别部v在不同服务器上?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>2Q高可用</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ中部分节点失效时Q其他节点能够接替它l箋提供服务Q则可认为系l具有高可用性?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>3Q集?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">一个特定领域的软g部v在多台服务器上ƈ作ؓ一个整体提供一cL务,q个整体UCؓ集群。如Zookeeper中的Master和Slave分别部v在多台服务器上,共同l成一个整体提供集中配|服务?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在常见的集群中,客户端往往能够q接L一个节点获得服务,q且当集中一个节ҎU时Q其他节点往往能够自动的接替它l箋提供服务Q这时候说明集具有高可用性?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>4Q负载均?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">h发送到pȝӞ通过某些方式把请求均匀分发到多个节点上Qɾpȝ中每个节点能够均匀的处理请求负载,则可认ؓpȝ是负载均衡的?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>5Q正向代理和反向代理</strong></p> <ul style="list-style-type: none; margin: 0px 0px 1em; padding: 0px; line-height: 0px;"> <li style="margin: 0px; padding: 0px 0px 0px 9px; line-height: 28px; zoom: 1; background: url("img/bullet1.png") left 0.9em no-repeat;">pȝ内部要访问外部网l时Q统一通过一个代理服务器把请求{发出去,在外部网l看来就是代理服务器发v的访问,此时代理服务器实现的是正向代理;</li> <li style="margin: 0px; padding: 0px 0px 0px 9px; line-height: 28px; zoom: 1; background: url("img/bullet1.png") left 0.9em no-repeat;">当外部请求进入系l时Q代理服务器把该h转发到系l中的某台服务器上,对外部请求来_与之交互的只有代理服务器Q此时代理服务器实现的是反向代理?/li> </ul> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">单来_正向代理是代理服务器代替pȝ内部来访问外部网l的q程Q反向代理是外部h讉Kpȝ旉过代理服务器{发到内部服务器的q程?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>三、架构演q?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>单机架构</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5TRAP4kzbG" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">以淘宝作Z子。在|站最初时Q应用数量与用户数都较少Q可以把Tomcat和数据库部v在同一台服务器上。浏览器往<em>www</em>.taobao<em>.com</em>发vhӞ首先l过DNS服务器(域名pȝQ把域名转换为实际IP地址10.102.4.1Q浏览器转而访问该IP对应的Tomcat?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">随着用户数的增长QTomcat和数据库之间竞争资源Q单机性能不以支撑业务?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W一ơ演q:</strong><strong>Tomcat与数据库分开部v</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5ThIKTi6Dq" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">Tomcat和数据库分别独占服务器资源,显著提高两者各自性能?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">随着用户数的增长Qƈ发读写数据库成ؓ瓉?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W二ơ演q:</strong><strong>引入本地~存和分布式~存</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5TtIa6VPVc" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在Tomcat同服务器上或同JVM中增加本地缓存,q在外部增加分布式缓存,~存热门商品信息或热门商品的html面{。通过~存能把l大多数h在读写数据库前拦截掉Q?em>大大</em>降低数据库压力?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">其中涉及的技术包括:使用memcached作ؓ本地~存Q用Redis作ؓ分布式缓存,q会涉及~存一致性、缓存穿?ȝ、缓存雪崩、热Ҏ据集中失效等问题?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">~存抗住了大部分的访问请求,随着用户数的增长Qƈ发压力主要落在单机的Tomcat上,响应逐渐变慢?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W三ơ演q:</strong><strong>引入反向代理实现负蝲均衡</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5U46rS0yEH" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在多台服务器上分别部|TomcatQ用反向代理YӞNginxQ把h均匀分发到每个Tomcat中?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">此处假设Tomcat最多支?00个ƈ发,Nginx最多支?0000个ƈ发,那么理论上Nginx把请求分发到500个Tomcat上,p抗住50000个ƈ发?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">其中涉及的技术包括:Nginx、HAProxyQ两者都是工作在|络W七层的反向代理软gQ主要支持http协议Q还会涉及session׃n、文件上传下载的问题?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">反向代理使应用服务器可支持的q发?em>大大</em>增加Q但q发量的增长也意味着更多hIK到数据库,单机的数据库最l成为瓶颈?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W四ơ演q:</strong><strong>数据库读写分?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5UGC3HaOFm" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">把数据库划分库和写库Q读库可以有多个Q通过同步机制把写库的数据同步到读库,对于需要查询最新写入数据场景,可通过在缓存中多写一份,通过~存获得最新数据?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">其中涉及的技术包括:MycatQ它是数据库中间Ӟ可通过它来l织数据库的分离d和分库分表,客户端通过它来讉K下层数据库,q会涉及数据同步Q数据一致性的问题?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">业务逐渐变多Q不同业务之间的讉K量差距较大,不同业务直接竞争数据库,怺影响性能?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W五ơ演q:数据库按业务分库</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5Ys1VzwsKT" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">把不同业务的数据保存C同的数据库中Q业务之间的资源竞争降低,对于讉K量大的业务,可以部v更多的服务器来支撑?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">q样同时D跨业务的表无法直接做兌分析Q需要通过其他途径来解冻I但这不是本文讨论的重点,有兴的可以自行搜烦解决Ҏ?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">随着用户数的增长Q单机的写库会逐渐会达到性能瓉?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W六ơ演q:</strong><strong>把大表拆分ؓ表</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5Z615L3Uqz" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">比如针对评论数据Q可按照商品IDq行hashQ\由到对应的表中存储;针对支付记录Q可按照时创徏表,每个时表l拆分ؓ表Q用用户ID或记录编h路由数据?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">只要实时操作的表数据量够小Q请求能够够均匀的分发到多台服务器上的小表,那数据库p通过水^扩展的方式来提高性能。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">q种做法显著的增加了数据库运l的隑ֺQ对DBA的要求较高。数据库设计到这U结构时Q已l可以称为分布式数据库,但是q只是一个逻辑的数据库整体Q数据库里不同的l成部分是由不同的组件单独来实现的?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">如分库分表的理和请求分发,由Mycat实现QSQL的解析由单机的数据库实现Q读写分d能由|关和消息队列来实现Q查询结果的汇d能由数据库接口层来实现等{,q种架构其实是MPPQ大规模q行处理Q架构的一cd现?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">目前开源和商用都已l有不少MPP数据库,开源中比较行的有Greenplum、TiDB、Postgresql XC、HAWQ{,商用的如南大通用的GBase、睿帆科技的雪球DB、华为的LibrA{等?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">不同的MPP数据库的侧重点也不一P如TiDB更侧重于分布式OLTP场景QGreenplum更侧重于分布式OLAP场景?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">q些MPP数据库基本都提供了类似Postgresql、Oracle、MySQL那样的SQL标准支持能力Q能把一个查询解析ؓ分布式的执行计划分发到每台机器上q行执行Q最l由数据库本w汇L据进行返回?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">也提供了诸如权限理、分库分表、事务、数据副本等能力Qƈ且大多能够支?00个节点以上的集群Q?em>大大</em>降低了数据库q维的成本,q且使数据库也能够实现水qx展?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">数据库和Tomcat都能够水qx展,可支撑的q发大幅提高Q随着用户数的增长Q最l单机的Nginx会成为瓶颈?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W七ơ演q:</strong><strong>使用LVS或F5来多个Nginx负蝲均衡</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5ZHDxQFS1r" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">׃瓉在NginxQ因此无法通过两层的Nginx来实现多个Nginx的负载均衡?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">图中的LVS和F5是工作在|络W四层的负蝲均衡解决ҎQ其中LVS是YӞq行在操作系l内核态,可对TCPh或更高层U的|络协议q行转发Q因此支持的协议更丰富,q且性能也远高于NginxQ可假设单机的LVS可支持几<em>十万</em>个ƈ发的h转发QF5是一U负载均衡硬Ӟ与LVS提供的能力类|性能比LVS更高Q但h昂贵?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">׃LVS是单机版的YӞ若LVS所在服务器宕机则会D整个后端pȝ都无法访问,因此需要有备用节点。可使用keepalived软g模拟拟IPQ然后把虚拟IPl定到多台LVS服务器上Q浏览器讉K虚拟IPӞ会被路由器重定向到真实的LVS服务器,当主LVS服务器宕机时Qkeepalived软g会自动更新\由器中的路由表,把虚拟IP重定向到另外一台正常的LVS服务器,从而达到LVS服务器高可用的效果?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">此处需要注意的是,上图中从Nginx层到Tomcat层这Lq不代表全部Nginx都{发请求到全部的Tomcat?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在实际用时Q可能会是几个Nginx下面接一部分的TomcatQ这些Nginx之间通过keepalived实现高可用,其他的Nginx接另外的TomcatQ这样可接入的Tomcat数量p成倍的增加?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">׃LVS也是单机的,随着q发数增长到?em>十万</em>ӞLVS服务器最l会辑ֈ瓉Q此时用h辑ֈ千万甚至上亿U别Q用户分布在不同的地区,与服务器机房距离不同Q导致了讉K的gq会明显不同?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W八ơ演q:</strong><strong>通过DNS轮询实现机房间的负蝲均衡</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p9.pstatp.com/large/pgc-image/RSQI5ZS2uQgqcv" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在DNS服务器中可配|一个域名对应多个IP地址Q每个IP地址对应C同的机房里的虚拟IP?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">当用戯?em>www</em>.taobao<em>.com</em>ӞDNS服务器会使用轮询{略或其他策略,来选择某个IP供用戯问。此方式能实现机戉K的负载均衡,xQ系l可做到机房U别的水qx展,千万U到亿的ƈ发量都可通过增加机房来解冻Ipȝ入口处的hq发量不再是问题?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">随着数据的丰富程度和业务的发展,索、分析等需求越来越丰富Q单单依靠数据库无法解决如此丰富的需求?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W九ơ演q:</strong><strong>引入NoSQL数据库和搜烦引擎{技?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5Zg6I1Hn9B" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">当数据库中的数据多到一定规模时Q数据库׃适用于复杂的查询了,往往只能满普通查询的场景?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">对于l计报表场景Q在数据量大时不一定能跑出l果Q而且在跑复杂查询时会D其他查询变慢Q对于全文检索、可变数据结构等场景Q数据库天生不适用?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">因此需要针对特定的场景Q引入合适的解决Ҏ。如对于量文g存储Q可通过分布式文件系lHDFS解决Q对于key valuecd的数据,可通过HBase和Redis{方案解冻I对于全文索场景,可通过搜烦引擎如ElasticSearch解决Q对于多l分析场景,可通过Kylin或Druid{方案解冟?/p> <div ap_container"="" style="text-align: center; width: 862px; height: auto; clear: none;"><iframe width="862" height="200" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" id="aswift_5" name="aswift_5" style="max-width: 100%; margin: 0px auto; display: block; left: 0px; position: absolute; top: 0px; border-width: 0px; border-style: initial; width: 862px; height: 200px;"></iframe></div> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">当然Q引入更多组件同时会提高pȝ的复杂度Q不同的lg保存的数据需要同步,需要考虑一致性的问题Q需要有更多的运l手D|理q些lg{?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">引入更多lg解决了丰富的需求,业务l度能够极大扩充Q随之而来的是一个应用中包含了太多的业务代码Q业务的升q代变得困难?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W十ơ演q:</strong><strong>大应用拆分ؓ应?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5ja85PZxO1" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">按照业务板块来划分应用代码,使单个应用的职责更清晎ͼ怺之间可以做到独立升q代。这时候应用之间可能会涉及C些公共配|,可以通过分布式配|中心Zookeeper来解冟?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">不同应用之间存在q的模块,由应用单独管理会D相同代码存在多䆾Q导致公共功能升U时全部应用代码都要跟着升?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W十一ơ演q:</strong><strong>复用的功能抽L微服?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p1.pstatp.com/large/pgc-image/RSQI5jp81TqVsj" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">如用L理、订单、支付、鉴权等功能在多个应用中都存在,那么可以把这些功能的代码单独抽取出来形成一个单独的服务来管理,q样的服务就是所谓的微服务?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">应用和服务之间通过HTTP、TCP或RPCh{多U方式来讉K公共服务Q每个单独的服务都可以由单独的团队来理。此外,可以通过Dubbo、SpringCloud{框架实现服务治理、限、熔断、降U等功能Q提高服务的E_性和可用性?/p> <div ap_container"="" style="text-align: center; width: 862px; height: auto; clear: none;"><iframe width="862" height="200" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" id="aswift_6" name="aswift_6" style="max-width: 100%; margin: 0px auto; display: block; left: 0px; position: absolute; top: 0px; border-width: 0px; border-style: initial; width: 862px; height: 200px;"></iframe></div> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">不同服务的接口访问方式不同,应用代码需要适配多种讉K方式才能使用服务Q此外,应用讉K服务Q服务之间也可能怺讉KQ调用链会变得非常复杂Q逻辑变得混ؕ?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W十二次演进Q?/strong><strong>引入企业服务ȝESB屏蔽服务接口的访问差?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5k1JJ6WBJC" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">通过ESBl一q行讉K协议转换Q应用统一通过ESB来访问后端服务,服务与服务之间也通过ESB来相互调用,以此降低pȝ的耦合E度。这U单个应用拆分ؓ多个应用Q公共服务单独抽取出来来理Qƈ使用企业消息ȝ来解除服务之间耦合问题的架构,是所谓的SOAQ面向服务)架构Q这U架构与微服务架构容易؜淆,因ؓ表现形式十分怼?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">个h理解Q微服务架构更多是指把系l里的公共服务抽取出来单独运l管理的思想Q而SOA架构则是指一U拆分服务ƈ使服务接口访问变得统一的架构思想QSOA架构中包含了微服务的思想?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">业务不断发展Q应用和服务都会不断变多Q应用和服务的部|变得复杂,同一台服务器上部|多个服务还要解册行环境冲H的问题Q此外,对于如大促这c需要动态扩~容的场景,需要水qx展服务的性能Q就需要在新增的服务上准备q行环境Q部|服务等Q运l将变得十分困难?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W十三次演进Q?/strong><strong>引入容器化技术实现运行环境隔M动态服务管?/strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p9.pstatp.com/large/pgc-image/RSQI5kDBnIQByQ" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">目前最行的容器化技术是DockerQ最行的容器管理服务是Kubernetes(K8S)Q应?服务可以打包为Docker镜像Q通过K8S来动态分发和部v镜像?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">Docker镜像可理解ؓ一个能q行你的应用/服务的最的操作pȝQ里面放着应用/服务的运行代码,q行环境Ҏ实际的需要设|好。把整个“操作pȝ”打包Z个镜像后Q就可以分发到需要部|相x务的机器上,直接启动Docker镜像可以把服务赯v来,使服务的部v和运l变得简单?/p> <div ap_container"="" style="text-align: center; width: 862px; height: auto; clear: none;"><iframe width="862" height="200" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" id="aswift_7" name="aswift_7" style="max-width: 100%; margin: 0px auto; display: block; left: 0px; position: absolute; top: 0px; border-width: 0px; border-style: initial; width: 862px; height: 200px;"></iframe></div> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在大促的之前Q可以在现有的机器集上划分出服务器来启动Docker镜像Q增强服务的性能Q大促过后就可以关闭镜像Q对机器上的其他服务不造成影响Q在3.14节之前,服务q行在新增机器上需要修改系l配|来适配服务Q这会导致机器上其他服务需要的q行环境被破坏)?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">使用容器化技术后服务动态扩~容问题得以解决Q但是机器还是需要公司自w来理Q在非大促的时候,q是需要闲|着大量的机器资源来应对大促Q机器自w成本和q维成本都极高,资源利用率低?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>W十四次演进Q?/strong><strong>以云q_承蝲pȝ</strong></p> <figure style="max-width: 100%; margin-bottom: 1em; margin-left: 0px; margin-right: 0px;"><img src="http://p3.pstatp.com/large/pgc-image/RSQI5kOBZT6v6I" alt="淘宝千万Uƈ发分布式架构?4ơ演q? style="height: auto; max-width: 100%; width: auto;" /></figure> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ可部|到公有云上Q利用公有云的v量机器资源,解决动态硬件资源的问题Q在大促的时间段里,在云q_中时申h多的资源Q结合Docker和K8S来快速部|服务,在大促结束后释放资源Q真正做到按需付费Q资源利用率<em>大大</em>提高Q同?em>大大</em>降低了运l成本?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">所谓的云^収ͼ是把v量机器资源,通过l一的资源管理,抽象Z个资源整体。在之上可按需动态申L件资源(如CPU、内存、网l等Q,q且之上提供通用的操作系l,提供常用的技术组Ӟ如Hadoop技术栈QMPP数据库等Q供用户使用Q甚x供开发好的应用。用户不需要关pd用内部用了什么技术,p够解决需求(如音视频转码服务、邮件服务、个人博客等Q。在云^C会涉及如下几个概念:</p> <ul style="list-style-type: none; margin: 0px 0px 1em; padding: 0px; line-height: 0px;"> <li style="margin: 0px; padding: 0px 0px 0px 9px; line-height: 28px; zoom: 1; background: url("img/bullet1.png") left 0.9em no-repeat;"><strong>IaaSQ?/strong>基础设施x务。对应于上面所说的机器资源l一源整体,可动态申L件资源的层面Q?/li> <li style="margin: 0px; padding: 0px 0px 0px 9px; line-height: 28px; zoom: 1; background: url("img/bullet1.png") left 0.9em no-repeat;"><strong>PaaSQ?/strong>q_x务。对应于上面所说的提供常用的技术组件方便系l的开发和l护Q?/li> <li style="margin: 0px; padding: 0px 0px 0px 9px; line-height: 28px; zoom: 1; background: url("img/bullet1.png") left 0.9em no-repeat;"><strong>SaaSQ?/strong>软gx务。对应于上面所说的提供开发好的应用或服务Q按功能或性能要求付费?/li> </ul> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">xQ以上所提到的从高ƈ发访问问题,到服务的架构和系l实施的层面都有了各自的解决ҎQ但同时也应该意识到Q在上面的介l中Q其实是有意忽略了诸如跨机房数据同步、分布式事务实现{等的实际问题,q些问题以后有机会再拿出来单独讨论?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>四?架构设计ȝ</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>架构的调整是否必L照上q演变\径进行?</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">不是的,以上所说的架构演变序只是针对某个侧面q行单独的改q,在实际场景中Q可能同一旉会有几个问题需要解冻I或者可能先辑ֈ瓉的是另外的方面,q时候就应该按照实际问题实际解决?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">如在<em>政府</em>cȝq发量可能不大,但业务可能很丰富的场景,高ƈ发就不是重点解决的问题,此时优先需要的可能会是丰富需求的解决Ҏ?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>对于要实施的系l,架构应该设计C么程度?</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">对于单次实施q且性能指标明确的系l,架构设计到能够支持系l的性能指标要求p够了Q但要留有扩展架构的接口以便不备之需。对于不断发展的pȝQ如电商q_Q应设计到能满下一阶段用户量和性能指标要求的程度,q根据业务的增长不断的P代升U架构,以支持更高的q发和更丰富的业务?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>服务端架构和大数据架构有什么区别?</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">所谓的“大数?#8221;其实是v量数据采集清z{换、数据存储、数据分析、数据服务等场景解决Ҏ的一个统U?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在每一个场景都包含了多U可选的技术,如数据采集有Flume、Sqoop、Kettle{,数据存储有分布式文gpȝHDFS、FastDFSQNoSQL数据库HBase、MongoDB{,数据分析有Spark技术栈、机器学习算法等?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">ȝ来说大数据架构就是根据业务的需求,整合各种大数据组件组合而成的架构,一般会提供分布式存储、分布式计算、多l分析、数据仓库、机器学习算法等能力。而服务端架构更多指的是应用组l层面的架构Q底层能力往往是由大数据架构来提供?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>有没有一些架构设计的原则Q?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>1QN+1设计</strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ中的每个lg都应做到没有单点故障?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>2Q回滚设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">保pȝ可以向前兼容Q在pȝ升时应能有办法回滚版本?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>3Q禁用设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">应该提供控制具体功能是否可用的配|,在系l出现故障时能够快速下U功能?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>4Q监控设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">在设计阶D就要考虑监控的手Dc?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>5Q多zL据中心设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">若系l需要极高的高可用,应考虑在多地实施数据中心进行多z,臛_在一个机房断늚情况下系l依然可?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>6Q采用成熟的技?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">刚开发的或开源的技术往往存在很多隐藏的bugQ出了问题没有商业支持可能会是一个灾难?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>7Q资源隔设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">应避免单一业务占用全部资源?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>8Q架构应能水qx?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ只有做到能水qx展,才能有效避免瓉问题</p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>9Q非核心则购?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">非核心功能若需要占用大量的研发资源才能解决Q则考虑购买成熟的品?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>10Q用商用硬?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">商用g能有效降低硬件故障的机率?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>11Q快速P?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">pȝ应该快速开发小功能模块Q尽快上U进行验证,早日发现问题<em>大大</em>降低pȝ交付的风险?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>12Q无状态设?/strong></p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">服务接口应该做成无状态的Q当前接口的讉K不依赖于接口上次讉K的状态?/p> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;">设计到此l束Q其实,解决Ҏ有很多,但是q个只是我采用的Q觉得最M的一个?/p> <div style="margin-top: 15px; font-style: italic;"> <p style="margin: 0px 0px 1em; padding: 0px; line-height: 35px;"><strong>原创文章Q{载请注明Q?/strong> 转蝲?a href="http://ifeve.com/" style="outline: none; color: #00a19e;">q发~程|?– ifeve.com</a><strong>本文链接地址:</strong> <a href="http://ifeve.com/%e6%b7%98%e5%ae%9d%e5%8d%83%e4%b8%87%e7%ba%a7%e5%b9%b6%e5%8f%91%e5%88%86%e5%b8%83%e5%bc%8f%e6%9e%b6%e6%9e%84%e7%9a%8414%e6%ac%a1%e6%bc%94%e8%bf%9b/" style="outline: none; color: #00a19e;">淘宝千万Uƈ发分布式架构?4ơ演q?/a></p> </div><img src ="http://www.qpkxbc.shop/paulwong/aggbug/434451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.qpkxbc.shop/paulwong/" target="_blank">paulwong</a> 2019-08-16 10:05 <a href="http://www.qpkxbc.shop/paulwong/archive/2019/08/16/434451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Guide to the Most Important JVM Parametershttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434330.htmlpaulwongpaulwongThu, 01 Aug 2019 08:55:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434330.htmlhttp://www.qpkxbc.shop/paulwong/comments/434330.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434330.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434330.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434330.htmlhttps://www.baeldung.com/jvm-parametersa

Optimising Your Minecraft: Jvm Arguments
https://xealgaming.net/threads/optimising-your-minecraft-jvm-arguments.4758/


paulwong 2019-08-01 16:55 发表评论
]]>
JVM内存配置http://www.qpkxbc.shop/paulwong/archive/2019/08/01/434329.htmlpaulwongpaulwongThu, 01 Aug 2019 08:44:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434329.htmlhttp://www.qpkxbc.shop/paulwong/comments/434329.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434329.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434329.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434329.htmlJVM内存主要分ؓ两个部分Q分别是PermanentSapce和HeapSpace?/p>

PermantSpace主要负责存放加蝲?a href="http://whatis.ctocio.com.cn/searchwhatis/213/5947213.shtml" style="color: #075db3;">Classcȝ对象如class本nQ?a href="http://whatis.ctocio.com.cn/searchwhatis/229/5948729.shtml" style="color: #075db3;">methodQfield{反对象,一般不用配|?/p>

JVM的Heap区可以通过-X参数来设定。HeapSpace= {Old + NEW {= Eden , from, to } }

当一个URL被访问时Q内存申误E如下:

  1. JVM会试图ؓ相关Java对象在Eden中初始化一块内存区?nbsp;
  2. 当EdenI间_Ӟ内存甌l束。否则到下一?nbsp;
  3. JVM试图释放在Eden中所有不z跃的对象(q属?或更高的垃圑֛Ӟ, 释放后若EdenI间仍然不以放入新对象Q则试图部分Eden中活跃对象放入Survivor?/li>
  4.  Survivor用来作ؓEden及OLD的中间交换区域,当OLD区空间够时QSurvivor区的对象会被UdOld区,否则会被保留在Survivor?nbsp;
  5. 当OLD区空间不够时QJVM会在OLD行完全的垃圾攉Q?U) 
  6. 完全垃圾攉后,若Survivor及OLDZ然无法存放从Eden复制q来的部分对象,DJVM无法在EdenZؓ新对象创建内存区域,则出?#8221;out of memory错误”

Xms/XmxQ定义NEW+OLDD늚d寸,ms为JVM启动时NEW+OLD的内存大;mx为最大可占用的NEW+OLD内存大小。。在用户生环境上一般将q两个D为相同,以减运行期间系l在内存甌上所q开销Q?nbsp;

NewSize/MaxNewSizeQ定义单独NEWD늚寸QNewSize为JVM启动时NEW的内存大;MaxNewSize为最大可占用的NEW的内存大。在用户生环境上一般将q两个D为相同,以减运行期间系l在内存甌上所q开销Q?/span>

Xms/Xmx和NewSize/MaxNewSize定义好后QOLD区间也自然定义完毕了Q即OLD区初始大?QXms-NewSizeQ,OLD区最大可占用大小=QXmx-MaxNewSizeQ; 

PermSize/MaxPermSizeQ定义PermD늚寸QPermSize为JVM启动时Perm的内存大;MaxPermSize为最大可占用的Perm内存大小。在用户生环境上一般将q两个D为相同,以减运行期间系l在内存甌上所q开销?/span>



paulwong 2019-08-01 16:44 发表评论
]]>
使用 Awaitility 试异步代码http://www.qpkxbc.shop/paulwong/archive/2019/08/01/434327.htmlpaulwongpaulwongThu, 01 Aug 2019 02:06:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434327.htmlhttp://www.qpkxbc.shop/paulwong/comments/434327.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/08/01/434327.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434327.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434327.html自动化工?异步校验工具 awaitility 快速入?/div>https://testerhome.com/topics/7408


https://yanbin.blog/test-asyn-call-with-awaitility/

Introduction to Awaitlity
https://www.baeldung.com/awaitlity-testing






paulwong 2019-08-01 10:06 发表评论
]]>
Spring Batch JUnit test for multiple jobshttp://www.qpkxbc.shop/paulwong/archive/2019/07/31/434326.htmlpaulwongpaulwongWed, 31 Jul 2019 02:48:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/31/434326.htmlhttp://www.qpkxbc.shop/paulwong/comments/434326.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/31/434326.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434326.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434326.htmlhttps://stackoverflow.com/questions/34217101/spring-batch-junit-test-for-multiple-jobs

@Configuration
public class TestBatchConfiguration implements MergedBeanDefinitionPostProcessor {

    @Autowired
    @Qualifier("JobA")
    private Job job;

    @Bean(name="jtestl")
    public JobLauncherTestUtils jobLauncherTestUtils() {
        JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils();
        jobLauncherTestUtils.setJob(job);
        return jobLauncherTestUtils;
    }

    /**
     * 
https://stackoverflow.com/questions/22416140/autowire-setter-override-with-java-config
     * This is needed to inject the correct job into JobLauncherTestUtils
     
*/
    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
        if(beanName.equals("jtestl")) {
            beanDefinition.getPropertyValues().add("job", getMyBeanFirstAImpl());
        }
    }

    private Object getMyBeanFirstAImpl() {
        return job;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}


paulwong 2019-07-31 10:48 发表评论
]]>
Keep SSH session alivehttp://www.qpkxbc.shop/paulwong/archive/2019/07/30/434321.htmlpaulwongpaulwongTue, 30 Jul 2019 05:46:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/30/434321.htmlhttp://www.qpkxbc.shop/paulwong/comments/434321.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/30/434321.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434321.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434321.htmlsshd (the server) closes the connection if it doesn't hear anything from the client for a while. You can tell your client to send a sign-of-life signal to the server once in a while.

The configuration for this is in the file "~/.ssh/config", create it if the configuration file does not exist. To send the signal every four minutes (240 seconds) to the remote host, put the following in your "~/.ssh/config" file.

Host remotehost:     HostName remotehost.com     ServerAliveInterval 240 

This is what I have in my "~/.ssh/config":

To enable it for all hosts use:

Host * ServerAliveInterval 240 

Also make sure to run:

chmod 600 ~/.ssh/config 

because the config file must not be world-readable.



paulwong 2019-07-30 13:46 发表评论
]]>
publish over ssh 实现 Jenkins q程部vhttp://www.qpkxbc.shop/paulwong/archive/2019/07/25/434296.htmlpaulwongpaulwongThu, 25 Jul 2019 01:33:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/25/434296.htmlhttp://www.qpkxbc.shop/paulwong/comments/434296.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/25/434296.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434296.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434296.htmlJenkinsq程部vQ一开始没有Q何头l,想了很多Ҏ. 因ؓ两台机器都是windowspȝQ所以想到publish over cifs, 但是q个|上资料太少Q貌似只能内|用。又惛_了Jenkins 分布式构建,但是Jenkins构徏的代码和产物最后自动拷贝到主节炏V而远E机器其实是客户方的机器Q所以这个分布式构徏q不适用。最后还是选定publish over ssh来实现远E部|Ӏ?nbsp;
h意:在进行远E部|操作前Q先要确保客h能ssh d到远E机器。如果不知道SSH怎么登陆Q请参考http://blog.csdn.net/flyingshuai/article/details/72897692 
1. 安装publish over ssh 插gQ安装很单,在此不表?nbsp;
2. 在Jenkinspȝ讄里找到Publish over SSH模块 
3. 用户?密码方式d的,pȝ讄里设|如下: 
4. 如果是证书登录的Q系l设|里讄如下Q?nbsp;
5. Job讄Q点d加构建后操作步骤Q选择send build artifacts over ssh, 讄如下Q?nbsp;
6. 文g上传到远E服务器后,q有一些后l操作,比如Q替换数据库配置文g。可以把bat命o写到一个批处理文g中,存到服务器上。Exec command填写批处理文件的l对路径。如上图所C?/div>
关于bat脚本Q?nbsp;
如果每次都需要替换同L文gQ用copy /y 是无条g覆盖Q不会询问。而xcopy可以实现扚w拯文g和文件夹。如果文件较多可用此命o 
注意脚本q行p|Q构Z会显C色成功图标,所以一定要打开控制台输出,看是否真的成功?/div>
--------------------- 
作者:flyingshuai 
来源QCSDN 
原文Q?a href="https://blog.csdn.net/flyingshuai/article/details/72898665 " target="_blank">https://blog.csdn.net/flyingshuai/article/details/72898665 
版权声明Q本文ؓ博主原创文章Q{载请附上博文链接Q?/div>

paulwong 2019-07-25 09:33 发表评论
]]>How do I clear my Jenkins/Hudson build history?http://www.qpkxbc.shop/paulwong/archive/2019/07/24/434289.htmlpaulwongpaulwongWed, 24 Jul 2019 08:18:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/24/434289.htmlhttp://www.qpkxbc.shop/paulwong/comments/434289.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/24/434289.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434289.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434289.html阅读全文

paulwong 2019-07-24 16:18 发表评论
]]>
Springboot ActiveMQ jmsTemplate配置http://www.qpkxbc.shop/paulwong/archive/2019/07/24/434287.htmlpaulwongpaulwongWed, 24 Jul 2019 03:40:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/24/434287.htmlhttp://www.qpkxbc.shop/paulwong/comments/434287.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/24/434287.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434287.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434287.html@Configuration
@DependsOn(value="cachingConnectionFactory")
public class JmsTemplateConfiguration {

@Value("${wechat.sendmessage.queue}")
private String queueName;

@Value("${wechat.sendmessage.topic}")
private String topicName;

@Value("${spring.jms.pub-sub-domain}")
private boolean isPubSubDomain;


/**
 * 定义点对炚w?br /> * 
@return
 
*/
@Bean
public Queue queue() {
    return new ActiveMQQueue(queueName);
}



/**
 * 定义一个主?br /> * 
@return
 
*/
@Bean
public Topic topic() {
    return new ActiveMQTopic(topicName);
}

private final ObjectProvider<DestinationResolver> destinationResolver;
private final ObjectProvider<MessageConverter> messageConverter;
private final CachingConnectionFactory cachingConnectionFactory;

@Autowired
public JmsTemplateConfiguration(ObjectProvider<DestinationResolver> destinationResolver,
                                ObjectProvider<MessageConverter> messageConverter,
                                CachingConnectionFactory cachingConnectionFactory) {
    this.destinationResolver = destinationResolver;
    this.messageConverter = messageConverter;
    this.cachingConnectionFactory = cachingConnectionFactory;
}

/**
 * 配置队列生者的JmsTemplate
 * 
@return JmsTemplate
 
*/
@Bean(name="jmsQueueTemplate")
public JmsTemplate jmsQueueTemplate() {
    //讄创徏q接的工?br />    //JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    
//优化q接工厂Q这里应用缓存池 q接工厂即?/span>
    JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
    //讄默认消费topic
   
//jmsTemplate.setDefaultDestination(topic());
    
//讄P2P队列消息cd
    jmsTemplate.setPubSubDomain(isPubSubDomain);

    DestinationResolver destinationResolver = (DestinationResolver) this.destinationResolver.getIfUnique();
    if (destinationResolver != null) {
        jmsTemplate.setDestinationResolver(destinationResolver);
    }
    MessageConverter messageConverter = (MessageConverter) this.messageConverter.getIfUnique();
    if (messageConverter != null) {
        jmsTemplate.setMessageConverter(messageConverter);
    }
    //deliveryMode, priority, timeToLive 的开养I要生效,必须配置为trueQ默认false
    jmsTemplate.setExplicitQosEnabled(true);
    //DeliveryMode.NON_PERSISTENT=1:非持?nbsp;; DeliveryMode.PERSISTENT=2:持久
    
//定义持久化后节点挂掉以后Q重启可以l消?
    jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
    //默认不开启事?/span>
    System.out.println("默认是否开启事务:"+jmsTemplate.isSessionTransacted());
    //如果不启用事务,则会DXA事务失效Q?br />    //作ؓ生者如果需要支持事务,则需要配|SessionTransacted为true
  
//jmsTemplate.setSessionTransacted(true);
    
//消息的应{方式,需要手动确认,此时SessionTransacted必须被设|ؓfalseQ且为Session.CLIENT_ACKNOWLEDGE模式
    
//Session.AUTO_ACKNOWLEDGE  消息自动{收
    
//Session.CLIENT_ACKNOWLEDGE  客户端调用acknowledgeҎ手动{收
    
//Session.DUPS_OK_ACKNOWLEDGE 不必必须{收Q消息可能会重复发?/span>
    jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return jmsTemplate;
}

/**
 * 配置发布订阅生者的JmsTemplate
 * 
@return JmsTemplate
 
*/
@Bean(name="jmsTopicTemplate")
public JmsTemplate jmsTopicTemplate() {
    //讄创徏q接的工?br />   //JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    
//优化q接工厂Q这里应用缓存池 q接工厂即?/span>
    JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
    //讄默认消费topic
  
//jmsTemplate.setDefaultDestination(topic());
    
//讄发布订阅消息cd
    jmsTemplate.setPubSubDomain(isPubSubDomain);


    //deliveryMode, priority, timeToLive 的开养I要生效,必须配置为trueQ默认false
    jmsTemplate.setExplicitQosEnabled(true);
    //DeliveryMode.NON_PERSISTENT=1:非持?nbsp;; DeliveryMode.PERSISTENT=2:持久
    jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);

    //默认不开启事?/span>
    System.out.println("是否开启事?+jmsTemplate.isSessionTransacted());
    //如果session带有事务Qƈ且事务成功提交,则消息被自动{收。如果事务回滚,则消息会被再ơ传送?br />    //jmsTemplate.setSessionTransacted(true);

    
//不带事务的session的签收方式,取决于session的配|?br />    //默认消息认方式?Q即AUTO_ACKNOWLEDGE
    System.out.println("是否消息认方式"+jmsTemplate.getSessionAcknowledgeMode());

    //消息的应{方式,需要手动确认,此时SessionTransacted必须被设|ؓfalseQ且为Session.CLIENT_ACKNOWLEDGE模式
    
//Session.AUTO_ACKNOWLEDGE  消息自动{收
    
//Session.CLIENT_ACKNOWLEDGE  客户端调用acknowledgeҎ手动{收
    
//Session.DUPS_OK_ACKNOWLEDGE 不必必须{收Q消息可能会重复发?/span>
    jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);

    return jmsTemplate;
}

}


paulwong 2019-07-24 11:40 发表评论
]]>Enterprise Integration Patternshttp://www.qpkxbc.shop/paulwong/archive/2019/07/18/434231.htmlpaulwongpaulwongThu, 18 Jul 2019 06:11:00 GMThttp://www.qpkxbc.shop/paulwong/archive/2019/07/18/434231.htmlhttp://www.qpkxbc.shop/paulwong/comments/434231.htmlhttp://www.qpkxbc.shop/paulwong/archive/2019/07/18/434231.html#Feedback0http://www.qpkxbc.shop/paulwong/comments/commentRss/434231.htmlhttp://www.qpkxbc.shop/paulwong/services/trackbacks/434231.htmlWhy Enterprise Integration Patterns?

Enterprise integration is too complex to be solved with a simple 'cookbook' approach. Instead, patterns can provide guidance by documenting the kind of experience that usually lives only in architects' heads: they are accepted solutions to recurring problems within a given context. Patterns are abstract enough to apply to most integration technologies, but specific enough to provide hands-on guidance to designers and architects. Patterns also provide a vocabulary for developers to efficiently describe their solution.

Patterns are not 'invented'; they are harvested from repeated use in practice. If you have built integration solutions, it is likely that you have used some of these patterns, maybe in slight variations and maybe calling them by a different name. The purpose of this site is not to "invent" new approaches, but to present a coherent collection of relevant and proven patterns, which in total form an integration pattern language.

Despite the 700+ pages, our book covers only a fraction of patterns (and the problems to be solved) in the integration space. The current patterns focus on Messaging, which forms the basis of most other integration patterns. We have started to harvest more patterns but are realizing (once again) how much work documenting these patterns really is. So please stay tuned.

Messaging Patterns

We have documented 65 messaging patterns, organized as follows:



https://www.enterpriseintegrationpatterns.com/patterns/messaging/index.html

paulwong 2019-07-18 14:11 发表评论
]]>
1һ152ͼ