In [1]:
import requests
from bs4 import BeautifulSoup

In [2]:
from pymongo import MongoClient
client = MongoClient()
db = client.zhihu
topic = db.topic
question = db.question
question_answer = db.question_answer
answer_comment = db.answer_comment
answer = db.answer
comment = db.comment
member = db.member

In [3]:
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
          'authorization':'Bearer Mi4wQUJES2V4VTJGd2tBUUlKaDFUMHJDeGNBQUFCaEFsVk5iUjlIV1FCTWJlYlFVemVUSUxxZFlpNTVIRGRiYTQ5U3d3|1497493211|bfcfd074d07a691bdfe92a980ff4eb770a918cd8'
          #'authorization':'oauth c3cef7c66a1843f8b3a9e6a1e3160e20',
          }

In [4]:
zhihu_api = 'https://www.zhihu.com/api/v4/'

In [5]:
zhihu_api_topics = zhihu_api+'/topics/{}?include=introduction%2Cquestions_count%2C\
best_answers_count%2Cfollowers_count%2Cis_following'

In [6]:
zhihu_api_topics_top_answers = 'https://www.zhihu.com/topic/{}/top-answers?page={}'

In [7]:
zhihu_api_questions = zhihu_api+'questions/{}'

In [8]:
zhihu_api_answers = zhihu_api+'answers/{}'
zhihu_api_answers_comments = zhihu_api+'''answers/{}/comments?include=data%5B*%5D.author%2Ccollapsed%2C
reply_to_author%2Cdisliked%2Ccontent%2Cvoting%2Cvote_count%2Cis_parent_author%2C
is_author&order=normal&limit=20&offset=0&status=open'''
questions_answers_include = '''include=data%5B*%5D.is_normal%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2C\
can_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Cmark_infos%2C\
created_time%2Cupdated_time%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3B\
data%5B*%5D.author.badge%5B%3F(type%3Dbest_answerer)%5D.topics'''
zhihu_api_questions_answers = zhihu_api+'questions/{}/answers?limit=20&offset=0'+'&'+questions_answers_include

In [9]:
members_include = '''include=locations%2Cemployments%2Cgender%2Ceducations%2Cbusiness%2Cvoteup_count%2Cthanked_Count%2C\
follower_count%2Cfollowing_count%2Ccover_url%2Cfollowing_topic_count%2Cfollowing_question_count%2Cfollowing_favlists_count%2C\
following_columns_count%2Cavatar_hue%2Canswer_count%2Carticles_count%2Cpins_count%2Cquestion_count%2C\
commercial_question_count%2Cfavorite_count%2Cfavorited_count%2Clogs_count%2Cmarked_answers_count%2Cmarked_answers_text%2C\
message_thread_token%2Caccount_status%2Cis_active%2Cis_force_renamed%2Cis_bind_sina%2Csina_weibo_url%2C\
sina_weibo_name%2Cshow_sina_weibo%2Cis_blocking%2Cis_blocked%2Cis_following%2Cis_followed%2Cmutual_followees_count%2Cvote_to_count%2C\
vote_from_count%2Cthank_to_count%2Cthank_from_count%2Cthanked_count%2Cdescription%2Chosted_live_count%2C\
participated_live_count%2Callow_message%2Cindustry_category%2Corg_name%2Corg_homepage%2C\
badge%5B%3F(type%3Dbest_answerer)%5D.topics'''
zhihu_api_members = zhihu_api+'members/{}'+'?'+members_include

In [10]:
def get_data_from_zhihu_api(api,token):
    data = {'totals':0,'items':[]}
    res = requests.get(api.format(token),headers=headers)
    if res.status_code == 404:
        return {'http_error':404}
    j = res.json()
    if not 'offset' in api:
        return j
    else:
        try:
            data['totals'] = j['paging']['totals']
        except:
            data['totals'] = None
        data['items'].extend(j['data'])
        while not j['paging']['is_end']:
            res = requests.get(j['paging']['next'],headers=headers)
            j = res.json()
            data['items'].extend(j['data'])
        return data

In [30]:
def get_proxy():
    return requests.get("http://123.207.35.36:5000/get/").content

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))

In [31]:
def get_topic_hot(topic_token):
    j = get_data_from_zhihu_api(zhihu_api_topics,topic_token)
    page = j['best_answers_count']/20 + 1
    question_token_list = []
    for p in xrange(page):
        r_ = requests.get(zhihu_api_topics_top_answers.format(topic_token,p+1),headers=headers,proxies={"http": "http://{}".format(get_proxy())})
        if r_.status_code == 404:
            continue
        print r_.content
        soup = BeautifulSoup(r_.content)
        q = soup.find('div',attrs={'class':'zm-topic-list-container'}).find_all('a',attrs={'class':'question_link'})
        for i in q:
            question_token_list.append(i.attrs['href'].split('/')[-1])
    return j,list(set(question_token_list))

In [12]:
def get_answer_token(answers):
    answer_token_list = []
    for item in answers['items']:
        answer_token_list.append(int(item['url'].split('/')[-1]))
    return answer_token_list

In [13]:
def save_topic_all(topic_token):
    topic_token = str(topic_token)
    if topic.find_one({'topic_token':topic_token}) == None:
        topic_j,question_token_list = get_topic_hot(topic_token)
        topic.insert_one({'_id':topic_token,'topic_token':topic_token,'data':topic_j,'question_token_list':question_token_list})
        for question_token in question_token_list:
            if question.find_one({'question_token':question_token}) == None:
                questions = get_data_from_zhihu_api(zhihu_api_questions,question_token)
                question.insert_one({'_id':question_token,'question_token':question_token,'questions':questions})
                if question_answer.find_one({'question_token':question_token}) == None:
                    answers = get_data_from_zhihu_api(zhihu_api_questions_answers,question_token)
                    question_answer.insert_one({'_id':question_token,'question_token':question_token,'answers':answers})
                    answer_token_list = get_answer_token(answers)
                    for answer_token in answer_token_list:
                        if answer_comment.find_one({'answer_token':answer_token}) == None:
                            answer_comments = get_data_from_zhihu_api(zhihu_api_answers_comments,answer_token)
                            answer_comment.insert_one({'_id':answer_token,'answer_token':answer_token,'answers':answer_comments})
    else:
        return 'topic exist'

In [32]:
get_topic_hot(20023491)


<!DOCTYPE html>
<html lang="zh-CN" dropEffect="none" class="no-js no-auth topic-pages">
<head>
<meta charset="utf-8" />

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta http-equiv="X-ZA-Response-Id" content="1a22f75db74440ea">
<meta http-equiv="X-ZA-Experiment" content="default:None,ge2:ge2_1,nweb_sticky_sidebar:sticky,new_more:new,live_store:ls_a2_b2_c1_f2,answer_related_readings:qa_recommend_none,ge20:ge20_1,zcm-lighting:zcm,fav_act:default,home_nweb:default,ge3:ge3_9,wechat_share_modal:wechat_share_modal_hide,create_brand_question:create_brand_question,qa_sticky_sidebar:sticky_sidebar">

<title>微服务架构 - 话题精华 - 知乎</title>

<meta name="apple-itunes-app" content="app-id=432274380" />


<meta name="description" content="SOA和微服务架构的区别?350个最新问答,点击查看更多>>" />

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta http-equiv="mobile-agent" content="format=html5;url=https://www.zhihu.com/topic/20023491/top-answers">
<meta id="znonce" name="znonce" content="f94507c3895b4bd3ac7b35c6b0402a3b">



<link rel="apple-touch-icon" href="https://static.zhihu.com/static/revved/img/ios/touch-icon-152.87c020b9.png" sizes="152x152">
<link rel="apple-touch-icon" href="https://static.zhihu.com/static/revved/img/ios/touch-icon-120.496c913b.png" sizes="120x120">
<link rel="apple-touch-icon" href="https://static.zhihu.com/static/revved/img/ios/touch-icon-76.dcf79352.png" sizes="76x76">
<link rel="apple-touch-icon" href="https://static.zhihu.com/static/revved/img/ios/touch-icon-60.9911cffb.png" sizes="60x60">


<link rel="shortcut icon" href="https://static.zhihu.com/static/favicon.ico" type="image/x-icon">

<link rel="search" type="application/opensearchdescription+xml" href="https://static.zhihu.com/static/search.xml" title="知乎" />
<link rel="stylesheet" href="https://static.zhihu.com/static/revved/-/css/z.ed53f988.css">



<meta name="google-site-verification" content="FTeR0c8arOPKh8c5DYh_9uu98_zJbaWw53J-Sch9MTg" />



<!--[if lt IE 9]>
<script src="https://static.zhihu.com/static/components/respond/dest/respond.min.js"></script>
<link href="https://static.zhihu.com/static/components/respond/cross-domain/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />
<link href="/static/components/respond/cross-domain/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" />
<script src="/static/components/respond/cross-domain/respond.proxy.js"></script>
<![endif]-->
<script src="https://static.zhihu.com/static/revved/-/js/instant.14757a4a.js"></script>

<link rel="canonical" href="https://www.zhihu.com/topic/20023491" />

</head>

<body class="zhi ">




<div role="navigation" class="zu-top" data-za-module="TopNavBar">
<div class="zg-wrap modal-shifting clearfix" id="zh-top-inner">
<a href="/" class="zu-top-link-logo" id="zh-top-link-logo" data-za-c="view_home" data-za-a="visit_home" data-za-l="top_navigation_zhihu_logo">知乎</a>



<ul class="topnav-noauth clearfix">
<li>
<a href="javascript:;" class="js-signup-noauth"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a href="javascript:;" class="js-signin-noauth">登录</a>
</li>
</ul>



<button class="zu-top-add-question" id="zu-top-add-question">提问</button>


<div role="search" id="zh-top-search" class="zu-top-search">
<form method="GET" action="/search" id="zh-top-search-form" class="zu-top-search-form">



<input type="hidden" name="type" value="content">
<label for="q" class="hide-text">知乎搜索</label><input type="text" class="zu-top-search-input" id="q" name="q" autocomplete="off" value="" maxlength="100" placeholder="搜索你感兴趣的内容...">
<button type="submit" class="zu-top-search-button"><span class="hide-text">搜索</span><span class="sprite-global-icon-magnifier-dark"></span></button>
</form>
</div>





</div>
</div>


<div class="zu-global-notify" id="zh-global-message" style="display:none">
<div class="zg-wrap">
<div class="zu-global-nitify-inner">
<a class="zu-global-notify-close" href="javascript:;" title="关闭" name="close">x</a>
<span class="zu-global-notify-icon"></span>
<span class="zu-global-notify-msg"></span>
</div>
</div>
</div>




<div class="zg-wrap zu-main clearfix "  role="main">
<div class="zu-main-content">
<div class="zu-main-content-inner">


<div itemscope itemtype="https://schema.org/CreativeWork/Topic">
<div class="topic-avatar" itemprop="image" itemscope itemtype="http://schema.org/ImageObject">
<div>
<a class="zm-entry-head-avatar-link" href="/topic/20023491" id="zh-avartar-edit-form">
<img alt="微服务架构" src="https://pic3.zhimg.com/d15c93887e729e563d8e9a338c4cbf92_m.png" class="zm-avatar-editor-preview"></a>
<meta itemprop="image" content="https://pic3.zhimg.com/d15c93887e729e563d8e9a338c4cbf92_l.png" />
</div>

