http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/08e1b43f/content/cn/docs/seckill-development-journey-part-III/index.html ---------------------------------------------------------------------- diff --git a/content/cn/docs/seckill-development-journey-part-III/index.html b/content/cn/docs/seckill-development-journey-part-III/index.html new file mode 100644 index 0000000..875b842 --- /dev/null +++ b/content/cn/docs/seckill-development-journey-part-III/index.html @@ -0,0 +1,823 @@ +<!doctype html> +<!-- + Minimal Mistakes Jekyll Theme 4.4.1 by Michael Rose + Copyright 2017 Michael Rose - mademistakes.com | @mmistakes + Free for personal and commercial use under the MIT license + https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE.txt +--> +<html lang="cn" class="no-js"> + <head> + <meta charset="utf-8"> + +<!-- begin SEO --> + + + + + + + + + +<title>ç§æå¼ååç¨ï¼ä¸ï¼ - Apache incubator ServiceComb</title> + + + + +<meta name="description" content="ä»ç»å¦ä½ä¸æ¥ä¸æ¥æå»ºç§æé¡¹ç®çè¿ç¨"> + + + + +<meta name="author" content="Yangyong Zheng"> + +<meta property="og:locale" content="cn"> +<meta property="og:site_name" content="Apache incubator ServiceComb"> +<meta property="og:title" content="ç§æå¼ååç¨ï¼ä¸ï¼"> + + + <link rel="canonical" href="http://github.com/pages/ServiceComb/servicesomb.github.io/cn/docs/seckill-development-journey-part-III/"> + <meta property="og:url" content="http://github.com/pages/ServiceComb/servicesomb.github.io/cn/docs/seckill-development-journey-part-III/"> + + + + <meta property="og:description" content="ä»ç»å¦ä½ä¸æ¥ä¸æ¥æå»ºç§æé¡¹ç®çè¿ç¨"> + + + + <meta name="twitter:site" content="@ServiceComb"> + <meta name="twitter:title" content="ç§æå¼ååç¨ï¼ä¸ï¼"> + <meta name="twitter:description" content="ä»ç»å¦ä½ä¸æ¥ä¸æ¥æå»ºç§æé¡¹ç®çè¿ç¨"> + <meta name="twitter:url" content=""> + + + <meta name="twitter:card" content="summary"> + + + + + <meta name="twitter:creator" content="@"> + + + + + + + + + + + + + <meta property="og:type" content="article"> + <meta property="article:published_time" content="2017-09-07T00:00:00+08:00"> + + + + + + + + + <script type="application/ld+json"> + { + "@context" : "http://schema.org", + "@type" : "Person", + "name" : "Apache incubator ServiceComb", + "url" : "http://github.com/pages/ServiceComb/servicesomb.github.io", + "sameAs" : null + } + </script> + + + + <meta name="google-site-verification" content="HvJjNd7vvJ-yjSTHlBiIWEYxp_Hrz-PYEY5Idz9LRcA" /> + + + + +<!-- end SEO --> + + +<link href="/feed.xml" type="application/atom+xml" rel="alternate" title="Apache incubator ServiceComb Feed"> + +<!-- http://t.co/dKP3o1e --> +<meta name="HandheldFriendly" content="True"> +<meta name="MobileOptimized" content="320"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> + +<script> + document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js '; +</script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script> +<script src="/assets/js/prism.js"></script> + +<script type="text/javascript" async + src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> + +<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script> +<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script> +<!-- For all browsers --> +<link rel="stylesheet" href="/assets/css/main.css"> +<link rel="stylesheet" href="/assets/css/prism.css"> + +<!--[if lte IE 9]> + <style> + /* old IE unsupported flexbox fixes */ + .greedy-nav .site-title { + padding-right: 3em; + } + .greedy-nav button { + position: absolute; + top: 0; + right: 0; + height: 100%; + } + </style> +<![endif]--> + +<meta http-equiv="cleartype" content="on"> + + <!-- start custom head snippets --> + +<!-- insert favicons. use http://realfavicongenerator.net/ --> +<link href="https://fonts.cat.net/css?family=Roboto:400,500,700|Source+Code+Pro" rel="stylesheet"> +<script src="/assets/js/custom.js"></script> +<!-- end custom head snippets --> + + </head> + + <body class="layout--single"> + + <!--[if lt IE 9]> +<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div> +<![endif]--> + <div class="masthead"> + <div class="masthead__inner-wrap"> + <div class="masthead__menu"> + <nav id="site-nav" class="greedy-nav"> + + <a class="site-title active" href="/cn"><img src="//assets/images/ServiceComb-logo-1.png"></a> + + <ul class="visible-links"> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/docs/quick-start/">å¿«éå ¥é¨</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/users/">ç¨æ·æå</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/developers/">å¼åè æå</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/year-archive/">åæ</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/faqs/">常è§é®é¢</a> + + </li> + + </ul> + <button><div class="navicon"></div></button> + <ul class="hidden-links hidden"></ul> + <div class="nav-lang"> + + + + <a href=/docs/seckill-development-journey-part-III/>English</a> + + </div> + </nav> + </div> + </div> +</div> + + + + + + +<div id="main" role="main"> + + <div class="sidebar sticky"> + + <div class="back-to-home">é¦é¡µ > <a href="/cn/">ServiceComb</a></div> + + + +<div itemscope itemtype="http://schema.org/Person"> + + + + <div class="author__content"> + <h3 class="author__name" itemprop="name">Yangyong Zheng</h3> + + <p class="author__bio" itemprop="description"> + + + Fast Action, do not ask + + + </p> + + </div> + + <div class="author__urls-wrapper"> + <button class="btn btn--inverse">å ³æ³¨</button> + <ul class="author__urls social-icons"> + + + + <li> + <a href="https://zhengyangyong.github.io" itemprop="url"> + <i class="fa fa-fw fa-chain" aria-hidden="true"></i> ç½ç« + </a> + </li> + + + + <li> + <a href="mailto:[email protected]"> + <meta itemprop="email" content="[email protected]" /> + <i class="fa fa-fw fa-envelope-square" aria-hidden="true"></i> çµåé®ç®± + </a> + </li> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!-- + <li> + <a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs"> + <i class="fa fa-fw" aria-hidden="true"></i> Custom Social Profile Link + </a> + </li> +--> + </ul> + </div> +</div> + + + </div> + + + + <article class="page" itemscope itemtype="http://schema.org/CreativeWork"> + <meta itemprop="headline" content="ç§æå¼ååç¨ï¼ä¸ï¼"> + <meta itemprop="description" content="ä»ç»å¦ä½ä¸æ¥ä¸æ¥æå»ºç§æé¡¹ç®çè¿ç¨"> + <meta itemprop="datePublished" content="September 07, 2017"> + <meta itemprop="dateModified" content="September 13, 2017"> + + <div class="page__inner-wrap"> + + + <header> + <h1 class="page__title" itemprop="headline">ç§æå¼ååç¨ï¼ä¸ï¼ +</h1> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + å°äº 1 åé é 读 + +</p> + + </header> + + + + <section class="page__content" itemprop="text"> + <p>ãã<a href="/cn/docs/seckill-development-journey-part-II/">䏿</a> ä¸æä»¬å·²ç»æå»ºäºä¸ä¸ªå®æ´åè½çç§æç³»ç»ï¼çæ¬å®ä¸º0.1.0-RELEASEï¼æ¨åºè¯¥åç°ï¼æ°æ®çæä¹ åéä¸å¨åä¸çæ°æ®åºä¸ï¼ç§æä½ä¸ºä¸ä¸ªé«å¹¶åååçåºæ¯ï¼è¿ç§æ¶æå¾é¾éåºå¯æ©å±çè¦æ±ï¼å¹¶ä¸æ£å¦æä»¬ä¸å¼å§å°±æå°çï¼å¾®æå¡æ¨èæ¥æç¬ç«çåå¨ï¼æä»¥æ¬ç¯å¼å§æä»¬å°é åEvent Sourcingå®ç°CQRS模å¼ï¼ä»¥å¢å¼ºåºå¯¹å¤§è§æ¨¡å¹¶åååçè½åã</p> + +<h2 id="cqrs">CQRS</h2> +<p>ãã<a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">CQRS</a> çå«ä¹æ¯å½ä»¤æ¥è¯¢èè´£å离ï¼Command Query Responsibility Segregationï¼ï¼æ¯ä¸ç§å¸¸ç¨çç¨åºè®¾è®¡æ¨¡å¼ï¼å¸¸å¸¸ä¸Event Sourcingä¸èµ·ä½¿ç¨ï¼å ³äºCQRSæä¸å¼ ç§æ®çå¾ï¼æ¥æºäºMicrosoft MSDNï¼</p> + +<p><img src="/assets/images/seckill-develop-course-part-III-cqrs.png" alt="å¾1 CQRS" class="align-center" /></p> + +<h2 id="æ¹è¿è®¾è®¡">æ¹è¿è®¾è®¡</h2> +<p>ãã<a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">CQRS</a>æ¯è¯»ååç¦»ä»¥åæ¶æ¯é©±å¨çæä½³å®è·µï¼ç°å¨æä»¬æç®å èç¦å¨åæ¥çMySQLæ°æ®åºä¸ï¼</p> +<ol> + <li>æ°æ®åºåºè¯¥è¢«æå为ReadDBåWriteDBï¼å嫿¿è½½è¯»å¯éçQueryå¾®æå¡ååå¯éçCommandå¾®æå¡ï¼</li> + <li>ReadDBåWriteDBä¹é´éç¨Event Message驱卿¹å¼å®ææ°æ®åæ¥ï¼å æ¤æä»¬è¿éè¦å¼è¿ä¸ä¸ªæ°çå¾®æå¡ï¼æä»¬å°å®å½å为Eventï¼Processorï¼å¾®æå¡ï¼</li> + <li>Message Brokerç®åæå¾å¤é常æ£çæ¹æ¡ï¼ä¾å¦RabbitMQãKafkaçï¼ç±äºæä»¬çç§æç³»ç»åºäºServiceCombåSpring Bootï¼ä¸ºäºè½å¤å¿«éæå»ºè¿ä¸ªæ°ç¹æ§ï¼æä»¬éç¨å ç½®çActiveMQï¼å®æ¯æå åé忍¡å¼ï¼é常容ææå»ºæµè¯ï¼ç¬¦åæä»¬ææ·å¼åçæ¹å¼ã<br /> + æ¹è¿å®æåçæ¶æå¦ä¸å¾ï¼</li> +</ol> + +<p><img src="/assets/images/seckill-develop-course-part-III-arch.png" alt="å¾2 æ¹è¿æ¶æ" class="align-center" /></p> + +<h2 id="åè½å®ç°">åè½å®ç°</h2> +<h3 id="æ°æ®åºæå">æ°æ®åºæå</h3> +<h4 id="writedb">WriteDB</h4> +<p>ããAdminå¾®æå¡ç»´æ¤Promotionå®ä½ï¼<br /> +ããCommandå¾®æå¡åå ¥Eventå¼å¯¹è±¡ï¼å½æ¢å¤Promotionçæ¶åï¼Relapy Eventã</p> +<h4 id="readdb">ReadDB</h4> +<p>ããEventå¾®æå¡åå ¥ActivePromotionå¼å¯¹è±¡åCouponå¼å¯¹è±¡ï¼<br /> +ããQueryå¾®æå¡æ¥è¯¢ActivePromotionå¼å¯¹è±¡åCouponå¼å¯¹è±¡ã</p> + +<h3 id="commandå¾®æå¡message-publisherç»ä»¶">Commandå¾®æå¡Message Publisherç»ä»¶</h3> +<p>ããä¹åççæ¬ç±äºæ²¡æå¼å ¥Event Sourcingï¼Eventå®ä½åªéè¦ç´æ¥åå ¥æ°æ®åºå³å¯ï¼ç°å¨éè¦å°Eventåå¸ç»Message Brokerï¼ä¸ºäºæ¯æäºæå¡ï¼<a href="http://www.hwclouds.com/">å为äº</a>ï¼æä¾çåå¸å¼æ¶æ¯æå¡ï¼æä»¬å®ä¹äºéç¨æ¶æ¯å叿¥å£ï¼</p> + +<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">SecKillMessagePublisher</span> <span class="o">{</span> + <span class="kt">void</span> <span class="nf">publishMessage</span><span class="o">(</span><span class="n">String</span> <span class="n">messageContent</span><span class="o">);</span> +<span class="o">}</span> +</code></pre> +</div> + +<h3 id="eventå¾®æå¡çå®ç°">Eventå¾®æå¡çå®ç°</h3> +<p>ããEventå¾®æå¡è®¢é Message Brokerè·åEvent Messageï¼ç¶åæ ¹æ®ä¸åçEventç±»åï¼è½¬å为对ReadDBä¸çå¼å¯¹è±¡æä½æCouponå¼å¯¹è±¡æä½ï¼</p> +<ul> + <li>Promotion Start Messageï¼å建ActivePromotionå¼å¯¹è±¡ï¼</li> + <li>Promotion Finish Messageï¼å é¤å¯¹åºPromotionIdçActivePromotionå¼å¯¹è±¡ï¼</li> + <li>Coupon Grabbed Messageï¼å建Couponå¼å¯¹è±¡ï¼</li> +</ul> + +<p>ããåæ ·ï¼ä¸ºäºæ¯æäºæå¡ï¼<a href="http://www.hwclouds.com/">å为äº</a>ï¼æä¾çåå¸å¼æ¶æ¯æå¡ï¼æä»¬å®ä¹äºéç¨æ¶æ¯è®¢é æ¥å£ï¼</p> + +<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">SecKillMessageSubscriber</span> <span class="o">{</span> + <span class="kt">void</span> <span class="nf">subscribeMessage</span><span class="o">(</span><span class="n">String</span> <span class="n">messageContent</span><span class="o">);</span> +<span class="o">}</span> +</code></pre> +</div> + +<h3 id="queryå¾®æå¡çéæ">Queryå¾®æå¡çéæ</h3> +<p>ããç»è¿äºè¯»ååç¦»çæ¹é ï¼ç°å¨æææ´»è·çPromotioné½ä¿åå¨ActivePromotionå¼å¯¹è±¡è¡¨ä¸ï¼èå®¢æ·æåç§æçCouponé½ä¿åå¨Couponå¼å¯¹è±¡è¡¨ä¸ï¼å æ¤ç´æ¥æ¥è¯¢å³å¯ï¼ä¸åéè¦Replay Eventã</p> + +<h2 id="ä¸é®å¯å¨">ä¸é®å¯å¨</h2> +<p>ããç°å¨ï¼æä»¬å®æäºå®æ´çEvent Sourcingæ¶ææ¹é ï¼ä¸ºäºè½å¤æ¹ä¾¿å¯å¨ï¼æä»¬æä¾äºç¼æå¥½çèæ¬ï¼ä½¿ç¨Docker Composeå°æææå¡ä¸æ¡æä»¤å ¨é¨æèµ·æ¥ï¼å ·ä½çæä½è¯·åè§<a href="https://github.com/ServiceComb/seckill">SecKill</a>ã</p> + +<h3 id="å¨docker-toolboxä¸å¯å¨çseckill">å¨Docker ToolBoxä¸å¯å¨çSecKill</h3> + +<p><img src="/assets/images/seckill-develop-course-part-III-seckill-all-in-one.png" alt="å¾3 SecKill All-in-One" class="align-center" /></p> + +<h2 id="åèèµæ">åèèµæ</h2> +<ol> + <li><a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">Command and Query Responsibility Segregation (CQRS) pattern</a> by Microsoft Azure Team</li> + <li><a href="https://msdn.microsoft.com/en-us/library/jj591559.aspx">Introducing Event Sourcing</a> by Microsoft patterns & practices Developer Center</li> + <li><a href="https://martinfowler.com/eaaDev/EventSourcing.html">Event Sourcing</a> by Martin Fowler</li> +</ol> + + + </section> + + <footer class="page__meta"> + + + + + + + + + + <p class="page__taxonomy"> + <strong><i class="fa fa-fw fa-tags" aria-hidden="true"></i> æ ç¾: </strong> + <span itemprop="keywords"> + + + + <a href="/tags/#%E7%A7%92%E6%9D%80" class="page__taxonomy-item" rel="tag">ç§æ</a> + + </span> + </p> + + + + + + + + + <p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> ææ°ç:</strong> <time datetime="2017-09-13">2017å¹´9æ13æ¥</time></p> + + + + </footer> + + <section class="page__share"> + + <h4 class="page__share-title">å享</h4> + + + <a href="https://twitter.com/intent/tweet?via=ServiceComb&text=ç§æå¼ååç¨ï¼ä¸ï¼ /cn/docs/seckill-development-journey-part-III/" class="btn btn--twitter" title="å享 Twitter"><i class="fa fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a> + + <a href="https://www.facebook.com/sharer/sharer.php?u=/cn/docs/seckill-development-journey-part-III/" class="btn btn--facebook" title="å享 Facebook"><i class="fa fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a> + + <a href="https://plus.google.com/share?url=/cn/docs/seckill-development-journey-part-III/" class="btn btn--google-plus" title="å享 Google Plus"><i class="fa fa-fw fa-google-plus" aria-hidden="true"></i><span> Google+</span></a> + + <a href="https://www.linkedin.com/shareArticle?mini=true&url=/cn/docs/seckill-development-journey-part-III/" class="btn btn--linkedin" title="å享 LinkedIn"><i class="fa fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a> +</section> + + + + <nav class="pagination"> + + <a href="/docs/seckill-development-journey-part-III/" class="pagination--pager" title="SecKill Develop Journey (III) +">åå</a> + + + <a href="/docs/distributed_saga_1/" class="pagination--pager" title="Eventual Data Consistency Solution in ServiceComb - part 1 +">åå</a> + + </nav> + + + </div> + + + <div class="page__comments"> + + + <section id="static-comments"> + + <!-- Start static comments --> + <div class="js-comments"> + + </div> + <!-- End static comments --> + + <!-- Start new comment form --> + <h4 class="page__comments-title">çä¸è¯è®º</h4> + <p class="small">æ¨ççµåé®ç®±å°åå¹¶ä¸ä¼è¢«å±ç¤ºãè¯·å¡«åæ è®°ä¸ºå¿ é¡»çåæ®µã <span class="required">*</span></p> + <form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/ServiceComb/servicesomb.github.io/master"> + <div class="form__spinner"> + <i class="fa fa-spinner fa-spin fa-3x fa-fw"></i> + <span class="sr-only">æ£å¨å è½½...</span> + </div> + + <fieldset> + <label for="comment-form-message">è¯è®º <small class="required">*</small></label> + <textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea> + <div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">Markdownè¯æ³å·²æ¯æã</a></div> + </fieldset> + <fieldset> + <label for="comment-form-name">å§å <small class="required">*</small></label> + <input type="text" id="comment-form-name" name="fields[name]" tabindex="2" /> + </fieldset> + <fieldset> + <label for="comment-form-email">çµåé®ç®± <small class="required">*</small></label> + <input type="email" id="comment-form-email" name="fields[email]" tabindex="3" /> + </fieldset> + <fieldset> + <label for="comment-form-url">ç½ç«ï¼å¯éï¼</label> + <input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/> + </fieldset> + <fieldset class="hidden" style="display: none;"> + <input type="hidden" name="options[slug]" value="seckill-develop-course-part-III"> + <label for="comment-form-location">Not used. Leave blank if you are a human.</label> + <input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/> + </fieldset> + <!-- Start comment form alert messaging --> + <p class="hidden js-notice"> + <strong class="js-notice-text"></strong> + </p> + <!-- End comment form alert messaging --> + <fieldset> + <button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--large">æäº¤è¯è®º</button> + </fieldset> + </form> + <!-- End new comment form --> + + </section> + +</div> + + + </article> + + + + <div class="page__related"> + <h4 class="page__related-title">çæ¨è¿å欢</h4> + <div class="grid__wrapper"> + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/cn/docs/jira_beginner_guide/" rel="permalink">è叿ºå¸¦ä½ å·ä»»å¡ - ServiceComb JIRAå ¥é¨æå +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">ServiceComb JIRAå ¥é¨æå +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + å°äº 1 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/docs/service-center-ui/" rel="permalink">Service-Center Management UI Console +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">An introduction Service-Center Management Console +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 2 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/docs/service-center-ui/" rel="permalink">Service-Center Management UI Console +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">An introduction Service-Center Management Console +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 2 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/cn/docs/how-to-reform-a-legacy-system/" rel="permalink">æå¤´ç¼çéçç³»ç»è¯¥å¦ä½æ¹é ï¼ +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">å¾®æå¡æ¯å¦æ¯ä¸çæå¾ å·²ä¹ çä¼ä¸æ¶æè§£å³æ¹æ¡ï¼å¨å¯¹éçç³»ç»è¿è¡å¾®æå¡çæ¹é è¿ç¨ä¸åå¨ææ ·çå°é¾åææï¼åºè¯¥æ³¨æäºä»ä¹ï¼ +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 1 åé é 读 + +</p> + + </article> +</div> + + + </div> + </div> + +</div> + + + <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> + <div align="center" style="margin: 0 0;"> + <ins class="adsbygoogle" + style="display:block; border-bottom: initial;" + data-ad-client="ca-pub-7328585512091257" + data-ad-slot="3049671934" + data-ad-format="auto"></ins> + </div> + + <div class="page__footer"> + <footer> + <!-- start custom footer snippets --> + +<!-- end custom footer snippets --> + <div class="container"> + <div class="row justify-content-md-center"> + + <div class="col"> + <ul> + <p class="header">èµæº</p> + <li><a href="/cn/docs/quick-start/">å¿«éå ¥é¨</a></li> + <li><a href="/cn/users/user-guide/">ç¨æ·æå</a></li> + <li><a href="/cn/slides/">èµæ</a></li> + <li><a href="/cn/users/faq/">常è§é®é¢</a></li> + </ul> + </div> + <div class="col"> + <ul> + <p class="header">è´¡ç®</p> + <li><a href="https://github.com/ServiceComb/ServiceComb.github.io/issues/new?title=Issue with _posts/cn/2017-09-07-seckill-develop-course-part-III.md">æ¥åæ¬ç½é¡µé®é¢</a></li> + <li><a href="https://github.com/ServiceComb/ServiceComb.github.io/edit/master/_posts/cn/2017-09-07-seckill-develop-course-part-III.md">å¨Githubä¸ç¼è¾æ¤é¡µ</a></li> + <li><a href="/cn/developers/submit-codes/">ä»£ç æäº¤æå</a></li> + </ul> + </div> + <div class="col"> + <ul class="social-icons"> + <p class="header">社åº</p> + <li> + <a href="https://groups.google.com/forum/#!forum/servicecomb-developers" target="_blank"><span class="group">å¼åè </span></a> | + <a href="https://groups.google.com/forum/#!forum/servicecomb-users" target="_blank">ç¨æ·</span></a> + </li> + <li> + <a href="http://github.com/ServiceComb" target="_blank"><span class="github">Github</span></a> + </li> + <li> + <a href="https://twitter.com/ServiceComb" target="_blank"><span class="twitter">Twitter</span></a> + </li> + <li> + <a href="/feed.xml" target="_blank"><span class="rss">Feed</span></a> + </li> + </ul> + </div> + </div> +</div> +<div class="page__footer-bottom"> + <div>© 2017 Apache incubator ServiceComb. ææ¯æ¥èªäº <a href="http://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div> +</div> + + </footer> + </div> + + <script src="/assets/js/main.min.js"></script> + + + + + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-101622733-1', 'auto'); + ga('send', 'pageview'); +</script> + + + + + + + + + <script> + (function ($) { + var $comments = $('.js-comments'); + + $('#new_comment').submit(function () { + var form = this; + + $(form).addClass('disabled'); + $('#comment-form-submit').html('<i class="fa fa-spinner fa-spin fa-fw"></i> æ£å¨å è½½...'); + + $.ajax({ + type: $(this).attr('method'), + url: $(this).attr('action'), + data: $(this).serialize(), + contentType: 'application/x-www-form-urlencoded', + success: function (data) { + $('#comment-form-submit').html('å·²æäº¤'); + $('.page__comments-form .js-notice').removeClass('notice--danger'); + $('.page__comments-form .js-notice').addClass('notice--success'); + showAlert('æè°¢æ¨çè¯è®ºï¼è¢«æ¹ååå®ä¼ç«å³å¨æ¤ç«ç¹å±ç¤ºã'); + }, + error: function (err) { + console.log(err); + $('#comment-form-submit').html('æäº¤è¯è®º'); + $('.page__comments-form .js-notice').removeClass('notice--success'); + $('.page__comments-form .js-notice').addClass('notice--danger'); + showAlert('徿±æï¼æ¨çæäº¤åå¨é误ãè¯·ç¡®ä¿ææå¿ å¡«åæ®µé½å·²å¡«åæ£ç¡®ï¼ç¶ååè¯ä¸æ¬¡ã'); + $(form).removeClass('disabled'); + } + }); + + return false; + }); + + function showAlert(message) { + $('.page__comments-form .js-notice').removeClass('hidden'); + $('.page__comments-form .js-notice-text').html(message); + } + })(jQuery); + </script> + + + + + + + + </body> +</html>
http://git-wip-us.apache.org/repos/asf/incubator-servicecomb-website/blob/08e1b43f/content/cn/docs/stress-test-on-company-with-jmeter-in-k8s/index.html ---------------------------------------------------------------------- diff --git a/content/cn/docs/stress-test-on-company-with-jmeter-in-k8s/index.html b/content/cn/docs/stress-test-on-company-with-jmeter-in-k8s/index.html new file mode 100644 index 0000000..9f07c82 --- /dev/null +++ b/content/cn/docs/stress-test-on-company-with-jmeter-in-k8s/index.html @@ -0,0 +1,921 @@ +<!doctype html> +<!-- + Minimal Mistakes Jekyll Theme 4.4.1 by Michael Rose + Copyright 2017 Michael Rose - mademistakes.com | @mmistakes + Free for personal and commercial use under the MIT license + https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE.txt +--> +<html lang="cn" class="no-js"> + <head> + <meta charset="utf-8"> + +<!-- begin SEO --> + + + + + + + + + +<title>å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯ - Apache incubator ServiceComb</title> + + + + +<meta name="description" content="ä»ç»å¦ä½å¨Kubernetesé群ä¸ä½¿ç¨JMeterè¿è¡ååæµè¯"> + + + + +<meta name="author" content="Eric Lee"> + +<meta property="og:locale" content="cn"> +<meta property="og:site_name" content="Apache incubator ServiceComb"> +<meta property="og:title" content="å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯"> + + + <link rel="canonical" href="http://github.com/pages/ServiceComb/servicesomb.github.io/cn/docs/stress-test-on-company-with-jmeter-in-k8s/"> + <meta property="og:url" content="http://github.com/pages/ServiceComb/servicesomb.github.io/cn/docs/stress-test-on-company-with-jmeter-in-k8s/"> + + + + <meta property="og:description" content="ä»ç»å¦ä½å¨Kubernetesé群ä¸ä½¿ç¨JMeterè¿è¡ååæµè¯"> + + + + <meta name="twitter:site" content="@ServiceComb"> + <meta name="twitter:title" content="å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯"> + <meta name="twitter:description" content="ä»ç»å¦ä½å¨Kubernetesé群ä¸ä½¿ç¨JMeterè¿è¡ååæµè¯"> + <meta name="twitter:url" content=""> + + + <meta name="twitter:card" content="summary"> + + + + + <meta name="twitter:creator" content="@"> + + + + + + + + + + + + + <meta property="og:type" content="article"> + <meta property="article:published_time" content="2017-08-25T00:00:00+08:00"> + + + + + + + + + <script type="application/ld+json"> + { + "@context" : "http://schema.org", + "@type" : "Person", + "name" : "Apache incubator ServiceComb", + "url" : "http://github.com/pages/ServiceComb/servicesomb.github.io", + "sameAs" : null + } + </script> + + + + <meta name="google-site-verification" content="HvJjNd7vvJ-yjSTHlBiIWEYxp_Hrz-PYEY5Idz9LRcA" /> + + + + +<!-- end SEO --> + + +<link href="/feed.xml" type="application/atom+xml" rel="alternate" title="Apache incubator ServiceComb Feed"> + +<!-- http://t.co/dKP3o1e --> +<meta name="HandheldFriendly" content="True"> +<meta name="MobileOptimized" content="320"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> + +<script> + document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js '; +</script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script> +<script src="/assets/js/prism.js"></script> + +<script type="text/javascript" async + src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> + +<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script> +<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script> +<!-- For all browsers --> +<link rel="stylesheet" href="/assets/css/main.css"> +<link rel="stylesheet" href="/assets/css/prism.css"> + +<!--[if lte IE 9]> + <style> + /* old IE unsupported flexbox fixes */ + .greedy-nav .site-title { + padding-right: 3em; + } + .greedy-nav button { + position: absolute; + top: 0; + right: 0; + height: 100%; + } + </style> +<![endif]--> + +<meta http-equiv="cleartype" content="on"> + + <!-- start custom head snippets --> + +<!-- insert favicons. use http://realfavicongenerator.net/ --> +<link href="https://fonts.cat.net/css?family=Roboto:400,500,700|Source+Code+Pro" rel="stylesheet"> +<script src="/assets/js/custom.js"></script> +<!-- end custom head snippets --> + + </head> + + <body class="layout--single"> + + <!--[if lt IE 9]> +<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div> +<![endif]--> + <div class="masthead"> + <div class="masthead__inner-wrap"> + <div class="masthead__menu"> + <nav id="site-nav" class="greedy-nav"> + + <a class="site-title active" href="/cn"><img src="//assets/images/ServiceComb-logo-1.png"></a> + + <ul class="visible-links"> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/docs/quick-start/">å¿«éå ¥é¨</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/users/">ç¨æ·æå</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/developers/">å¼åè æå</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/year-archive/">åæ</a> + + </li> + + + <li class="masthead__menu-item"> + + + + <a href="/cn/faqs/">常è§é®é¢</a> + + </li> + + </ul> + <button><div class="navicon"></div></button> + <ul class="hidden-links hidden"></ul> + <div class="nav-lang"> + + + + <a href=/docs/stress-test-on-company-with-jmeter-in-k8s/>English</a> + + </div> + </nav> + </div> + </div> +</div> + + + + + + +<div id="main" role="main"> + + <div class="sidebar sticky"> + + <div class="back-to-home">é¦é¡µ > <a href="/cn/">ServiceComb</a></div> + + + +<div itemscope itemtype="http://schema.org/Person"> + + + + <div class="author__content"> + <h3 class="author__name" itemprop="name">Eric Lee</h3> + + <p class="author__bio" itemprop="description"> + + + Winter is coming, arm ourself with code + + + </p> + + </div> + + <div class="author__urls-wrapper"> + <button class="btn btn--inverse">å ³æ³¨</button> + <ul class="author__urls social-icons"> + + + + <li> + <a href="https://eric-lee-ltk.github.io" itemprop="url"> + <i class="fa fa-fw fa-chain" aria-hidden="true"></i> ç½ç« + </a> + </li> + + + + <li> + <a href="mailto:[email protected]"> + <meta itemprop="email" content="[email protected]" /> + <i class="fa fa-fw fa-envelope-square" aria-hidden="true"></i> çµåé®ç®± + </a> + </li> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!-- + <li> + <a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs"> + <i class="fa fa-fw" aria-hidden="true"></i> Custom Social Profile Link + </a> + </li> +--> + </ul> + </div> +</div> + + + </div> + + + + <article class="page" itemscope itemtype="http://schema.org/CreativeWork"> + <meta itemprop="headline" content="å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯"> + <meta itemprop="description" content="ä»ç»å¦ä½å¨Kubernetesé群ä¸ä½¿ç¨JMeterè¿è¡ååæµè¯"> + <meta itemprop="datePublished" content="August 25, 2017"> + <meta itemprop="dateModified" content="August 26, 2017"> + + <div class="page__inner-wrap"> + + + <header> + <h1 class="page__title" itemprop="headline">å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯ +</h1> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + å°äº 1 åé é 读 + +</p> + + </header> + + + + <section class="page__content" itemprop="text"> + <h2 id="èæ¯">èæ¯</h2> + +<p>ããååæµè¯æ¯è¯ä¼°åºç¨æ§è½çä¸ç§ææææ®µãæ¤å¤ï¼è¶æ¥è¶å¤çåºç¨è¢«æå为å¤ä¸ªå¾®æå¡èæ¯ä¸ªå¾®æå¡çæ§è½ä¸ä¸,æçå¾®æå¡æ¯è®¡ç®å¯éåï¼æçæ¯IOå¯éåã</p> + +<p>ããå æ¤ï¼ååæµè¯å¨åºäºå¾®æå¡æ¶æçç½ç»åºç¨ä¸æ®æ¼çè¶æ¥è¶éè¦çè§è²ãæ¬æå°å¨<a href="https://kubernetes.io/">Kubernetes</a>é群ä¸ä½¿ç¨<a href="https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwiv9rjg7u_VAhUkxoMKHfoYDaYQFggvMAA&url=http%3A%2F%2Fjmeter.apache.org%2F&usg=AFQjCNHIHCOA-F9LnhaAn_STCWyPPgOpdw">JMeter 3.2</a>æ¥å¯¹<a href="https://github.com/ServiceComb/ServiceComb-Company-WorkShop">Companyåºç¨</a>è¿è¡æ§è½è¯ä¼°ã</p> + +<p>ããå¨ä¸æ<a href="http://servicecomb.io/cn/docs/autoscale-on-company/">ãå¾®æå¡ååçæéç²¾ç»åèµæºæ§å¶ã</a>ä¸å·²äºè§£å°Manageræå¡çèµæºéæ±æå¤§ï¼æ¬æ¬¡ä½¿ç¨JMeter对Companyåºç¨è¿è¡ç²¾ç»çæ§è½æµè¯ã</p> + +<h2 id="å¶å®jmeteræµè¯æ¹æ¡">å¶å®JMeteræµè¯æ¹æ¡</h2> +<p>ããå¶å®çæµè¯æ¹æ¡ä¸ºï¼</p> + +<ul> + <li> + <p>ç±äºç»å½è®¤è¯ä¼é æè¾å¤§æ¶å»¶ï¼æ å¨ååæµè¯ä¸»ä½è¿è¡åå®æç¨æ·è®¤è¯äºå®ï¼</p> + </li> + <li> + <p>对Companyåºç¨å¤ä¸ªæ¥å£æç»å¹¶å访é®ï¼QueryWorker, QueryBeekeeperDrone, QueryBeekeeperQueenåå«å¯¹Companyä¸çæå¡å起请æ±ååã</p> + </li> +</ul> + +<p>ããæµè¯æ¹æ¡æä»¶ç¬è å·²æç®¡äºgithubä¸ï¼å¯ç´æ¥è·åï¼</p> + +<div class="language-bash highlighter-rouge"><pre class="highlight"><code>git clone https://github.com/ServiceComb/ServiceComb-Company-WorkShop +<span class="nb">cd </span>ServiceComb-Company-WorkShop/stress-tests +</code></pre> +</div> + +<p class="figure-caption"><img src="/assets/images/company_test_plan.png" alt="å¾1 æµè¯è®¡å" /><br /> +å¾1 æµè¯è®¡å</p> + +<p>ãã卿们æµè¯è®¡åçå¼å§ï¼æä»¬è®¾ç½®äºä¸äºå¨ææçº¿ç¨ç»é½è½å ±äº«çå ¨å±é ç½®ãå ¶ä¸ï¼<em>CSV Data Set Config</em>ç»ä»¶ä»æ¬å°csvæä»¶ä¸å è½½æµè¯æå¡å¨çä¿¡æ¯ã<em>HTTP Request Defaults</em>ç»ä»¶å为æ¯ä¸ªè¯·æ±é¢è®¾äºé»è®¤çè¯·æ±æå¡å¨ä¿¡æ¯ï¼å¦IPå端å£ã<em>User Defined Variables</em>ç»ä»¶å®ä¹äºå ¨å±å ±äº«çåéã<em>HTTP Header Manager</em>ç»ä»¶èªå¨ä¸ºæ¯ä¸ªè¯·æ±æ·»å HTTPç请æ±å¤´é¨ã</p> + +<p>ããæ¥çå°±æ¯<em>setUp</em>线ç¨ç»äºãå ¶ä½ç¨ä¸»è¦æ¯å¤çç¨æ·è®¤è¯ãç±äºCookieå¨ç½ç»åºç¨ä¸å¾å°è¾å¹¿æ³çåºç¨ï¼å æ¤JMeterä¸å ç½®çè®¤è¯æ¹å¼æ¯éè¿<em>HTTP Cookie Manager</em>ç»ä»¶æ¥å®æçãç¶èï¼æä»¬çCompany示ä¾éç¨çæ¯åºäºTokençè®¤è¯æ¹å¼è䏿¯åºäºCookieçè®¤è¯æ¹å¼ãå æ¤ï¼è¿ç»æä»¬å¨JMeterä¸å¤çè®¤è¯æ·»å äºä¸ç¹é¾åº¦ã<em>Remove header pre processor</em>ç»ä»¶ä½¿ç¨äºä»¥ä¸çèæ¬æ¥å»æç»å½æ¶è¯·æ±ä¸å¸¦æé»è®¤ç请æ±å¤´é¨ï¼å³ç»å½è¯·æ±æ¶å¹¶ä¸éè¦å¸¦æé´æç请æ±å¤´é¨ã</p> +<div class="language-shell highlighter-rouge"><pre class="highlight"><code>import org.apache.jmeter.protocol.http.control.Header; +sampler.getHeaderManager<span class="o">()</span>.removeHeaderNamed<span class="o">(</span><span class="s2">"Authorization"</span><span class="o">)</span>; +</code></pre> +</div> +<p>ããç¶åæä»¬éè¿<em>Set up Login</em>ç»ä»¶åèµ·ä¸æ¬¡ç»å½è¯·æ±æ¥è·åç¨æ·ç»å½é´æä¿¡æ¯ãä¹ååéè¿æ£åè¡¨è¾¾å¼æåç»ä»¶<em>authorization_extractor</em>æ¥æåååºå¤´é¨ä¸ç<em>Authorization</em>对åºçå¼ãç±äºåéæ æ³å¨ä¸åç线ç¨ç»ä¸å ±äº«åä¼ éï¼è¿æ¶å<em>BeanShell PostProcessor</em>ç»ä»¶å°±æ´¾ä¸ç¨åºäºï¼å®ä¸»è¦å·¥ä½å°±æ¯å°å½å线ç¨ç»ä¸çç®æ åé转æ¢ä¸ºå ¨å±å±æ§ã</p> +<div class="language-shell highlighter-rouge"><pre class="highlight"><code><span class="k">${</span><span class="nv">__setProperty</span><span class="p">(Authorization,</span><span class="k">${</span><span class="nv">Authorization</span><span class="k">}</span><span class="p">,)</span><span class="k">}</span> +</code></pre> +</div> +<p>ãã卿µè¯è®¡åçæåé¨åå°±æ¯æä»¬è¦å¨Company示ä¾ä¸è¿è¡çååæµè¯ãæµè¯æéåçä¸ä¸ªæ¥å£é½æ¯éè¿ç»çæå¡è·¯ç±è³å ¶ä»ä¸¤ä¸ªæå¡çï¼å³æå·¥æå¡åå »è人æå¡ã卿们æµè¯å¼å§ä¹åï¼æä»¬éè¿æå¼<em>StressTest</em>çå¼å ³æ¥ç¦ç¨ç»çæå¡æä¾çç¼åè½åï¼ä»èä½¿å¾æå·¥æå¡åå »è人æå¡è½å¤å¤çå°ç¨æ·è¯·æ±ç计ç®ä»»å¡ãæ¤å¤ï¼æä»¬éè¿å°è¯·æ±åæ°è®¾ç½®ä¸º1æ¥ç®åæå·¥æå¡åå »è人æå¡ç计ç®ä»»å¡ã</p> + +<h2 id="å¯å¨æµè¯">å¯å¨æµè¯</h2> + +<ul> + <li> + <p>å¨Kubernetesé群ä¸ä»¥æ èµæºéå¶çæ¹å¼æ¥è¿è¡<em>Companyåºç¨</em>ã</p> + </li> + <li> + <p>ä¿®æ¹hosts.csvæä»¶ï¼ä½¿å ¶å¹é æ£å¨Kubernetesé群ä¸è¿è¡çCompanyåºç¨çæå¡å°åãå ¶ä¸ï¼é»è®¤çhosts.csvæä»¶å 容为ï¼</p> + + <pre><code class="language-csv"> 127.0.0.1,8083 +</code></pre> + </li> + <li> + <p>è¿è¡æµè¯ï¼å¯å¨200个并å线ç¨å起请æ±ååï¼å¹¶è®¾ç½®æµè¯æ¶å¸¸ä¸º600ç§ã</p> + + <div class="language-bash highlighter-rouge"><pre class="highlight"><code> jmeter -n -t workshop.jmx -j workshop.log -l workshop.jtl -Jthreads<span class="o">=</span>200 -Jduration<span class="o">=</span>600 +</code></pre> + </div> + </li> +</ul> + +<h2 id="æµè¯ç»æ">æµè¯ç»æ</h2> +<p>ããå¨ä¸åå¹¶å度ä¸çæµè¯ç»æå¦ä¸å¾æç¤ºï¼</p> + +<p class="figure-caption"><img src="/assets/images/company_concurrency_performance.png" alt="å¾2 å¹¶åä¸åæ¶çæ§è½æ¯è¾" class="align-center" /> +å¾2 å¹¶åä¸åæ¶çæ§è½æ¯è¾</p> + +<p>ããå¯ä»¥çåºï¼ç»çæå¡çæ§è½å¨å°è¾¾ç¶é¢ï¼15å¹¶å度ï¼åé常稳å®ï¼ä¿æå¹³åååºæ¶é´æä½çæ åµä¸ååéå¿«éä¸åå°<strong>æå¤§çº¦1000è¯·æ±æ¯ç§</strong>çæ°´å¹³ã ä½éçå¹¶å度çè¿ä¸æ¥æåï¼å¹³åååºæ¶é´å¼å§å¿«éå¢å ãå æ¤ï¼<strong>å°ååºæ¶é´ç»è®¡æ°æ®ä½ä¸ºè¯ä¼°çæè¶ æ¶ç设置é常åé</strong>ã</p> + +<p class="figure-caption"><img src="/assets/images/company_response_time.png" alt="å¾3 ä¸åæå¡çå¹³åååºæ¶é´" class="align-center" /> +å¾3 ä¸åæå¡çå¹³åååºæ¶é´</p> + +<p>ããä¸å¾æ¾ç¤ºäºä¸åæå¡çå¹³åååºæ¶é´ãç±äºå »è人æå¡éè¦è°ç¨æå·¥æå¡ï¼å æ¤å ¶ååºæ¶é´ç¸å¯¹äºæå·¥æå¡çååºæ¶é´è¦ç¨å¾®ä¹ ä¸ç¹ã</p> + +<p class="figure-caption"><img src="/assets/images/company_cpu_load.png" alt="å¾4 ä¸åå¹¶å度ä¸CPUçè´è½½" class="align-center" /> +å¾4 ä¸åå¹¶å度ä¸CPUçè´è½½</p> + +<p>ããä¸ºäºæ¾åºæ§è½å¡å¨äº15å¹¶å度æ¶çåå ï¼æä»¬åçäº<a href="https://github.com/kubernetes/heapster">Heapster</a>ä¸ççæ§æ°æ®ãå¦ä¸å¾æç¤ºï¼æ¾ç¶ï¼<strong>ç»çæå¡æ¯å½åç³»ç»çç¶é¢æå¨</strong>ãå®å¨ååé为1000 req/sæ¶è¾¾å°äºæå¤§çCPUè´è½½ã ç¸å¯¹èè¨ï¼å ¶å®æå¡å¯¹èµæºçéæ±çå¢é¿éåº¦è¦æ ¢å¾å¤ã</p> + +<p>ããç±äºç»çæå¡çæ¥å¿æ¯ç´æ¥è¾åºå°stdoutä¸çï¼ä¸JMeterçæµè¯ç«¯ä»¥åæºæ¨¡å¼è¿è¡æ¶å¯è½å¹¶ä¸è½åæ¶æ¨¡æåºè¶³å¤çå¹¶åéã便¤å¯¹å¨åä¸å¹¶å度ï¼200ï¼ä¸ä¸ålogç设置ï¼log4j1 stdout, log4j2 stdoutï¼log4j2 弿¥ï¼æ æ¥å¿è¾åºï¼è¿è¡æµè¯ãå ¶ä¸ï¼å¼æ¥logå¨<em>log4j2.xml</em>æä»¶ä¸ç设置å¦ä¸æç¤ºï¼</p> + +<div class="language-xml highlighter-rouge"><pre class="highlight"><code><span class="cp"><?xml version="1.0" encoding="UTF-8" ?></span> +<span class="nt"><Configuration</span> <span class="na">status=</span><span class="s">"INFO"</span><span class="nt">></span> + <span class="nt"><Appenders></span> + <span class="nt"><RandomAccessFile</span> <span class="na">name=</span><span class="s">"RandomAccessFile"</span> <span class="na">fileName=</span><span class="s">"manager.log"</span> <span class="na">immediateFlush=</span><span class="s">"false"</span> <span class="na">append=</span><span class="s">"false"</span><span class="nt">></span> + <span class="nt"><PatternLayout</span> <span class="na">pattern=</span><span class="s">"%d [%p] %m %l%n"</span><span class="nt">/></span> + <span class="nt"></RandomAccessFile></span> + <span class="nt"></Appenders></span> + <span class="nt"><Loggers></span> + <span class="nt"><asyncRoot</span> <span class="na">level=</span><span class="s">"info"</span><span class="nt">></span> + <span class="nt"><AppenderRef</span> <span class="na">ref=</span><span class="s">"RandomAccessFile"</span><span class="nt">/></span> + <span class="nt"></asyncRoot></span> + <span class="nt"></Loggers></span> +<span class="nt"></Configuration></span> +</code></pre> +</div> +<p>æ¤å¤ï¼è¿éè¦æ·»å å¦ä¸<em>disruptor</em>çä¾èµé¡¹ä½¿å¼æ¥ç设置çæï¼</p> + +<div class="language-xml highlighter-rouge"><pre class="highlight"><code><span class="nt"><dependency></span> + <span class="nt"><groupId></span>com.lmax<span class="nt"></groupId></span> + <span class="nt"><artifactId></span>disruptor<span class="nt"></artifactId></span> + <span class="nt"><version></span>3.3.6<span class="nt"></version></span> +<span class="nt"></dependency></span> +</code></pre> +</div> +<p>æ²¡ææ¥å¿è¾åºçè®¾ç½®ä» ä» æ¯å°ä¸è¿°<em>log4j2.xml</em>æä»¶ä¸çæ¥å¿è¾åºçº§å«ä»<em>info</em>æ¹ä¸º<em>off</em>å³å¯ãæ¤å¤ï¼æä»¬è¿ä½¿ç¨JMeteråå¸å¼ç模å¼è¿è¡äºç¸å ³çæµè¯ãJMeterä¸ä½¿ç¨åå¸å¼çæ¨¡å¼æ¥è¿è¡ä¸»è¦å两æ¥ï¼</p> + +<ol> + <li> + <p>卿¯ä¸ªæµè¯ä»èç¹ä¸è¿è¡<em>jmeter-server</em>ï¼å ¶è¿è¡æä»¤å¦ä¸ï¼</p> + + <div class="language-bash highlighter-rouge"><pre class="highlight"><code>jmeter-server -Djava.rmi.server.hostname<span class="o">=</span><span class="k">$(</span>ifconfig eth0 | grep <span class="s2">"inet addr"</span> | awk <span class="s1">'{print $2}'</span> | cut -d <span class="s2">":"</span> -f2<span class="k">)</span> +</code></pre> + </div> + </li> + <li> + <p>卿µè¯ä¸»èç¹ä¸è¿è¡<em>jmeter</em>ï¼æä»¤å¦ä¸ï¼</p> + + <div class="language-bash highlighter-rouge"><pre class="highlight"><code>jmeter -n -R host1,host2 -t workshop.jmx -j workshop.log -l workshop.jtl -Gmin<span class="o">=</span>1 -Gmax<span class="o">=</span>2 -Gthreads<span class="o">=</span>200 -Gduration<span class="o">=</span>600 +</code></pre> + </div> + + <p class="notice--warning"><em>注æäºé¡¹</em>ï¼JMeter屿§å¨åå¸å¼æ¨¡å¼ä¸å¹¶ä¸è½çæï¼éè¦å°å ¶å£°æä¸ºå ¨å±ç屿§ãå æ¤ï¼æ¤å¤æä»¬ç¨çæ¯<em>-G</em>çé项è䏿¯ä¹åç<em>-J</em>çé项ã</p> + </li> +</ol> + +<p>è¿è¡ç»æå¦ä¸æç¤ºï¼</p> + +<p><img src="/assets/images/company_log_and_jmeter.png" alt="ä¸åæ¥å¿è®¾ç½®ä¸å模å¼ä¸çæ§è½" class="align-center" /></p> + +<p>ããä»ä¸å¾å¯ä»¥çåºï¼</p> + +<ul> + <li> + <p>JMeteråæºæµè¯ååå¸å¼æµè¯çæ§è½é½é常æ¥è¿ï¼è¯´æåæºæ¨¡å¼çJMeteræµè¯ææ¶æ¥è¯´æ¯è¶³ä»¥æ¨¡æåºè¶³å¤çå¹¶åæ°æ¥å¤çå½åçæµè¯åºæ¯çã</p> + </li> + <li> + <p>æ¥å¿çè¾åºç确对系ç»çæ§è½é æäºè¾å¤§çå½±åï¼å¯ä»¥çå°ï¼å¼æ¥è¾åºæ¥å¿çæ¹å¼è½æ¯åæ¥è¾åºçæ¹å¼æåæ¥è¿100%çååéãå æ¤ï¼<strong>å¨ç产ç¯å¢ä¸ä½¿ç¨å®å ¨åæ¥è¾åºæ¥å¿çæ¹å¼å¯è½å¹¶ä¸ä¼æè¾çæ³çæ§è½ã</strong></p> + </li> + <li> + <p>log4j2çååéç¸å¯¹äºlog4j1èè¨å¤§å¹ æé«äºçº¦40%ï¼å å使ç¨é乿´å°äºãå æ¤ï¼<strong>æ¨èä½¿ç¨æ§è½æ´ä½³çlog4j2æ¿æ¢æéæ§çlog4j1</strong>ã</p> + </li> +</ul> + +<p class="figure-caption"><img src="/assets/images/company_different_log_memory_usage.png" alt="å¾5 ä¸åæ¥å¿è®¾ç½®ä¸çå å使ç¨é" class="align-center" /> +å¾5 ä¸åæ¥å¿è®¾ç½®ä¸çå å使ç¨é</p> + +<p>ããå°½ç®¡å¼æ¥æ¥å¿çæ¹å¼è½æå¤§å°æé«ç³»ç»çååéï¼ä½å®åæ¶ä¹å ç¨äºè¾å¤çå åï¼å¦å¾5æç¤ºã</p> + +<p class="figure-caption"><img src="/assets/images/company_memory_used.png" alt="å¾6 æµè¯è¿ç¨çå å使ç¨é" class="align-center" /> +å¾6 æµè¯è¿ç¨çå å使ç¨é</p> + +<p>ããå¾6æ¾ç¤ºäºå¨æµè¯è¿ç¨ä¸ä¸åæå¡çå å使ç¨éãç±äºCompany示ä¾åªæ¯ä¸ä¸ªç®åçç¨ä¾ï¼å¨æµè¯è¿ç¨ä¸å个æå¡çå å使ç¨çé½ç¸å¯¹ç¨³å®ãç¶èï¼ç¸å¯¹<em>å示æ </em>æå¡ï¼ä½¿ç¨goè¯è¨ç¼åï¼çå å使ç¨éèè¨ï¼å ¶å®ä»¥Javaæ¥ç¼åçæå¡åå ç¨äºè¾å¤çå åã</p> + +<h2 id="æ»ç»">æ»ç»</h2> + +<p>ãã对åºç¨è¿è¡ååæµè¯å¾å¾è½å¨åºç¨æå ¥ç产ç¯å¢å叮婿们æ¾åºæå¡ä¸æ½å¨çé®é¢ãååæµè¯ä¹è½æ¨¡æç产ç¯å¢ï¼ä»èæ¥éªè¯æå¡æ¯å¦å·²è¾¾å°è§å®çæ§è½ææ ãèæ ¹æ®ååæµè¯çç»æï¼æä»¬å¯ä»¥æè¡¡Podé¨ç½²æ¶ç设置æ¥ä¿è¯SLAçåæ¶è·å¾æå¤§çç³»ç»ååè½åã</p> + +<p>ããåºäºå¾®æå¡æ¶æçåºç¨ä¸ä» å¨è®¾è®¡ãç¼ç åæµè¯æ¹é¢å徿´å çµæ´»ï¼åæ¶ä¹ä½¿å¾é¨ç½²æ´å æ¹ä¾¿ãåºäºå¾®æå¡æ¶æè½å¤ä¿è¯èµæºçå¼¹æ§ä¼¸ç¼©æå ¶è¿ æ·ï¼æä»¬å¯ä»¥æ ¹æ®æå¡ççå®å¯æ¿ååå设置ä¸åç坿¬æ°åèµæºé ç½®æ¥èçº¦èµæºãæ¤å¤ï¼å¨äºä¸ä¹è½åå©å ¶å¼¹æ§ä¼¸ç¼©è½åä½¿å¾æå¡è½å¤åºå¯¹è®¿é®é£æ´ã</p> + + + </section> + + <footer class="page__meta"> + + + + + + + + + + <p class="page__taxonomy"> + <strong><i class="fa fa-fw fa-tags" aria-hidden="true"></i> æ ç¾: </strong> + <span itemprop="keywords"> + + + + <a href="/tags/#jmeter" class="page__taxonomy-item" rel="tag">jmeter</a><span class="sep">, </span> + + + + <a href="/tags/#%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95" class="page__taxonomy-item" rel="tag">ååæµè¯</a> + + </span> + </p> + + + + + + + + + <p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> ææ°ç:</strong> <time datetime="2017-08-26">2017å¹´8æ26æ¥</time></p> + + + + </footer> + + <section class="page__share"> + + <h4 class="page__share-title">å享</h4> + + + <a href="https://twitter.com/intent/tweet?via=ServiceComb&text=å¨Kubernetesé群ä¸ä½¿ç¨JMeter对Company示ä¾è¿è¡ååæµè¯ /cn/docs/stress-test-on-company-with-jmeter-in-k8s/" class="btn btn--twitter" title="å享 Twitter"><i class="fa fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a> + + <a href="https://www.facebook.com/sharer/sharer.php?u=/cn/docs/stress-test-on-company-with-jmeter-in-k8s/" class="btn btn--facebook" title="å享 Facebook"><i class="fa fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a> + + <a href="https://plus.google.com/share?url=/cn/docs/stress-test-on-company-with-jmeter-in-k8s/" class="btn btn--google-plus" title="å享 Google Plus"><i class="fa fa-fw fa-google-plus" aria-hidden="true"></i><span> Google+</span></a> + + <a href="https://www.linkedin.com/shareArticle?mini=true&url=/cn/docs/stress-test-on-company-with-jmeter-in-k8s/" class="btn btn--linkedin" title="å享 LinkedIn"><i class="fa fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a> +</section> + + + + <nav class="pagination"> + + <a href="/docs/stress-test-on-company-with-jmeter-in-k8s/" class="pagination--pager" title="Stress test on Company Demo with Jmeter in Kubernetes Cluster +">åå</a> + + + <a href="/docs/seckill-development-journey-part-I/" class="pagination--pager" title="SecKill Development Journey (I) +">åå</a> + + </nav> + + + </div> + + + <div class="page__comments"> + + + <section id="static-comments"> + + <!-- Start static comments --> + <div class="js-comments"> + + </div> + <!-- End static comments --> + + <!-- Start new comment form --> + <h4 class="page__comments-title">çä¸è¯è®º</h4> + <p class="small">æ¨ççµåé®ç®±å°åå¹¶ä¸ä¼è¢«å±ç¤ºãè¯·å¡«åæ è®°ä¸ºå¿ é¡»çåæ®µã <span class="required">*</span></p> + <form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/ServiceComb/servicesomb.github.io/master"> + <div class="form__spinner"> + <i class="fa fa-spinner fa-spin fa-3x fa-fw"></i> + <span class="sr-only">æ£å¨å è½½...</span> + </div> + + <fieldset> + <label for="comment-form-message">è¯è®º <small class="required">*</small></label> + <textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea> + <div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">Markdownè¯æ³å·²æ¯æã</a></div> + </fieldset> + <fieldset> + <label for="comment-form-name">å§å <small class="required">*</small></label> + <input type="text" id="comment-form-name" name="fields[name]" tabindex="2" /> + </fieldset> + <fieldset> + <label for="comment-form-email">çµåé®ç®± <small class="required">*</small></label> + <input type="email" id="comment-form-email" name="fields[email]" tabindex="3" /> + </fieldset> + <fieldset> + <label for="comment-form-url">ç½ç«ï¼å¯éï¼</label> + <input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/> + </fieldset> + <fieldset class="hidden" style="display: none;"> + <input type="hidden" name="options[slug]" value="stress-test-on-company-with-jmeter-in-k8s"> + <label for="comment-form-location">Not used. Leave blank if you are a human.</label> + <input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/> + </fieldset> + <!-- Start comment form alert messaging --> + <p class="hidden js-notice"> + <strong class="js-notice-text"></strong> + </p> + <!-- End comment form alert messaging --> + <fieldset> + <button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--large">æäº¤è¯è®º</button> + </fieldset> + </form> + <!-- End new comment form --> + + </section> + +</div> + + + </article> + + + + <div class="page__related"> + <h4 class="page__related-title">çæ¨è¿å欢</h4> + <div class="grid__wrapper"> + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/cn/docs/jira_beginner_guide/" rel="permalink">è叿ºå¸¦ä½ å·ä»»å¡ - ServiceComb JIRAå ¥é¨æå +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">ServiceComb JIRAå ¥é¨æå +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + å°äº 1 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/docs/service-center-ui/" rel="permalink">Service-Center Management UI Console +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">An introduction Service-Center Management Console +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 2 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/docs/service-center-ui/" rel="permalink">Service-Center Management UI Console +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">An introduction Service-Center Management Console +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 2 åé é 读 + +</p> + + </article> +</div> + + + + + + +<div class="grid__item"> + <article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork"> + + <h2 class="archive__item-title" itemprop="headline"> + + <a href="/cn/docs/how-to-reform-a-legacy-system/" rel="permalink">æå¤´ç¼çéçç³»ç»è¯¥å¦ä½æ¹é ï¼ +</a> + + </h2> + <p class="archive__item-excerpt" itemprop="description">å¾®æå¡æ¯å¦æ¯ä¸çæå¾ å·²ä¹ çä¼ä¸æ¶æè§£å³æ¹æ¡ï¼å¨å¯¹éçç³»ç»è¿è¡å¾®æå¡çæ¹é è¿ç¨ä¸åå¨ææ ·çå°é¾åææï¼åºè¯¥æ³¨æäºä»ä¹ï¼ +</p> + + <p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> + + + + + 1 åé é 读 + +</p> + + </article> +</div> + + + </div> + </div> + +</div> + + + <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> + <div align="center" style="margin: 0 0;"> + <ins class="adsbygoogle" + style="display:block; border-bottom: initial;" + data-ad-client="ca-pub-7328585512091257" + data-ad-slot="3049671934" + data-ad-format="auto"></ins> + </div> + + <div class="page__footer"> + <footer> + <!-- start custom footer snippets --> + +<!-- end custom footer snippets --> + <div class="container"> + <div class="row justify-content-md-center"> + + <div class="col"> + <ul> + <p class="header">èµæº</p> + <li><a href="/cn/docs/quick-start/">å¿«éå ¥é¨</a></li> + <li><a href="/cn/users/user-guide/">ç¨æ·æå</a></li> + <li><a href="/cn/slides/">èµæ</a></li> + <li><a href="/cn/users/faq/">常è§é®é¢</a></li> + </ul> + </div> + <div class="col"> + <ul> + <p class="header">è´¡ç®</p> + <li><a href="https://github.com/ServiceComb/ServiceComb.github.io/issues/new?title=Issue with _posts/cn/2017-08-25-stress-test-on-company-with-jmeter-in-k8s.md">æ¥åæ¬ç½é¡µé®é¢</a></li> + <li><a href="https://github.com/ServiceComb/ServiceComb.github.io/edit/master/_posts/cn/2017-08-25-stress-test-on-company-with-jmeter-in-k8s.md">å¨Githubä¸ç¼è¾æ¤é¡µ</a></li> + <li><a href="/cn/developers/submit-codes/">ä»£ç æäº¤æå</a></li> + </ul> + </div> + <div class="col"> + <ul class="social-icons"> + <p class="header">社åº</p> + <li> + <a href="https://groups.google.com/forum/#!forum/servicecomb-developers" target="_blank"><span class="group">å¼åè </span></a> | + <a href="https://groups.google.com/forum/#!forum/servicecomb-users" target="_blank">ç¨æ·</span></a> + </li> + <li> + <a href="http://github.com/ServiceComb" target="_blank"><span class="github">Github</span></a> + </li> + <li> + <a href="https://twitter.com/ServiceComb" target="_blank"><span class="twitter">Twitter</span></a> + </li> + <li> + <a href="/feed.xml" target="_blank"><span class="rss">Feed</span></a> + </li> + </ul> + </div> + </div> +</div> +<div class="page__footer-bottom"> + <div>© 2017 Apache incubator ServiceComb. ææ¯æ¥èªäº <a href="http://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div> +</div> + + </footer> + </div> + + <script src="/assets/js/main.min.js"></script> + + + + + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-101622733-1', 'auto'); + ga('send', 'pageview'); +</script> + + + + + + + + + <script> + (function ($) { + var $comments = $('.js-comments'); + + $('#new_comment').submit(function () { + var form = this; + + $(form).addClass('disabled'); + $('#comment-form-submit').html('<i class="fa fa-spinner fa-spin fa-fw"></i> æ£å¨å è½½...'); + + $.ajax({ + type: $(this).attr('method'), + url: $(this).attr('action'), + data: $(this).serialize(), + contentType: 'application/x-www-form-urlencoded', + success: function (data) { + $('#comment-form-submit').html('å·²æäº¤'); + $('.page__comments-form .js-notice').removeClass('notice--danger'); + $('.page__comments-form .js-notice').addClass('notice--success'); + showAlert('æè°¢æ¨çè¯è®ºï¼è¢«æ¹ååå®ä¼ç«å³å¨æ¤ç«ç¹å±ç¤ºã'); + }, + error: function (err) { + console.log(err); + $('#comment-form-submit').html('æäº¤è¯è®º'); + $('.page__comments-form .js-notice').removeClass('notice--success'); + $('.page__comments-form .js-notice').addClass('notice--danger'); + showAlert('徿±æï¼æ¨çæäº¤åå¨é误ãè¯·ç¡®ä¿ææå¿ å¡«åæ®µé½å·²å¡«åæ£ç¡®ï¼ç¶ååè¯ä¸æ¬¡ã'); + $(form).removeClass('disabled'); + } + }); + + return false; + }); + + function showAlert(message) { + $('.page__comments-form .js-notice').removeClass('hidden'); + $('.page__comments-form .js-notice-text').html(message); + } + })(jQuery); + </script> + + + + + + + + </body> +</html>