</div>
<div class="topic-info">
<div class="topic-name" id="zh-topic-title">
<h1 class="zm-editable-content" data-disabled="1">微服务架构</h1>
<div class="zm-editable-editor-wrap" style="display:none">
<input type="text" class="zm-editable-editor-input zg-form-text-input" style="width:150px" />
<span class="zm-command">
<a href="javascript:;" name="save" class="zg-btn-blue" style="margin:0 15px;">完成</a>
<a href="javascript:;" name="cancel" class="zm-command-cancel">取消</a>
</span>
</div>
</div>
<a href="#" class="meta-item share-button zg-right" name="share"><i class="z-icon-share"></i>分享</a>


<div class="zm-topic-topbar">
<div class="zm-topic-topbar-nav clearfix">


<ul class="zm-topic-topbar-nav-list zg-left clearfix">






<li class="zm-topic-topbar-nav-list-item">
<a class="zg-link-litblue-normal" href="/topic/20023491/hot">动态</a>
</li>





<li class="zm-topic-topbar-nav-list-item current">
<span>精华</span>
</li>





<li class="zm-topic-topbar-nav-list-item">
<a class="zg-link-litblue-normal" href="/topic/20023491/unanswered">等待回答</a>
</li>




</ul>

</div>

</div>
</div>
<div class="zm-topic-list-container" itemprop="hasPart" itemscope itemtype="http://schema.org/ItemList/QuestionList">
<div class="zu-top-feed-list" id="zh-topic-top-page-list">
<meta itemprop="questionCount" content="66" />
<meta itemprop="topAnswerCount" content="15" />
<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="1" data-type="Answer">
<link itemprop="url" href="/question/37808426/answer/93335393">
<meta itemprop="answer-id" content="32774323" />
<meta itemprop="answer-url-token" content="93335393" />
<meta itemprop="answerCount" content="12" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/37808426" target="_blank" data-id="7330673" data-za-element-name="Title">
SOA和微服务架构的区别?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/37808426/answer/93335393">
<!-- <meta itemprop="answer-id" content="32774323">
<meta itemprop="answer-url-token" content="93335393"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>284</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">284</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">
<span class="name">知乎用户</span></span><span title="大型电信行业SOA实施经验,SOA规划咨询,SOA实施,SOA管控治理,SOA新技术研究" class="bio">
大型电信行业SOA实施经验,SOA规划咨询,…
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="284" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">284</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="7330673" data-action="/answer/content" data-author-name="何明璐" data-entry-url="/question/37808426/answer/93335393">

<textarea hidden class="content">谢多人邀请,其实前面几位的回答已经差不多了,在这里仅谈下自己的简单总结。&lt;br&gt;&lt;br&gt;微服务架构强调的第一个重点就是&lt;b&gt;业务系统需要彻底的组件化和服务化&lt;/b&gt;,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用。这些小应用之间通过服务完成交互和集成。每个小应用从前端web ui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套。在这里我们不用组件而用小应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴露的服务,同时自身也将自身的能力朝外部发布为服务。&lt;br&gt;&lt;br&gt;&lt;b&gt;如果一句话来谈SOA和微服务的区别,即微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时SOA的思想进入到单个业务系统内部实现真正的组件化。&lt;/b&gt;&lt;br&gt;&lt;br&gt;把这个核心搞清楚后,再来看下网上找到的对微服务架构的一些定义和阐述:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;微服务&lt;b&gt;可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”&lt;/b&gt;。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程。&lt;br&gt;&lt;br&gt;微服务不需要像普通服务那样成为一种独立的功能或者独立的资源。定义中称,微服务是需要与业务能力相匹配,这种说法完全正确。不幸的是,仍然意味着,如果能力模型粒度的设计是错误的,那么,我们就必须付出很多代价。如果你阅读了Fowler的整篇文章,你会发现,其中的指导建议是非常实用的。在决定将所有组件组合到一起时,开发人员需要非常确信这些组件都会有所改变,并且规模也会发生变化。服务粒度越粗,就越难以符合规定原则。服务粒度越细,就越能够灵活地降低变化和负载所带来的影响。然而,利弊之间的权衡过程是非常复杂的,我们要在配置和资金模型的基础上考虑到基础设施的成本问题。&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;再强调下即:&lt;br&gt;&lt;br&gt;&lt;b&gt;首先对于应用本身暴露出来的服务,是和应用一起部署的,即服务本身并不单独部署,服务本身就是业务组件已有的接口能力发布和暴露出来的&lt;/b&gt;。了解到这点我们就看到一个关键,即我们在进行单个应用组件设计的时候,本身在组件内部就会有很大接口的设计和定义,那么这些接口我们可以根据和外部其它组件协同的需要将其发布为微服务,而如果不需要对外协同我们完全可以走内部API接口访问模式提高效率。&lt;br&gt;&lt;br&gt;&lt;b&gt;其次,微服务架构本身来源于互联网的思路,因此组件对外发布的服务强调了采用HTTP Rest API的方式来进行&lt;/b&gt;。这个也可以看到在互联网开放能力服务平台基本都采用了Http API的方式进行服务的发布和管理。从这个角度来说,组件超外部暴露的能力才需要发布为微服务,其本身也是一种封装后的粗粒度服务。而不是将组件内部的所有业务规则和逻辑,组件本身的底层数据库CRUD操作全部朝外部发布。否则将极大的增加服务的梳理而难以进行整体服务管控和治理。&lt;br&gt;&lt;br&gt;&lt;b&gt;微服务的基本思想在于考虑围绕着业务领域组件来创建应用,这些就应用可独立地进行开发、管理和加速。在分散的组件中使用微服务云架构和平台使部署、管理和服务功能交付变得更加简单。&lt;/b&gt;&lt;br&gt;&lt;br&gt;对于互联网谈到微服务架构一定会谈到Devops即开发测试和部署运维的一体化。当我们的单体应用以及拆分为多个小应用后,虽然整体架构可以松耦合和可扩展,但是如果拆分的组件越多,这些组件之间本身的集成和部署运维就越复杂。即任何一个组件,当他依赖的外部其它应用组件越多的时候,整个集成,部署和联调测试的过程就越复杂。这些如果完全靠我们手工去完成一是增加工作量,一是增加出错概率。&lt;br&gt;&lt;br&gt;原来谈组件化开发谈的最多的是单个组件的持续集成,包括配置环境集成,自动打包部署,自动化的冒烟测试等。对于微服务架构下首先仍然是要做好单个组件本身的持续集成,其次在这个基础上增加了多个组件的打包部署和组件间的集成。里面的核心思想就是Devops的思路,希望能够实现开发设计到部署运维的一体化。&lt;br&gt;&lt;br&gt;由于微服务架构里面强调了单个组件本身是可以在独立的进程里面运行,各个组件之间在部署的时候就能够做到进程级别的隔离。那么一台服务器我们可能需要初始化几十个甚至更多的进程来进行应用组件的部署。为了保持进程的隔离性,我们可以用虚拟机,但是当几十个进程都完全用独立的虚拟机就不现实的,而这个问题的解决刚好就是利用PaaS平台里面的轻量Docker容器来做这个事情,每个Docker是独立的容器刚好又完全做到进程级别的隔离,资源占用率又最小,这些特点刚好满足微服务架构的开发测试和自动化部署。&lt;br&gt;&lt;br&gt;前面这些问题思考清楚后就是考虑所有暴露的微服务是否需要一个统一的服务管控和治理平台,按照当前微服务架构的整体思路,虽然单个服务的实现和发布仍然是在组件内部完成的,但是这些组件暴露的服务本身的调用情况,服务本身的安全,日志和流量控制等&lt;b&gt;仍然需要一个统一的SOA服务管理平台来完成。&lt;/b&gt;&lt;br&gt;&lt;br&gt;由于微服务尽量都是通过HTTP API的方式暴露出去的,因此这种服务管理平台不需要像传统企业内部的ESB服务总线这么重。&lt;b&gt;但是最基本的服务注册,服务代理,服务发布,服务简单的路由,安全访问和授权,服务调用消息和日志记录这些功能还是需要具备&lt;/b&gt;。类似淘宝的Dubbo架构,即可以做为微服务架构下的服务管控平台。&lt;br&gt;&lt;br&gt;对于这种服务管控平台,核心需要讨论的就是服务每次调用本身的消息传递,输入和输出日志是否需要记录,当前就有两种做法,一种是不记录,管理平台只负责服务注册和目录发布,安全授权,实际的服务访问仍然是两个组件之间的点对点连接完成,这种方式下整个架构下获取更高的性能,同时服务管理平台也不容易成为大并发服务访问下的单点瓶颈;另外一种方式就是完全记录,在这种方式下就需要考虑服务管理平台本身的集群化不是,高并发下的性能问题。而个人建议最好的方式还是SOA服务管理平台应该提供两种管理能力,同时仅仅对核心的需要Log日志的服务进行日志记录,而其它服务只提供服务目录和访问控制即可。&lt;br&gt;&lt;br&gt;===========2016.6.8日更新,增加Chris Richardson微服务系列读书笔记&lt;br&gt;&lt;br&gt;本文为阅读《Chris Richardson 微服务系列》的阅读笔记,具体原文参考:&lt;a href=&quot;//link.zhihu.com/?target=http%3A//blog.daocloud.io/microservices-4/&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;「Chris Richardson 微服务系列」服务发现的可行方案以及实践案例&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt; 
, 里面有另外四篇的链接,当前daocloud已经更新到第5篇事件驱动架构。&lt;br&gt;&lt;br&gt;&lt;b&gt;第一篇 微服务架构的优势和不足&lt;/b&gt;&lt;br&gt;&lt;br&gt;
文中强调的单体应用的场景,我在前面很多谈组件化和服务化的文章里面已经都谈到过了,即一个应用系统里面的模块没有办法做到彻底解耦,如果要实现按组件单独部署是不可能的,相互之间仍然有大量内部不可见依赖而导致了模块间无法拆分。&lt;br&gt;&lt;br&gt;
那么单体应用本身带来的问题主要有哪些?&lt;br&gt;&lt;br&gt;&lt;b&gt;1.系统复杂:&lt;/b&gt;内部多个模块紧耦合,关联依赖复杂,牵一发而动全身。&lt;br&gt;&lt;b&gt;2.运维困难:&lt;/b&gt;变更或升级的影响分析困难,任何一个小修改都可能导致单体应用整体运行出现故障。&lt;br&gt;&lt;b&gt;3.无法扩展:&lt;/b&gt;无法拆分部署,出现性能瓶颈后往往只能够增加服务器或增加集群节点,但是DB问题难解决&lt;br&gt;&lt;br&gt;
正是由于这些原因需要考虑引入微服务架构(实质仍然是单个应用本身的组件化和服务化),对于微服务文章里面有一个详细说明如下:&lt;b&gt;一个微服务一般完成某个特定的功能,比如订单管理、客户管理等。每个微服务都是一个微型应用,有着自己六边形架构,包括商业逻辑和各种接口。有的微服务通过暴露
API 被别的微服务或者应用客户端所用;有的微服务则通过网页 UI 实现。在运行时,每个实例通常是一个云虚拟机或者 Docker
容器。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
从这个定义和说明仍然需要做一些关键理解,即在我前面谈微服务的文章里面谈到过的,即核心的几点包括了,&lt;b&gt;其一足够构成一个独立小应用(从DB到UI),其二微服务应用之间只能通过Service
API进行交互,其三一般运行在云虚拟机或更轻的Docker容器上。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
API
Gateway,这实际上微服务架构里面的很重要的内容,其作用类似于传统企业内部的ESB服务总线,只是更加轻量和高性能来解决微服务的管控和治理问题。&lt;b&gt;而对于负载均衡,缓存,路由,访问控制,服务代理,监控,日志等都属于基本的服务管控内容&lt;/b&gt;,也是API
Gateway需要考虑的核心能力。&lt;br&gt;&lt;br&gt;
Scale Cube的3D模型,描述的相当好,即通过微服务架构实施后扩展性的变化。&lt;br&gt;&lt;br&gt;&lt;b&gt;1. Y轴:&lt;/b&gt;本质是应用的分解,即将传统的单体应用分解为多个微服务应用。&lt;br&gt;&lt;b&gt;2. X轴:&lt;/b&gt;水平弹性扩展能力,即通过负载均衡来实现水平弹性扩展,但是DB问题无法解决,引入3&lt;br&gt;&lt;b&gt;3. Z轴:&lt;/b&gt;当单个微服务应用引入了DB弹性扩展能力要解决的时候,我们引入了对数据库进行拆分和DaaS&lt;br&gt;&lt;br&gt;
对于微服务架构的好处前面在讲单体应用的问题的时候已经谈到了,微服务架构正好是解决这些问题。而对于微服务架构的不足,简单总结如下:&lt;br&gt;&lt;br&gt;&lt;b&gt;1. CAP原则:&lt;/b&gt;由于服务无状态和引入了分布式,较难解决事务一致性问题。&lt;br&gt;&lt;b&gt;2. 集成复杂:&lt;/b&gt;任何彻底的分解都将带来集成的复杂度,即模块在集成时候需要外部微服务模块更多的配合。&lt;br&gt;&lt;b&gt;3. 部署问题:&lt;/b&gt;稍大项目都涉及到上100个服务节点部署,还涉及到部署后的配置,扩展和监控问题。&lt;br&gt;&lt;br&gt;&lt;b&gt;第二篇 使用API网关构建微服务&lt;/b&gt;&lt;br&gt;&lt;br&gt;
首先说下这篇文章的引入场景,以一个亚马逊购物网站的手机APP订单查看界面来举例,如果是一个单体应用,那么所有的界面需要获取信息都通过单体应用统一一个地址提供的多个Service
API获取。但是转变为微服务架构后可以看到对于会员管理,商品管理,订单管理,财务结算管理等都已经拆分为了不同的微服务模块,需要从不同的服务提供地址调用不同的微服务模块提供的Service
API来返回数据。&lt;br&gt;&lt;br&gt;
在原文里面我们看到对于客户端和微服务模块间点对点直接通讯提了三个问题,如下:&lt;br&gt;&lt;br&gt;&lt;b&gt;1. 问题一:&lt;/b&gt;客户端需求和每个微服务暴露的细粒度 API 不匹配&lt;br&gt;&lt;b&gt;2. 问题二:&lt;/b&gt;部分服务使用的协议对 web 并不友好,如二进制RPC或AMQP消息等。&lt;br&gt;&lt;b&gt;3. 问题三:&lt;/b&gt;会使得微服务难以重构,如服务拆分或服务组合的场景。&lt;br&gt;&lt;br&gt;
那么我们从传统的ESB能力来对上面三个问题进行一个说明,第一个问题即可能涉及到细粒度的API组合,类似组合服务无法做;其二是可能存在协议转换的问
题要解决;其三即服务透明的问题,即需要对客户端提供一个统一的服务目录以使底层服务透明。由于以上问题,引入了API服务网关的概念,再次强调,&lt;b&gt;对于API服务网关即使微服务架构里面的轻量服务总线,解决服务管控和治理相关问题。&lt;/b&gt;文中对API
Gateway给出如下说明:&lt;br&gt;&lt;br&gt;
API 网关是一个服务器,也可以说是进入系统的唯一节点。这与面向对象设计模式中的 Facade 模式很像。API
网关封装内部系统的架构,并且提供 API
给各个客户端。它还可能还具备授权、监控、负载均衡、缓存、请求分片和管理、静态响应处理等功能。&lt;br&gt;&lt;br&gt;
API 网关负责服务请求路由、组合及协议转换。客户端的所有请求都首先经过 API 网关,然后由它将请求路由到合适的微服务。API
网关经常会通过调用多个微服务并合并结果来处理一个请求。它可以在 web 协议(如 HTTP 与 WebSocket)与内部使用的非
web 友好协议之间转换。&lt;br&gt;&lt;br&gt;
API 网关还能为每个客户端提供一个定制的 API。通常,它会向移动客户端暴露一个粗粒度的 API。以产品详情的场景为例,API
网关可以提供一个端点(/productdetails?productid=xxx),使移动客户端可以通过一个请求获取所有的产品详情。API
网关通过调用各个服务(产品信息、推荐、评论等等)并合并结果来处理请求。&lt;br&gt;&lt;br&gt;&lt;b&gt;API网关的优点和缺点&lt;/b&gt;&lt;br&gt;&lt;br&gt;
对于API网关的优点,其实是类似传统ESB企业服务总线的优点,即实现服务透明,同时对于服务运行过程中的日志,安全,路由,缓存等问题进行统一配置和处理,而不需要每个微服务API实现时都去考虑。如开源的Dubbo服务总线即可以看作是一个API网关的实现。&lt;br&gt;&lt;br&gt;
API网关和ESB的一些重要区别点在于API网关更加轻量和高性能,它不需要去考虑太多遗留系统和诸多协议的适配,其次也不需要考虑服务集成过程中的大
量数据转换和映射。同时为了提升服务网关的性能,一般API网关在实现过程中不会去记录详细的数据传输日志,或者类似Dubbo架构数据传输根本就不会通
过API网关。&lt;br&gt;&lt;b&gt;&lt;br&gt;
使用 API 网关的最大优点是,它封装了应用程序的内部结构&lt;/b&gt;。客户端只需要同网关交互,而不必调用特定的服务。API
网关也有一些不足。它增加了一个我们必须开发、部署和维护的高可用组件。还有一个风险是,API 网关变成了开发瓶颈。&lt;br&gt;&lt;br&gt;&lt;b&gt;简单来说,在我们期望的去中心化和全分布式架构中,网关又成了一个中心点或瓶颈点,正是由于这个原因我们在网关设计的时候必须考虑即使API
Gateway宕机也不要影响到服务的调用和运行。&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;API网关的设计和实现&lt;/b&gt;&lt;br&gt;&lt;br&gt;
对于大多数应用程序而言,API 网关的性能和可扩展性都非常重要。因此,&lt;b&gt;将 API 网关构建在一个支持异步、I/O
非阻塞的平台上是合理的。有多种不同的技术可以实现一个可扩展的 API 网关&lt;/b&gt;。在 JVM 上,可以使用一种基于 NIO
的框架,比如 Netty、Vertx、Spring Reactor 或 JBoss Undertow 中的一种。一个非常流行的非
JVM 选项是 Node.js,它是一个基于 Chrome JavaScript 引擎构建的平台。&lt;br&gt;&lt;br&gt;
另一个方法是使用 NGINX Plus。NGINX Plus 提供了一个成熟的、可扩展的、高性能 web
服务器和一个易于部署的、可配置可编程的反向代理。NGINX Plus
可以管理身份验证、访问控制、负载均衡请求、缓存响应,并提供应用程序可感知的健康检查和监控。&lt;br&gt;&lt;br&gt;&lt;b&gt;对于API网关需要实现底层多个细粒度的API组合的场景,文章推荐采用响应式编程模型进行而不是传统的异步回调方法组合代码。其原因除了采用回调方式导致的代码混乱外,还有就是对于API组合本身可能存在并行或先后调用,对于采用回调方式往往很难控制。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
基于微服务的应用程序是一个分布式系统,必须使用一种进程间通信机制。有两种类型的进程间通信机制可供选择。一种是使用异步的、基于消息传递的机制。有些实现使用诸如
JMS 或 AMQP 那样的消息代理,而其它的实现(如 Zeromq)则没有代理,服务间直接通信。另一种进程间通信类型是诸如 HTTP
或 Thrift 那样的同步机制。通常,一个系统会同时使用异步和同步两种类型。它甚至还可能使用同一类型的多种实现。总之,API
网关需要支持多种通信机制。&lt;br&gt;&lt;br&gt;&lt;b&gt;注:如果服务是同步调用可以看到微服务模块之间本身是没有彻底解耦的,即如果A依赖B提供的API,如果B提供的服务不可用将直接影响到A不可用。除非同步服务调用在API网关层或客户端做了相应的缓存。因此为了彻底解耦,在微服务调用上更建议选择异步方式进行。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
对于大多数基于微服务的应用程序而言,实现 API 网关,将其作为系统的唯一入口很有必要。API
网关负责服务请求路由、组合及协议转换。它为每个应用程序客户端提供一个定制的 API。API
网关还可以通过返回缓存数据或默认数据屏蔽后端服务失败。&lt;br&gt;&lt;br&gt;&lt;b&gt;第三篇 微服务架构中的进程间通信&lt;/b&gt;&lt;br&gt;&lt;br&gt;
基于微服务的分布式应用是运行在多台机器上的;一般来说,每个服务实例都是一个进程。因此,如下图所示,服务之间的交互必须通过进程间通信(IPC)来实现。&lt;br&gt;&lt;br&gt;
对于微服务架构的交互模式,文章从两个维度进行了描述,即&lt;br&gt;&lt;br&gt;&lt;b&gt;一对一:&lt;/b&gt;每个客户端请求有一个服务实例来响应。&lt;br&gt;&lt;b&gt;一对多:&lt;/b&gt;每个客户端请求有多个服务实例来响应。&lt;br&gt;&lt;br&gt;&lt;b&gt;同步模式:&lt;/b&gt;客户端请求需要服务端即时响应,甚至可能由于等待而阻塞。&lt;br&gt;&lt;b&gt;异步模式:&lt;/b&gt;客户端请求不会阻塞进程,服务端的响应可以是非即时的。&lt;br&gt;&lt;br&gt;
对于分为这两个维度进行描述意义不太大,对于同步模式往往只能是1对1,而且还需要同步等待容易引起阻塞,而对于异步模块往往采用消息机制来实现,同时配合消息中间件可以进一步实现消息的发布订阅。&lt;b&gt;而对于EDA事件驱动架构要看到其本质也是&lt;a href=&quot;//link.zhihu.com/?target=http%3A//match.sports.sina.com.cn/euro2016/player/9808&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;伊布&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;消息中间件和消息的发布订阅。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
异步消息机制可以做到最大化的解耦,对于数据CUD的场景可以看到是比较容易通过异步消息机制实现的,但是会进一步引入事务一致性问题,即在采用异步消息
机制后往往通过BASE事务最终一致性来解决事务层面的问题。而对于查询功能可以看到是比较难通过异步消息API实现的,在引入这个之前可以看到需要考虑
两方面的问题并解决。&lt;br&gt;&lt;br&gt;
其一是服务网关需要有数据缓存能力,以解决无法从源端获取数据的场景。其二是前端开发框架本身需要支持异步调用和数据装载模式,特别是对于数据查询功能对于用户来讲,在前端的感受仍然需要时同步的。即通过异步方式返回了查询数据后可以动态刷新前端展示界面。&lt;br&gt;&lt;br&gt;&lt;b&gt;服务版本的问题&lt;/b&gt;:这是不可避免要遇到的问题,特别是对于RestAPI调用,由于Json格式本身无Schema返回更加容易忽视了对服务
版本的管理和控制。要知道对于Json数据格式变化仍然会导致RestAPI调用后处理失败。因此服务版本仍然采用大小版本管理机制比较好,对于小版本变
更则直接对原有服务进行覆盖同时对所有受影响的服务消费端进行升级;而对于大版本升级则本质是新增加了一个新服务,而对于旧版本服务逐步迁移和替代。&lt;br&gt;&lt;br&gt;&lt;b&gt;处理局部失败&lt;/b&gt;:文中提到了Netfilix的服务解决方案,对于失败问题的解决要注意常用的仍然是服务超时设置,断路器机制,流量控制,缓存数据或默认值返回等。不论采用哪种失败处理策略,都需要考虑应该尽量减少服务调用失败或超时对最终用户造成的影响。&lt;br&gt;&lt;br&gt;&lt;b&gt;基于请求/响应的同步 IPC&lt;/b&gt;&lt;br&gt;&lt;br&gt;
使用同步的、基于请求/响应的 IPC
机制的时候,客户端向服务端发送请求,服务端处理请求并返回响应。一些客户端会由于等待服务端响应而被阻塞,而另外一些客户端可能使用异步的、基于事件驱动的客户端代码,这些代码可能通过
Future 或者 Rx Observable
封装。然而,与使用消息机制不同,客户端需要响应及时返回。这个模式中有很多可选的协议,&lt;b&gt;但最常见的两个协议是 REST 和
Thrift。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
Thrift 也能够让你选择传输协议,包括原始 TCP 和 HTTP。原始 TCP 比 HTTP 更高效,然而 HTTP
对于防火墙、浏览器和使用者来说更友好。&lt;b&gt;文中对于两种实现方式已经描述的相当详细,可以看到当前互联网OpenAPI平台和微服务架构实现中仍然是大量以采用Rest
API接口为主。&lt;br&gt;&lt;br&gt;
而对于消息格式的选择,可以看到在使用RestAPI接口的时候,更多的是采用了Json消息格式而非XML,对于SOAP
WebService则更多采用了XML消息格式。如果采用Thrift则还可以采用二进制消息格式以提升性能。&lt;br&gt;&lt;br&gt;第四篇 服务发现的可行方案以及实践案例&lt;br&gt;&lt;/b&gt;&lt;br&gt;
首先还是先说场景,看似简单的服务注册和服务目录库管理为何会变复杂,其主要的原因还是在结合了云端PaaS和Docker容器部署后,对于微服务模块部
署完成后提供出来的IP地址是动态在变化的,包括模块在进行动态集群扩展的时候也需要动态接入新的服务提供IP地址。正是由于这个原因引入了服务发现和管
理的困难度。&lt;br&gt;&lt;br&gt;
在文章中提到了两种服务发现模式,即客户端发现模式和服务端发现模式,分开描述如下:&lt;br&gt;&lt;br&gt;&lt;b&gt;服务客户端发现模式&lt;/b&gt;&lt;br&gt;&lt;br&gt;
使用客户端发现模式时,客户端决定相应服务实例的网络位置,并且对请求实现负载均衡。客户端查询服务注册表,后者是一个可用服务实例的数据库;然后使用负
载均衡算法从中选择一个实例,并发出请求。客户端从服务注册服务中查询,其中是所有可用服务实例的库。客户端使用负载均衡算法从多个服务实例中选择出一
个,然后发出请求。&lt;br&gt;&lt;br&gt;
注:这是类似Dubbo实现机制一样的两阶段模式,即任何一个服务的消费都需要分两个步骤进行,&lt;b&gt;第一步首先是访问服务注册库(更多是API
GateWay提供的一个能力)返回一个已经动态均衡后的服务可用地址,第二步即客户端和该地址直接建立连接进行服务消费和访问。&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;在这种模式的实现中有两个重点,其一是动态负载均衡算法,其二是服务网关需要能够对原始服务提供点进行实时的心跳检测以确定服务提供的可用性。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
Netflix OSS 是客户端发现模式的绝佳范例。Netflix Eureka
是一个服务注册表,为服务实例注册管理和查询可用实例提供了 REST API 接口。Netflix Ribbon 是 IPC 客户端,与
Eureka 一起实现对请求的负载均衡。&lt;br&gt;&lt;br&gt;&lt;b&gt;缺点:底层的IP虽然动态提供出去了,但是最终仍然暴露给了服务消费方,再需要进一步做安全和防火墙隔离的场景下显然是不能满足要求的。&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;服务端发现模式&lt;/b&gt;&lt;br&gt;&lt;br&gt;
客户端通过负载均衡器向某个服务提出请求,负载均衡器查询服务注册表,并将请求转发到可用的服务实例。如同客户端发现,服务实例在服务注册表中注册或注销。在原文中有图示,基本看图就清楚了,即在服务注册库前新增加了一个Load
Balancer节点。&lt;b&gt;注:这两个节点感觉是可以合并到API GateWay的能力中去的。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
服务端发现模式兼具优缺点。它最大的优点是客户端无需关注发现的细节,只需要简单地向负载均衡器发送请求,这减少了编程语言框架需要完成的发现逻辑。并且
如上文所述,某些部署环境免费提供这一功能。这种模式也有缺点。除非负载均衡器由部署环境提供,否则会成为一个需要配置和管理的高可用系统组件。&lt;br&gt;&lt;b&gt;&lt;br&gt;
服务注册表&lt;/b&gt;&lt;br&gt;&lt;br&gt;
服务注册表需要高可用而且随时更新。客户端能够缓存从服务注册表中获取的网络地址,然而,这些信息最终会过时,客户端也就无法发现服务实例。因此,服务注册表会包含若干服务端,使用复制协议保持一致性。&lt;br&gt;&lt;br&gt;
首先可以看到服务注册表本身不能是单点,否则存在单点故障,当服务注册表有多台服务器的时候同时需要考虑服务注册库信息在多台机器上的实时同步和一致。我们操作和配置服务注册信息的时候往往只会在一个统一的服务管控端完成。&lt;br&gt;&lt;br&gt;
其次如果服务注册服务器宕机是否一定影响到服务本身的消费和调用,如果考虑更高的整体架构可用性,还可以设计对于服务注册库信息在客户端本地进行缓存,当服务注册表无法访问的时候可以临时读取本地缓存的服务注册库信息并发起服务访问请求。&lt;br&gt;&lt;br&gt;
对于服务注册表,文章提供了三种选择,感觉最常用的实现仍然是基于ZooKeeper进行的。&lt;br&gt;&lt;br&gt;&lt;b&gt;Etcd –&lt;/b&gt; 高可用、分布式、一致性的键值存储,用于共享配置和服务发现。&lt;br&gt;&lt;b&gt;Consul –&lt;/b&gt; 发现和配置的服务,提供 API 实现客户端注册和发现服务。&lt;br&gt;&lt;b&gt;Apache ZooKeeper –&lt;/b&gt; 被分布式应用广泛使用的高性能协调服务。&lt;br&gt;&lt;br&gt;
如前所述,服务实例必须在注册表中注册和注销。注册和注销有两种不同的方法。方法一是服务实例自己注册,也叫&lt;b&gt;自注册模式&lt;/b&gt;(self-registration
pattern);另一种是采用管理服务实例注册的其它系统组件,即&lt;b&gt;第三方注册模式。(原文有详细机制描述,不再累述)&lt;/b&gt;&lt;br&gt;&lt;br&gt;
虽然方法一把服务实例和服务注册表耦合,必须在每个编程语言和框架内实现注册代码。但是在自己实现完整微服务架构中,考虑到PaaS平台下微服务模块的动
态部署和扩展,采用方法1相当来说更加容易实现。但是方法1仍然不能代替服务注册库本身应该具备的服务节点的心跳检测能力。</textarea>


<div class="zh-summary summary clearfix">

谢多人邀请,其实前面几位的回答已经差不多了,在这里仅谈下自己的简单总结。 微服务架构强调的第一个重点就是<b>业务系统需要彻底的组件化和服务化</b>,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用。这些小应用之间通过服务完成交互…

<a href="/question/37808426/answer/93335393" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" data-tooltip="s$t$发布于 2016-04-02" target="_blank" href="/question/37808426/answer/93335393">编辑于 2016-06-08</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-7330673"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>9 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="2">
<meta name="disableCopyAvatar" content="https://pic1.zhimg.com/da8e974dc_m.jpg">

<span class="zg-bull">&bull;</span>


<a href="/copyright/apply?answer=93335393" target="_blank" class="meta-item copyright">申请转载</a>



<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="2" data-type="Answer">
<link itemprop="url" href="/question/50852183/answer/123216390">
<meta itemprop="answer-id" content="44788160" />
<meta itemprop="answer-url-token" content="123216390" />
<meta itemprop="answerCount" content="44" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/50852183" target="_blank" data-id="12557603" data-za-element-name="Title">
如何评价映兔科技 CTO 陈辉的文章《谈谈创业公司的技术选型》?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/50852183/answer/123216390">
<!-- <meta itemprop="answer-id" content="44788160">
<meta itemprop="answer-url-token" content="123216390"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>152</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">152</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$liaoxuefeng"
target="_blank" href="/people/liaoxuefeng"
>廖雪峰</a></span><span title="业余马拉松选手 www.liaoxuefeng.com" class="bio">
业余马拉松选手 <a href="//link.zhihu.com/?target=http%3A//www.liaoxuefeng.com" class=" external" target="_blank" rel="nofollow noreferrer"><span class="invisible">http://www.</span><span class="visible">liaoxuefeng.com</span><span class="invisible"></span><i class="icon-external"></i></a>
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="152" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">152</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="12557603" data-action="/answer/content" data-author-name="廖雪峰" data-entry-url="/question/50852183/answer/123216390">

<textarea hidden class="content">技术选型,要适合业务。&lt;br&gt;&lt;br&gt;绝大部分公司的规模根本达不到Google的百分之一甚至万分之一,照着Google选型就是死路一条&lt;br&gt;&lt;br&gt;选语言,市场前10,剩下的小众语言,自己玩可以,不要轻易上公司业务&lt;br&gt;&lt;br&gt;首选Java,招人容易,用好Spring,轻易不造轮子,绝对稳定支撑业务到C轮&lt;br&gt;&lt;br&gt;创业是为了挣钱,不是秀技术</textarea>


<div class="zh-summary summary clearfix">

技术选型,要适合业务。 绝大部分公司的规模根本达不到Google的百分之一甚至万分之一,照着Google选型就是死路一条 选语言,市场前10,剩下的小众语言,自己玩可以,不要轻易上公司业务 首选Java,招人容易,用好Spring,轻易不造轮子,绝对稳定支撑业务到C…

<a href="/question/50852183/answer/123216390" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/50852183/answer/123216390">发布于 2016-09-22</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-12557603"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>28 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="4" data-type="Answer">
<link itemprop="url" href="/question/37808426/answer/81212783">
<meta itemprop="answer-id" content="27913885" />
<meta itemprop="answer-url-token" content="81212783" />
<meta itemprop="answerCount" content="12" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/37808426" target="_blank" data-id="7330673" data-za-element-name="Title">
SOA和微服务架构的区别?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/37808426/answer/81212783">
<!-- <meta itemprop="answer-id" content="27913885">
<meta itemprop="answer-url-token" content="81212783"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>54</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">54</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$yongxinge"
target="_blank" href="/people/yongxinge"
>用心阁</a></span><span title="软件工程师" class="bio">
软件工程师
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="54" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">54</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="7330673" data-action="/answer/content" data-author-name="用心阁" data-entry-url="/question/37808426/answer/81212783">

<textarea hidden class="content">&lt;b&gt;SOA&lt;/b&gt;&lt;br&gt;SOA的提出是在企业计算领域,就是要将紧耦合的系统,划分为面向业务的,粗粒度,松耦合,无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。&lt;br&gt;&lt;br&gt;基于这些基础的服务,可以将业务过程用类似BPEL流程的方式编排起来,而BPEL反映的是业务处理的过程,这些过程对于业务人员更为直观,调整也比hardcode的代码更容易。&lt;br&gt;&lt;br&gt;当然企业还需要对服务治理,比如服务注册库,监控管理等。&lt;br&gt;&lt;br&gt;我们知道企业计算领域,如果不是交易系统的话,并发量都不是很大的,所以大多数情况下,一台服务器就容纳将许许多多的服务,这些服务采用统一的基础设施,可能都运行在一个应用服务器的进程中。虽然说是面向服务了,但还是单一的系统。&lt;br&gt;&lt;br&gt;&lt;b&gt;微服务&lt;/b&gt;&lt;br&gt;而微服务架构大体是从互联网企业兴起的,由于大规模用户,对分布式系统的要求很高,如果像企业计算那样的系统,伸缩就需要多个容纳续续多多的服务的系统实例,前面通过负载均衡使得多个系统成为一个集群。&lt;br&gt;&lt;br&gt;但这是很不方便的,互联网企业迭代的周期很短,一周可能发布一个版本,甚至可能每天一个版本,而不同的子系统的发布周期是不一样的。&lt;br&gt;&lt;br&gt;而且,不同的子系统也不像原来企业计算那样采用集中式的存储,使用昂贵的Oracle存储整个系统的数据,二是使用MongoDB,HBase,Cassandra等NOSQL数据库和Redis,memcache等分布式缓存。&lt;br&gt;&lt;br&gt;那么就倾向采用以子系统为分割,不同的子系统采用自己的架构,那么各个服务运行自己的Web容器中,当需要增加计算能力的时候,只需要增加这个子系统或服务的实例就好了,当升级的时候,可以不影响别的子系统。这种组织方式大体上就被称作微服务架构。&lt;br&gt;&lt;br&gt;微服务与SOA相比,更强调分布式系统的特性,比如横向伸缩性,服务发现,负载均衡,故障转移,高可用。互联网开发对服务治理提出了更多的要求,比如多版本,比如灰度升级,比如服务降级,比如分布式跟踪,这些都是在SOA实践中重视不够的。&lt;br&gt;&lt;br&gt;Docker容器技术的出现,为微服务提供了更便利的条件,比如更小的部署单元,每个服务可以通过类似Node.js或Spring Boot的技术跑在自己的进程中。可能在几十台计算机中运行成千上万个Docker容器,每个容器都运行着服务的一个实例。随时可以增加某个服务的实例数,或者某个实例崩溃后,在其他的计算机上再创建该服务的新的实例。&lt;br&gt;&lt;br&gt;这就是我对SOA和微服务架构区别的一点理解。</textarea>


<div class="zh-summary summary clearfix">

<b>SOA</b> SOA的提出是在企业计算领域,就是要将紧耦合的系统,划分为面向业务的,粗粒度,松耦合,无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。 基于这些基础的服务,可以将业务过程用类似BPEL流程的方式编排起来,…

<a href="/question/37808426/answer/81212783" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/37808426/answer/81212783">发布于 2016-01-12</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-7330673"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>6 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="5" data-type="Answer">
<link itemprop="url" href="/question/45413135/answer/127169875">
<meta itemprop="answer-id" content="46376249" />
<meta itemprop="answer-url-token" content="127169875" />
<meta itemprop="answerCount" content="15" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/45413135" target="_blank" data-id="10377803" data-za-element-name="Title">
请问哪位大神比较过spring cloud和dubbo,各自的优缺点是什么?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/45413135/answer/127169875">
<!-- <meta itemprop="answer-id" content="46376249">
<meta itemprop="answer-url-token" content="127169875"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>31</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">31</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$jin-ke-wei-50"
target="_blank" href="/people/jin-ke-wei-50"
>金可伟</a></span><span title="互联网" class="bio">
互联网
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="31" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">31</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="10377803" data-action="/answer/content" data-author-name="金可伟" data-entry-url="/question/45413135/answer/127169875">

<textarea hidden class="content">从项目的背景来看,Dubbo 国内用的公司挺多,国内影响力大,Spring Cloud 自然在国外影响力较大,所以这个来看不分伯仲了,毕竟都有大公司在使用。&lt;br&gt;从社区的活跃度来看,可以看下各自的Github托管项目来区分,&lt;a href=&quot;//link.zhihu.com/?target=https%3A//github.com/dubbo&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;Dubbo · GitHub&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt; 与 &lt;a href=&quot;//link.zhihu.com/?target=https%3A//github.com/spring-cloud&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;Spring Cloud · GitHub&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt; ,从更新频率与更新时间来看 Spring Cloud 优于Dubbo,Dubbo基本不维护了。&lt;br&gt;从框架的完整度来看,Dubbo只是实现了服务治理(注册 发现等),而Spring Cloud下面有很多个子项目覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo只是Spring Cloud Netflix中的一个子集。如果选择Spring Cloud,基本上每个环节都已经有了对应的组件支持,可能有些也不一定能满足你所有的需求,但是其活跃的社区与快速的迭代更新也会让你没有后顾之忧。&lt;br&gt;&lt;br&gt;我司正在尝试使用SpringCloud,有兴趣可以进行交流。</textarea>


<div class="zh-summary summary clearfix">

从项目的背景来看,Dubbo 国内用的公司挺多,国内影响力大,Spring Cloud 自然在国外影响力较大,所以这个来看不分伯仲了,毕竟都有大公司在使用。 从社区的活跃度来看,可以看下各自的Github托管项目来区分,<a href="//link.zhihu.com/?target=https%3A//github.com/dubbo" class=" wrap external" target="_blank" rel="nofollow noreferrer">Dubbo · GitHub<i class="icon-external"></i></a> 与 <a href="//link.zhihu.com/?target=https%3A//github.com/spring-cloud" class=" wrap external" target="_blank" rel="nofollow noreferrer">Spring Cloud · GitHub<i class="icon-external"></i></a> ,…

<a href="/question/45413135/answer/127169875" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/45413135/answer/127169875">发布于 2016-10-18</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-10377803"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>7 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="6" data-type="Answer">
<link itemprop="url" href="/question/35980124/answer/68965185">
<meta itemprop="answer-id" content="23005535" />
<meta itemprop="answer-url-token" content="68965185" />
<meta itemprop="answerCount" content="13" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/35980124" target="_blank" data-id="6598979" data-za-element-name="Title">
微服务架构风格可以降低系统的复杂度吗?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/35980124/answer/68965185">
<!-- <meta itemprop="answer-id" content="23005535">
<meta itemprop="answer-url-token" content="68965185"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>26</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">26</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$bingfeng.zhao"
target="_blank" href="/people/bingfeng.zhao"
>赵丙峰</a></span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="26" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">26</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="6598979" data-action="/answer/content" data-author-name="赵丙峰" data-entry-url="/question/35980124/answer/68965185">

<textarea hidden class="content">任何架构风格本身都不能降低业务复杂性。假设一个业务的内稟复杂性为常数的话,不同的实现方案的优劣体现在增加的额外复杂性的多少。糟糕的实现导致太多的额外复杂性,甚至超越业务本身,而优秀的实现则相反。&lt;br&gt;&lt;br&gt;诚如已有的答案所言,控制额外复杂性的关键在于合适地建模以及恰当地封装外部依赖。前者依赖于对业务的深入理解,而后者依赖于对实现环境,工具,以及相关技术的深入掌握。偏废任何一方面都会导致一个蹩脚的方案。&lt;br&gt;&lt;br&gt;架构风格是组织这些信息的指南,目的是使得最终的方案在几万英尺的高度有一致的表达。对于一个优秀的方案,细节上和结构上很相似,这是复杂系统自相似的一个典型的例子。&lt;br&gt;&lt;br&gt;题主说每个public服务都是一个服务,让我想起一个资深工程师说良好设计的极端就是一行语句就是一个接口。话虽没错,但是场景不对就相当于胡说了。</textarea>


<div class="zh-summary summary clearfix">

任何架构风格本身都不能降低业务复杂性。假设一个业务的内稟复杂性为常数的话,不同的实现方案的优劣体现在增加的额外复杂性的多少。糟糕的实现导致太多的额外复杂性,甚至超越业务本身,而优秀的实现则相反。 诚如已有的答案所言,控制额外复杂性的关键在…

<a href="/question/35980124/answer/68965185" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/35980124/answer/68965185">发布于 2015-10-23</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-6598979"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>3 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="8" data-type="Answer">
<link itemprop="url" href="/question/51436292/answer/126128311">
<meta itemprop="answer-id" content="45957506" />
<meta itemprop="answer-url-token" content="126128311" />
<meta itemprop="answerCount" content="7" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/51436292" target="_blank" data-id="12792191" data-za-element-name="Title">
分布式服务治理的设计问题?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/51436292/answer/126128311">
<!-- <meta itemprop="answer-id" content="45957506">
<meta itemprop="answer-url-token" content="126128311"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>23</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">23</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$lfyzjck"
target="_blank" href="/people/lfyzjck"
>lfyzjck</a></span><span title="程序员,推理小说爱好者,喜欢一点点心理学,小提琴锯木中" class="bio">
程序员,推理小说爱好者,喜欢一点点心理…
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="23" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">23</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="12792191" data-action="/answer/content" data-author-name="lfyzjck" data-entry-url="/question/51436292/answer/126128311">

<textarea hidden class="content">负载均衡有2种做法:&lt;br&gt;&lt;br&gt;客户端负载均衡,典型的是 Finagle 和 Dubbo。好处是实现出来简单,服务直接直连性能好。坏处是多语言的时候需要为每种语言实现一个客户端。&lt;br&gt;&lt;br&gt;服务端的负载均衡,典型的负载均衡器是 Nginx 和 HAProxy 。通常是在服务前面加一个反向代理。客户端通过反向代理和服务端通信,具体的负载均衡逻辑由负载均衡器实现。负载均衡器本身也可以注册到注册中心。好处是客户端非常简单,多语言也好支持。坏处嘛就是有点性能损失。&lt;br&gt;&lt;br&gt;具体怎么选要看业务,也要看公司的技术选型。多语言的场景下服务端的方案会省去很多维护成本,当然如果有一个 team 来维护客户端的话当我没说,毕竟 team 需要有事干么。&lt;br&gt;&lt;br&gt;纯 Java 场景,已经用了 Dubbo 或者类似的框架,框架已经提供了支持就别折腾了。&lt;br&gt;&lt;br&gt;回到题主的场景,如果非要在 php 服务里实现服务发现,可以把服务注册表缓存起来,比如放到 memcache 里,每隔一段时间可以重新拉一次。&lt;br&gt;&lt;br&gt;以上</textarea>


<div class="zh-summary summary clearfix">

负载均衡有2种做法: 客户端负载均衡,典型的是 Finagle 和 Dubbo。好处是实现出来简单,服务直接直连性能好。坏处是多语言的时候需要为每种语言实现一个客户端。 服务端的负载均衡,典型的负载均衡器是 Nginx 和 HAProxy 。通常是在服务前面加一个反向代理…

<a href="/question/51436292/answer/126128311" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/51436292/answer/126128311">发布于 2016-10-12</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-12792191"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>6 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="9" data-type="Answer">
<link itemprop="url" href="/question/61085805/answer/184042205">
<meta itemprop="answer-id" content="63533895" />
<meta itemprop="answer-url-token" content="184042205" />
<meta itemprop="answerCount" content="7" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/61085805" target="_blank" data-id="16658349" data-za-element-name="Title">
2017年,后端出现了什么新的思想和技术?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/61085805/answer/184042205">
<!-- <meta itemprop="answer-id" content="63533895">
<meta itemprop="answer-url-token" content="184042205"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>18</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">18</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">
<span class="name">知乎用户</span></span><span title="春暖花开,知乎有你,滴-" class="bio">
春暖花开,知乎有你,滴-
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="18" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">18</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="16658349" data-action="/answer/content" data-author-name="萝魏紫" data-entry-url="/question/61085805/answer/184042205">

<textarea hidden class="content">&lt;p&gt;知乎基本上没有后端的讨论,我来消灭0回复,挽尊。&lt;/p&gt;&lt;br&gt;&lt;p&gt;不限制在2017年,就说最近的。大型商用纷纷转向的大概这几个方面,和那些媒体告诉你的不太一样。&lt;/p&gt;&lt;p&gt;一个是微服务,这个能增加系统稳定性,现在微服务的支撑技术已经成熟,轮到发展微服务的理论了,微服务其实是个里程碑式的概念,做好了,商用软件能进入下一个纪元。这是个框,什么都能装。SaaS也好,分布式也好,online/offline也好,基本上能想到的都可以转。&lt;/p&gt;&lt;p&gt;一个是Devops,这个其实和云一样是老生常谈,过去云叫网格,过去devops叫SE,这个能增加开发质量降低成本。&lt;/p&gt;&lt;p&gt;容器技术,这个我还不太看好,主要是最近docker脑抽突然想赚钱了,可能还要发展几年才会变成主要商用技术,自己玩玩没什么问题。&lt;/p&gt;&lt;p&gt;有些技术存在很多年了,但是目前持续演进中,比如集群技术,这个其实哪个大型企业都逃不开,关系型数据库很多年了,这几年也有长足的发展。&lt;/p&gt;&lt;p&gt;还有些想到了再补充。&lt;/p&gt;</textarea>


<div class="zh-summary summary clearfix">

知乎基本上没有后端的讨论,我来消灭0回复,挽尊。 不限制在2017年,就说最近的。大型商用纷纷转向的大概这几个方面,和那些媒体告诉你的不太一样。一个是微服务,这个能增加系统稳定性,现在微服务的支撑技术已经成熟,轮到发展微服务的理论了,微服务其实…

<a href="/question/61085805/answer/184042205" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/61085805/answer/184042205">发布于 10:40</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-16658349"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>10 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="10" data-type="Answer">
<link itemprop="url" href="/question/42812221/answer/94801279">
<meta itemprop="answer-id" content="33362407" />
<meta itemprop="answer-url-token" content="94801279" />
<meta itemprop="answerCount" content="10" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/42812221" target="_blank" data-id="9333410" data-za-element-name="Title">
现在国内docker发展情况如何?有没有代表性的公司?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/42812221/answer/94801279">
<!-- <meta itemprop="answer-id" content="33362407">
<meta itemprop="answer-url-token" content="94801279"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>17</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">17</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$shevyan"
target="_blank" href="/people/shevyan"
>ShevYan</a></span><span title="@Ghostcloud" class="bio">
@Ghostcloud
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="17" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">17</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="9333410" data-action="/answer/content" data-author-name="ShevYan" data-entry-url="/question/42812221/answer/94801279">

<textarea hidden class="content">目前国内一线互联网公司基本都已经在使用docker了,跟他们比较重视新技术有关,少数比较激进的公司已经将关键业务迁至docker。但是对于大多数中小企业来说,都还处于探索和学习阶段,不排除一部分已经能比较好的使用,但是整个比例非常的低。我觉得这个其实是需要一个过程的,从物理机到虚拟化,从虚拟化到容器化,从私有云到公有云,首先需要转变的都是人的思想。国内精灵云,数人云,好雨云,时速云,灵雀云,道客云等创业公司都是这个领域的,不过各自所专注的领域都不完全一样。docker在国外差不多有190多家公司在不同的领域,国内专做docker的公司2015年有5家左右,今年肯定会更多。</textarea>


<div class="zh-summary summary clearfix">

目前国内一线互联网公司基本都已经在使用docker了,跟他们比较重视新技术有关,少数比较激进的公司已经将关键业务迁至docker。但是对于大多数中小企业来说,都还处于探索和学习阶段,不排除一部分已经能比较好的使用,但是整个比例非常的低。我觉得这个其实…

<a href="/question/42812221/answer/94801279" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/42812221/answer/94801279">发布于 2016-04-11</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-9333410"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>3 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="11" data-type="Answer">
<link itemprop="url" href="/question/54692776/answer/142094830">
<meta itemprop="answer-id" content="52367078" />
<meta itemprop="answer-url-token" content="142094830" />
<meta itemprop="answerCount" content="3" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/54692776" target="_blank" data-id="14097182" data-za-element-name="Title">
REST API 在 2017 年是不是已经过时了?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/54692776/answer/142094830">
<!-- <meta itemprop="answer-id" content="52367078">
<meta itemprop="answer-url-token" content="142094830"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>16</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">16</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$li-yao-68-26"
target="_blank" href="/people/li-yao-68-26"
>八个男人</a></span><span title="不愿透露姓名" class="bio">
不愿透露姓名
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="16" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">16</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="14097182" data-action="/answer/content" data-author-name="八个男人" data-entry-url="/question/54692776/answer/142094830">

<textarea hidden class="content">什么?我记得2016年还很流行,刚过完年就low了?&lt;br&gt;感觉it圈比时尚圈,娱乐圈变化还快</textarea>


<div class="zh-summary summary clearfix">

什么?我记得2016年还很流行,刚过完年就low了? 感觉it圈比时尚圈,娱乐圈变化还快

<a href="/question/54692776/answer/142094830" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/54692776/answer/142094830">发布于 2017-01-21</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-14097182"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>2 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="12" data-type="Answer">
<link itemprop="url" href="/question/45413135/answer/118591724">
<meta itemprop="answer-id" content="42923430" />
<meta itemprop="answer-url-token" content="118591724" />
<meta itemprop="answerCount" content="15" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/45413135" target="_blank" data-id="10377803" data-za-element-name="Title">
请问哪位大神比较过spring cloud和dubbo,各自的优缺点是什么?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/45413135/answer/118591724">
<!-- <meta itemprop="answer-id" content="42923430">
<meta itemprop="answer-url-token" content="118591724"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>12</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">12</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$zhanglubing"
target="_blank" href="/people/zhanglubing"
>张露兵</a></span><span title="Java高级工程师" class="bio">
Java高级工程师
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="12" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">12</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="10377803" data-action="/answer/content" data-author-name="张露兵" data-entry-url="/question/45413135/answer/118591724">

<textarea hidden class="content">引用之前看到的一篇文章:&lt;br&gt;&lt;a href=&quot;//link.zhihu.com/?target=http%3A//blog.didispace.com/microservice-framework/&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;微服务架构的基础框架选择:Spring Cloud还是Dubbo【程序猿DD】&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;br&gt;文章对这两个框架进行了对比和分析,&lt;br&gt;希望对你有所帮助。</textarea>


<div class="zh-summary summary clearfix">

引用之前看到的一篇文章: <a href="//link.zhihu.com/?target=http%3A//blog.didispace.com/microservice-framework/" class=" wrap external" target="_blank" rel="nofollow noreferrer">微服务架构的基础框架选择:Spring Cloud还是Dubbo【程序猿DD】<i class="icon-external"></i></a> 文章对这两个框架进行了对比和分析, 希望对你有所帮助。

<a href="/question/45413135/answer/118591724" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/45413135/answer/118591724">发布于 2016-08-24</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-10377803"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>1 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="13" data-type="Answer">
<link itemprop="url" href="/question/36501858/answer/104885769">
<meta itemprop="answer-id" content="37413608" />
<meta itemprop="answer-url-token" content="104885769" />
<meta itemprop="answerCount" content="9" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/36501858" target="_blank" data-id="6807853" data-za-element-name="Title">
使用 Docker 构建微服务架构,服务与服务之间的通信有什么最佳实践?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/36501858/answer/104885769">
<!-- <meta itemprop="answer-id" content="37413608">
<meta itemprop="answer-url-token" content="104885769"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>7</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">7</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">
<span class="name">知乎用户</span></span><span title="行走在路上" class="bio">
行走在路上
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="7" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">7</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="6807853" data-action="/answer/content" data-author-name="何明璐" data-entry-url="/question/36501858/answer/104885769">

<textarea hidden class="content">参考这篇文章:&lt;br&gt;&lt;br&gt;&lt;a href=&quot;//link.zhihu.com/?target=http%3A//blog.daocloud.io/microservices-3/&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;「Chris Richardson 微服务系列」微服务架构中的进程间通信&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;具体阅读笔记如下:&lt;br&gt;&lt;br&gt;基于微服务的分布式应用是运行在多台机器上的;一般来说,每个服务实例都是一个进程。因此,如下图所示,服务之间的交互必须通过进程间通信(IPC)来实现。&lt;br&gt;&lt;br&gt;
对于微服务架构的交互模式,文章从两个维度进行了描述,即&lt;br&gt;&lt;br&gt;&lt;b&gt;一对一:&lt;/b&gt;每个客户端请求有一个服务实例来响应。&lt;br&gt;&lt;b&gt;一对多:&lt;/b&gt;每个客户端请求有多个服务实例来响应。&lt;br&gt;&lt;br&gt;&lt;b&gt;同步模式:&lt;/b&gt;客户端请求需要服务端即时响应,甚至可能由于等待而阻塞。&lt;br&gt;&lt;b&gt;异步模式:&lt;/b&gt;客户端请求不会阻塞进程,服务端的响应可以是非即时的。&lt;br&gt;&lt;br&gt;
对于分为这两个维度进行描述意义不太大,对于同步模式往往只能是1对1,而且还需要同步等待容易引起阻塞,而对于异步模块往往采用消息机制来实现,同时配合消息中间件可以进一步实现消息的发布订阅。&lt;b&gt;而对于EDA事件驱动架构要看到其本质也是&lt;a href=&quot;//link.zhihu.com/?target=http%3A//match.sports.sina.com.cn/euro2016/player/9808&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;伊布&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;消息中间件和消息的发布订阅。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
异步消息机制可以做到最大化的解耦,对于数据CUD的场景可以看到是比较容易通过异步消息机制实现的,但是会进一步引入事务一致性问题,即在采用异步消息
机制后往往通过BASE事务最终一致性来解决事务层面的问题。而对于查询功能可以看到是比较难通过异步消息API实现的,在引入这个之前可以看到需要考虑
两方面的问题并解决。&lt;br&gt;&lt;br&gt;
其一是服务网关需要有数据缓存能力,以解决无法从源端获取数据的场景。其二是前端开发框架本身需要支持异步调用和数据装载模式,特别是对于数据查询功能对于用户来讲,在前端的感受仍然需要时同步的。即通过异步方式返回了查询数据后可以动态刷新前端展示界面。&lt;br&gt;&lt;br&gt;&lt;b&gt;服务版本的问题&lt;/b&gt;:这是不可避免要遇到的问题,特别是对于RestAPI调用,由于Json格式本身无Schema返回更加容易忽视了对服务
版本的管理和控制。要知道对于Json数据格式变化仍然会导致RestAPI调用后处理失败。因此服务版本仍然采用大小版本管理机制比较好,对于小版本变
更则直接对原有服务进行覆盖同时对所有受影响的服务消费端进行升级;而对于大版本升级则本质是新增加了一个新服务,而对于旧版本服务逐步迁移和替代。&lt;br&gt;&lt;br&gt;&lt;b&gt;处理局部失败&lt;/b&gt;:文中提到了Netfilix的服务解决方案,对于失败问题的解决要注意常用的仍然是服务超时设置,断路器机制,流量控制,缓存数据或默认值返回等。不论采用哪种失败处理策略,都需要考虑应该尽量减少服务调用失败或超时对最终用户造成的影响。&lt;br&gt;&lt;br&gt;&lt;b&gt;基于请求/响应的同步 IPC&lt;/b&gt;&lt;br&gt;&lt;br&gt;
使用同步的、基于请求/响应的 IPC
机制的时候,客户端向服务端发送请求,服务端处理请求并返回响应。一些客户端会由于等待服务端响应而被阻塞,而另外一些客户端可能使用异步的、基于事件驱动的客户端代码,这些代码可能通过
Future 或者 Rx Observable
封装。然而,与使用消息机制不同,客户端需要响应及时返回。这个模式中有很多可选的协议,&lt;b&gt;但最常见的两个协议是 REST 和
Thrift。&lt;/b&gt;&lt;br&gt;&lt;br&gt;
Thrift 也能够让你选择传输协议,包括原始 TCP 和 HTTP。原始 TCP 比 HTTP 更高效,然而 HTTP
对于防火墙、浏览器和使用者来说更友好。&lt;b&gt;文中对于两种实现方式已经描述的相当详细,可以看到当前互联网OpenAPI平台和微服务架构实现中仍然是大量以采用Rest
API接口为主。&lt;br&gt;&lt;br&gt;
而对于消息格式的选择,可以看到在使用RestAPI接口的时候,更多的是采用了Json消息格式而非XML,对于SOAP
WebService则更多采用了XML消息格式。如果采用Thrift则还可以采用二进制消息格式以提升性能。&lt;/b&gt;</textarea>


<div class="zh-summary summary clearfix">

参考这篇文章: <a href="//link.zhihu.com/?target=http%3A//blog.daocloud.io/microservices-3/" class=" wrap external" target="_blank" rel="nofollow noreferrer">「Chris Richardson 微服务系列」微服务架构中的进程间通信<i class="icon-external"></i></a> 具体阅读笔记如下: 基于微服务的分布式应用是运行在多台机器上的;一般来说,每个服务实例都是一个进程。因此,如下图所示,服务之间的交互必须通过进程间通信(IPC)来实现。 
…

<a href="/question/36501858/answer/104885769" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/36501858/answer/104885769">发布于 2016-06-08</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-6807853"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>添加评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="2">
<meta name="disableCopyAvatar" content="https://pic1.zhimg.com/da8e974dc_m.jpg">

<span class="zg-bull">&bull;</span>


<a href="/copyright/apply?answer=104885769" target="_blank" class="meta-item copyright">申请转载</a>



<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="14" data-type="Answer">
<link itemprop="url" href="/question/45413135/answer/103314477">
<meta itemprop="answer-id" content="36782425" />
<meta itemprop="answer-url-token" content="103314477" />
<meta itemprop="answerCount" content="15" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/45413135" target="_blank" data-id="10377803" data-za-element-name="Title">
请问哪位大神比较过spring cloud和dubbo,各自的优缺点是什么?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/45413135/answer/103314477">
<!-- <meta itemprop="answer-id" content="36782425">
<meta itemprop="answer-url-token" content="103314477"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>7</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">7</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">

<a class="author-link"
data-hovercard="p$t$wang-si-han-47"
target="_blank" href="/people/wang-si-han-47"
>王思涵</a></span><span title="低级JAVA工程师" class="bio">
低级JAVA工程师
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="7" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">7</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="10377803" data-action="/answer/content" data-author-name="王思涵" data-entry-url="/question/45413135/answer/103314477">

<textarea hidden class="content">spring-boot有pivotal和netfix背书,是一套完整的企业级应用的开发方案,天然集成分布式云架构spring-cloud,重点是有配套的更加完善的软件基础设施,但是实际编码会有侵入性。 &lt;br&gt;&lt;br&gt;Dubbo有阿里巴巴背书,是一套RPC的半完善解决方案,配套的软件基础设施不全,好处是编码环节基本没有侵入性。&lt;br&gt;&lt;br&gt;我们在用dubbo,朋友的公司也有在用的,面临的问题也大致相似,问题定位、熔断和监控方面的问题让人没有那么的放心,最近打算尝试在spring-cloud中寻找答案。&lt;br&gt;&lt;br&gt;----------------------插播一条广告----------------------&lt;br&gt;&lt;a href=&quot;//link.zhihu.com/?target=http%3A//spring-cloud.io&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;spring-cloud.io&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;//link.zhihu.com/?target=http%3A//bbs.spring-cloud.io&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;bbs.spring-cloud.io&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;i class=&quot;icon-external&quot;&gt;&lt;/i&gt;&lt;/a&gt;</textarea>


<div class="zh-summary summary clearfix">

spring-boot有pivotal和netfix背书,是一套完整的企业级应用的开发方案,天然集成分布式云架构spring-cloud,重点是有配套的更加完善的软件基础设施,但是实际编码会有侵入性。 Dubbo有阿里巴巴背书,是一套RPC的半完善解决方案,配套的软件基础设施不全,…

<a href="/question/45413135/answer/103314477" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" data-tooltip="s$t$发布于 2016-05-30" target="_blank" href="/question/45413135/answer/103314477">编辑于 2016-09-19</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-10377803"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>6 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="feed-item feed-item-hook folding" itemprop="question" itemscope itemtype="http://schema.org/Question" data-score="15" data-type="Answer">
<link itemprop="url" href="/question/51436292/answer/126234842">
<meta itemprop="answer-id" content="46000386" />
<meta itemprop="answer-url-token" content="126234842" />
<meta itemprop="answerCount" content="7" />
<div class="feed-main">
<div class="content">
<h2><a class="question_link" href="/question/51436292" target="_blank" data-id="12792191" data-za-element-name="Title">
分布式服务治理的设计问题?
</a></h2>
<div class="expandable entry-body">
<link itemprop="url" href="/question/51436292/answer/126234842">
<!-- <meta itemprop="answer-id" content="46000386">
<meta itemprop="answer-url-token" content="126234842"> -->

<div class="zm-item-vote">
<a class="zm-item-vote-count js-expand js-vote-count" href="javascript:;" data-bind-votecount>6</a>
</div>

<div class="zm-votebar">
<button class="up ">
<i class="icon vote-arrow"></i>
<span class="count">6</span>
<span class="label sr-only">赞同</span>
</button>
<button class="down ">
<i class="icon vote-arrow"></i>
<span class="label sr-only">反对</span>
</button>
</div>



<div class="zm-item-answer-author-info">

<span class="summary-wrapper">
<span class="author-link-line">
<span class="name">知乎用户</span></span><span title="养喵,程序员。" class="bio">
养喵,程序员。
</span>
</span>
</div>

<div class="zm-item-vote-info" data-votecount="6" data-async-voters="1">



<span class="voters text"><a href="#" class="more text"><span class="js-voteCount">6</span>&nbsp;人赞同</a></span>


</div>
<div class="zm-item-rich-text expandable js-collapse-body" data-resourceid="12792191" data-action="/answer/content" data-author-name="杨帆" data-entry-url="/question/51436292/answer/126234842">

<textarea hidden class="content">这个最简单(可能也是最靠谱)的方案是 agent,在 php 的服务器上跑一个 agent,监听你的注册中心,这个 agent 在收到新地址后修改 php 的配置文件,php 被 fpm 调用的时候都去读取一下这个配置。&lt;br&gt;&lt;br&gt;一般来说,几乎所有的框架都有配置文件,直接去改这个文件就可以了,改造没有增加任何成本(因为你本来也是要读配置文件的)。</textarea>


<div class="zh-summary summary clearfix">

这个最简单(可能也是最靠谱)的方案是 agent,在 php 的服务器上跑一个 agent,监听你的注册中心,这个 agent 在收到新地址后修改 php 的配置文件,php 被 fpm 调用的时候都去读取一下这个配置。 一般来说,几乎所有的框架都有配置文件,直接去改这个文件…

<a href="/question/51436292/answer/126234842" class="toggle-expand">显示全部</a>

</div>



<p class="visible-expanded"><a itemprop="url" class="answer-date-link meta-item" target="_blank" href="/question/51436292/answer/126234842">发布于 2016-10-12</a></p>

</div>
</div>
<div class="zm-item-meta feed-meta">
<div class="zm-item-meta answer-actions clearfix js-contentActions">
<div class="zm-meta-panel">

<a data-follow="q:link" class="follow-link zg-follow meta-item" href="javascript:;" id="sfb-12792191"><i class="z-icon-follow"></i>关注问题</a>

<a href="#" name="addcomment" class="meta-item toggle-comment js-toggleCommentBox">
<i class="z-icon-comment"></i>15 条评论</a>


<a href="#" class="meta-item zu-autohide js-thank" data-thanked="false"><i class="z-icon-thank"></i>感谢</a>



<a href="#" class="meta-item zu-autohide js-share"><i class="z-icon-share"></i>分享</a>

<a href="#" class="meta-item zu-autohide js-collect"><i class="z-icon-collect"></i>收藏</a>





<span class="zg-bull zu-autohide">&bull;</span>

<a href="#" class="meta-item zu-autohide js-noHelp">没有帮助</a>

<span class="zg-bull zu-autohide">&bull;</span>
<a href="#" class="meta-item zu-autohide js-report">举报</a>




<meta name="copyrightStatus" content="1">
<meta name="disableCopyAvatar" content="">

<span class="zg-bull">&bull;</span>

<a href="/terms#sec-licence-1" target="_blank" class="meta-item copyright">
作者保留权利
</a>


<button class="meta-item item-collapse js-collapse">
<i class="z-icon-fold"></i>收起
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>



</div>
</div>

</div>
</div>


<div class="zu-main-sidebar" data-za-module="RightSideBar">

<div class="zm-side-section">
<div class="zm-side-section-inner">
<div class="SignFlow SignFlow--bordered" id="SidebarSignFlow">
<div class="SignFlow-panel">
<div class="title register">
<h1>加入知乎</h1>
<h2>与世界分享你的知识、经验和见解</h2>
</div>
<div class="view register SignupForm" data-za-module="SignUpForm">
<form action="/register/email" method="POST">
<div class="input-wrapper">
<input type="text" name="fullname" aria-label="姓名" data-placeholder="姓名" required>
</div>
<div class="input-wrapper">

<input type="text" name="phone_num" class="account" aria-label="手机号" data-placeholder="手机号" required>

</div>
<div class="input-wrapper toggle-password">
<input type="password" hidden> 
<input type="password" name="password" aria-label="密码" data-placeholder="密码(不少于 6 位)" required>
<span class="z-ico-show-password"></span>
</div>
<div class="input-wrapper captcha-module" data-type="en" >
<input id="captcha" name="captcha" placeholder="验证码" required data-rule-required="true" data-msg-required="请填写验证码">
<div class="captcha-container">

<img class="js-refreshCaptcha captcha" width="120" height="30" data-tooltip="s$t$看不清楚?换一张"  alt="验证码">
</div>
</div>
<div class="actions">

<input type="submit" value="注册" class="submit zg-btn-blue">

</div>
<div class="sns clearfix">
<span>已有帐号?<a href="#" class="switch-to-login">登录</a></span>
</div>
</form>
</div>
</div>
<div class="SignFlow-panel" hidden>
<div class="LoginForm">
<div class="title login">
<h1>登录知乎</h1>
<h2>与世界分享你的知识、经验和见解</h2>
</div>
<div class="view login" data-za-module="SignInForm">
<form method="POST">
<div class="input-wrapper">
<input type="text" name="account" class="account" aria-label="手机号或邮箱" placeholder="手机号或邮箱" required>
</div>
<div class="input-wrapper toggle-password">
<input type="password" name="password" aria-label="密码" placeholder="密码" required>
<span class="z-ico-show-password"></span>
</div>
<div class="input-wrapper captcha-module" data-type="en" >
<input id="captcha" name="captcha" placeholder="验证码" required data-rule-required="true" data-msg-required="请填写验证码">
<div class="captcha-container">

<img class="js-refreshCaptcha captcha" width="120" height="30" data-tooltip="s$t$看不清楚?换一张"  alt="验证码">
</div>
</div>
<div class="actions">

<input type="submit" value="登录" class="submit zg-btn-blue">

</div>
<div class="sns clearfix">
<label class="remember-me"><input type="checkbox" name="remember_me" checked value="true">记住我</label>
<span class="middot">·</span>
<button class="unable-login" type="button">无法登录?</button>
<button type="button" class="js-show-sns-buttons is-visible">社交帐号登录</button>
<div class="sns-buttons">
<button type="button" class="wechat"><span class="ico sprite-global-icon-wechat-gray"></span>微信</button>
<button type="button" class="weibo"><span class="ico sprite-global-icon-weibo-gray"></span>微博</button>
<button type="button" class="qq"><span class="ico sprite-global-icon-qq-gray"></span>QQ</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="zm-side-section">
<div class="DownloadApp">
<button class="DownloadApp-button">
<span class="sprite-global-icon-qrcode"></span>
下载知乎 App
</button>
</div>
</div>



<div class="zm-side-section">
<div class="zm-side-section-inner">
<div class="topic-header-side zm-entry-head-wrap">

<div class="clearfix"><div id="zh-topic-side-head">
<a href="javascript:;" id="tf-159900" name="focus" class="zg-btn-green topic-follow-button zu-entry-focus-button">关注</a>
<div class="zm-topic-side-followers-info">

<strong>1865</strong> 人关注了该话题

</div>
</div></div>

</div>
</div>
</div>


<div class="shameimaru-placeholder" data-loc="topic_up" data-params='{&quot;topic_token&quot;: &quot;20023491&quot;}'></div>

<div class="zm-side-section" id="zh-topic-side-parents-list">
<div class="zm-side-section-inner parent-topic">
<h3 class="zm-topic-side-organize-title">父话题
</h3>
<div class="clearfix">

<a class="zm-item-tag"
href="/topic/20054173"
data-hovercard="t$b$20054173" data-token="20054173" data-topicid="170498" data-za-element-name="Title">
cloud native
</a>

<a class="zm-item-tag"
href="/topic/19556273"
data-hovercard="t$b$19556273" data-token="19556273" data-topicid="2004" data-za-element-name="Title">
软件架构
</a>

<a class="zm-item-tag"
href="/topic/19578413"
data-hovercard="t$b$19578413" data-token="19578413" data-topicid="9391" data-za-element-name="Title">
系统架构
</a>

</div>
</div>
</div>




<div class="zm-side-section">
<div class="zm-side-section-inner">
<h3>话题动态</h3>
<ul class="zh-question-related-questions" itemprop="relatedQuestion" itemscope itemtype="http://schema.org/ItemList">

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/60491772" data-id="16420203" data-za-element-name="Title">
分布式计算机系统中服务注册与发现为什么需要追求一致性?
</a> <span class="num">0 个回答</span><meta itemprop="followerCount" content="1" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/60208792" data-id="16306821" data-za-element-name="Title">
DevOps和SRE有区别吗?
</a> <span class="num">4 个回答</span><meta itemprop="followerCount" content="4" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/45413135" data-id="10377803" data-za-element-name="Title">
请问哪位大神比较过spring cloud和dubbo,各自的优缺点是什么?
</a> <span class="num">15 个回答</span><meta itemprop="followerCount" content="392" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/61135980" data-id="16678572" data-za-element-name="Title">
springcloud微服务架构服务间相互调用好在哪里?为什么不直接post请求获取结果?
</a> <span class="num">0 个回答</span><meta itemprop="followerCount" content="1" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/61085805" data-id="16658349" data-za-element-name="Title">
2017年,后端出现了什么新的思想和技术?
</a> <span class="num">7 个回答</span><meta itemprop="followerCount" content="136" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/37808426" data-id="7330673" data-za-element-name="Title">
SOA和微服务架构的区别?
</a> <span class="num">12 个回答</span><meta itemprop="followerCount" content="1421" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/59664771" data-id="16088755" data-za-element-name="Title">
spring cloud 中的zuul怎么保证自身高可用?
</a> <span class="num">2 个回答</span><meta itemprop="followerCount" content="8" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/61051129" data-id="16644472" data-za-element-name="Title">
Dropwizard学习资料太少了,在哪可以找到中文资料或者教程?
</a> <span class="num">0 个回答</span><meta itemprop="followerCount" content="1" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/59283708" data-id="15935998" data-za-element-name="Title">
微服务框架 spring cloud  和 dubbo 有什么区别?
</a> <span class="num">4 个回答</span><meta itemprop="followerCount" content="30" /></li>

<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Question"><a class="question_link" href="/question/59865869" data-id="16169471" data-za-element-name="Title">
Spring Cloud还孵化了Spring Cloud Kubernetes微服务框架?
</a> <span class="num">1 个回答</span><meta itemprop="followerCount" content="4" /></li>

</ul>
</div>
</div>

<div class="shameimaru-placeholder" data-loc="topic_down" data-params='{&quot;topic_token&quot;: &quot;20023491&quot;}'></div>

</div>


</div>


<div id="zh-footer" class="zh-footer">
<div class="content zg-wrap clearfix">
<ul>

<li><a href="https://liukanshan.zhihu.com" target="_blank">刘看山</a></li>

<li><a href="/app" target="_blank">移动应用</a></li>
<li><a href="/careers">加入知乎</a></li>
<li><a href="/terms" target="_blank">知乎协议</a></li>
<li><a href="/jubao" target="_blank">举报投诉</a></li>
<li><a href="/contact">联系我们</a></li>

</ul>

<span class="copy">&copy; 2017 知乎</span>

</div>
</div>

<script type="text/json" class="json-inline" data-name="guiders2">{}</script>
<script type="text/json" class="json-inline" data-name="current_user">["","","","-1","",0,0]</script>
<script type="text/json" class="json-inline" data-name="front_web_config">{"realname_win_config":{"timestamp":1498147200,"tip":"\u5e94\u56fd\u5bb6\u6cd5\u89c4\u5bf9\u4e8e\u5e10\u53f7\u5b9e\u540d\u7684\u8981\u6c42\uff0c\u8bf7\u4e8e2017\u5e746\u670823\u65e5\u524d\uff0c\u8fdb\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u524d\u5b8c\u6210\u624b\u673a\u7ed1\u5b9a\u3002","continue":1,"continue_time":3600}}</script>
<script type="text/json" class="json-inline" data-name="user_status">[null,null,false]</script>
<script type="text/json" class="json-inline" data-name="env">["zhihu.com","comet.zhihu.com",false,null,false,false]</script>
<script type="text/json" class="json-inline" data-name="permissions">[]</script>


<script type="text/json" class="json-inline" data-name="ga_vars">{"user_created":0,"now":1497524402000,"abtest_mask":"------------------------------","user_attr":[0,0,0,"-","-"],"user_hash":0}</script>

<script type="text/json" class="json-inline" data-name="ra-urls">{"Copyright":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/Copyright.98ac6609.js","PayUIApp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/PayUIApp.ca78ba78.js","CouponApp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/CouponApp.8387f93f.js","PaymentApp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/PaymentApp.7f16d61c.js","Community":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/Community.ea022099.js","Report":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/Report.1a8d7f59.js","OrgOpHelp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/OrgOpHelp.f891eee7.js","common":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/common.a4dd3236.js","BalanceApp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/BalanceApp.676e538e.js","AnswerWarrant":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/AnswerWarrant.97f134aa.js","CommentApp":"https:\/\/static.zhihu.com\/static\/revved\/-\/apps\/CommentApp.7556991d.js"}</script>

<script type="text/json" class="json-inline" data-name="current_topic">[["\u5fae\u670d\u52a1\u67b6\u6784","20023491","https:\/\/pic3.zhimg.com\/d15c93887e729e563d8e9a338c4cbf92_s.png",159900],[["cloud native","20054173","https:\/\/pic1.zhimg.com\/e82bab09c_s.jpg"],["\u8f6f\u4ef6\u67b6\u6784","19556273","https:\/\/pic1.zhimg.com\/e82bab09c_s.jpg"],["\u7cfb\u7edf\u67b6\u6784","19578413","https:\/\/pic1.zhimg.com\/266bb1c94_s.jpg"]],0,0,"",0]</script>

<script src="https://static.zhihu.com/static/revved/-/js/vendor.cb14a042.js"></script>
<script src="https://static.zhihu.com/static/revved/-/js/closure/base.be5705f4.js"></script>

<script src="https://static.zhihu.com/static/revved/-/js/closure/common.8e300f1f.js"></script>


<script src="https://static.zhihu.com/static/revved/-/js/closure/richtexteditor.42ea4ea9.js" async></script>
<script src="https://static.zhihu.com/static/revved/-/js/closure/page-main.591fd941.js"></script>
<meta name="entry" content="ZH.entryT" data-module-id="page-main">

<script type="text/zscript" znonce="f94507c3895b4bd3ac7b35c6b0402a3b"></script>

<input type="hidden" name="_xsrf" value="7a0f508a21351b7793e7aeedbcc90a8f"/>
</body>
</html>
Out[32]:
({u'avatar_url': u'https://pic3.zhimg.com/d15c93887e729e563d8e9a338c4cbf92_is.png',
  u'best_answers_count': 15,
  u'excerpt': u'',
  u'followers_count': 1865,
  u'id': u'20023491',
  u'introduction': u'',
  u'is_following': True,
  u'name': u'\u5fae\u670d\u52a1\u67b6\u6784',
  u'questions_count': 77,
  u'type': u'topic',
  u'url': u'http://www.zhihu.com/api/v4/topics/20023491'},
 ['45413135',
  '61085805',
  '51436292',
  '42812221',
  '50852183',
  '36501858',
  '54692776',
  '37808426',
  '35980124'])

In [25]:
r = requests.get(zhihu_api_topics.format(20023491),headers=headers)

In [26]:
print r.text


{"name": "\u5fae\u670d\u52a1\u67b6\u6784", "url": "http://www.zhihu.com/api/v4/topics/20023491", "excerpt": "", "introduction": "", "followers_count": 1864, "avatar_url": "https://pic3.zhimg.com/d15c93887e729e563d8e9a338c4cbf92_is.png", "is_following": true, "best_answers_count": 15, "type": "topic", "id": "20023491", "questions_count": 77}

In [27]:
j = r.json()

In [24]:
print r.text


{"name": "Go \u8bed\u8a00", "url": "http://www.zhihu.com/api/v4/topics/19625982", "excerpt": "Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. https://golang.org/ ", "introduction": "Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.<br><a href=\"https://golang.org/\">https://golang.org/<\/a>", "followers_count": 19721, "avatar_url": "https://pic2.zhimg.com/ab5839e91_is.jpg", "is_following": true, "best_answers_count": 420, "type": "topic", "id": "19625982", "questions_count": 1001}

In [ ]: