blob: 99b04b3d3ad477de5a307ea370c82a83273dbb94 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>微服务实例间多环境隔离 - ServiceComb Java Chassis 开发指南</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700" />
<link rel="stylesheet" href="../css/theme.css" />
<link rel="stylesheet" href="../css/theme_extra.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/github.min.css" />
<script>
// Current page data
var mkdocs_page_name = "\u5fae\u670d\u52a1\u5b9e\u4f8b\u95f4\u591a\u73af\u5883\u9694\u79bb";
var mkdocs_page_input_path = "general-development/multienvironment.md";
var mkdocs_page_url = null;
</script>
<script src="../js/jquery-2.1.1.min.js" defer></script>
<script src="../js/modernizr-2.8.3.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="../index.html" class="icon icon-home"> ServiceComb Java Chassis 开发指南</a>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../toc.html">目录</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../index.html">概述</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../start/catalog.html">快速入门</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../start/design.html">设计选型参考</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../build-provider/definition/service-definition.html">微服务定义</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../build-provider/catalog.html">开发服务提供者</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../build-consumer/catalog.html">开发服务消费者</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="catalog.html">通用功能开发</a>
</li>
</ul>
<p class="caption"><span class="caption-text">多样化的通信协议功能参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../transports/introduction.html">多协议介绍</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../transports/rest-over-servlet.html">REST over Servlet</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../transports/rest-over-vertx.html">REST over Vertx</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../transports/http2.html">REST over HTTP2</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../transports/highway-rpc.html">Highway</a>
</li>
</ul>
<p class="caption"><span class="caption-text">多样化的服务注册与发现功能参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../registry/introduction.html">注册发现说明</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../registry/service-center.html">使用服务中心</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../registry/local-registry.html">本地注册发现</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../registry/distributed.html">去中心化注册发现</a>
</li>
</ul>
<p class="caption"><span class="caption-text">管理服务配置</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../config/general-config.html">通用配置说明</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../config/read-config.html">在程序中读取配置信息</a>
</li>
</ul>
<p class="caption"><span class="caption-text">服务治理功能参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/intruduction.html">处理链介绍</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/loadbalance.html">负载均衡</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/ratelimit.html">限流</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/router.html">灰度发布</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/fault-injection.html">故障注入</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/bizkeeper.html">隔离熔断容错</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/governance.html">基于动态配置的流量特征治理</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/fail-retry.html">快速失败和重试</a>
</li>
</ul>
<p class="caption"><span class="caption-text">网关功能参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../edge/open-service.html">介绍</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../edge/by-servicecomb-sdk.html">使用 Edge Service 做网关</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../edge/zuul.html">使用 `zuul` 和 `spring cloud gateway` 做网关</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../edge/nginx.html">nginx 网关简单介绍</a>
</li>
</ul>
<p class="caption"><span class="caption-text">安全特性参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../references-handlers/publickey.html">公钥认证</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/tls.html">使用TLS通信</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/shi-yong-rsa-ren-zheng.html">使用RSA认证</a>
</li>
</ul>
<p class="caption"><span class="caption-text">服务打包和运行</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../packaging/standalone.html">以standalone模式打包</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../packaging/web-container.html">以WEB容器模式打包</a>
</li>
</ul>
<p class="caption"><span class="caption-text">专题文章</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../using-java-chassis-in-spring-boot/using-java-chassis-in-spring-boot.html">在Spring Boot中使用java chassis</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../featured-topics/features.html">新功能介绍系列文章</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../featured-topics/compatibility.html">兼容问题和兼容性策略</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../featured-topics/upgrading.html">升级指导系列文章</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../featured-topics/performance.html">性能问题分析和调优</a>
</li>
</ul>
<p class="caption"><span class="caption-text">常用配置项参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../config-reference/rest-transport-client.html">REST Transport Client 配置项</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../config-reference/config-center-client.html">Config Center Client 配置项</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../config-reference/service-center-client.html">Service Center Client 配置项</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../config-reference/kie-client.html">ServiceComb Kie Client 配置项</a>
</li>
</ul>
<p class="caption"><span class="caption-text">常见问题</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../question-and-answer/faq.html">FAQ</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../question-and-answer/question_answer.html">Q & A</a>
</li>
<li class="toctree-l1"><a class="reference internal" href="../question-and-answer/interface-compatibility.html">微服务接口兼容常见问题</a>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">ServiceComb Java Chassis 开发指南</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> &raquo;</li>
<li>微服务实例间多环境隔离</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="_1">微服务实例间多环境隔离</h1>
<p>进行服务发现的时候,开发者需要了解本微服务能够发现那些其他服务的实例。ServiceComb提供了分层次的实例隔离。</p>
<h1 id="_2">微服务实例分层管理</h1>
<p>要了解实例间的隔离层次,首先需要了解ServiceComb定义的一个体系完备的微服务系统结构:</p>
<p><img alt="" src="../assets/isolation/architecture.png" /></p>
<p>在微服务系统结构中,顶层是项目(project),项目中的应用分属于不同环境(environment),即测试和生产环境可以分开,每个环境下包含多个应用(application),在某个特定应用的特定环境中,包含多个微服务(service),一个微服务又可以同时存在多个版本(version)。<br />
以上,是所有静态元数据的范畴,某个特定服务的特定版本则包含多个在运行时注册上来的微服务实例,因为服务实例的信息在运行时随着系统的伸缩、故障等原因是动态变化的,所以服务实例的路由信息又为动态数据。通过分层管理微服务的这些数据,也就自然而然地实现了实例之间的逻辑隔离。
* Project对应到华为云上各region下创建的project,不同的project互相隔离,如果该region下没有新建project,则代表该region;例如,在华北区(cn-north-1)下创建一个名字为tianjing的project,若想微服务注册到该project下,可以在microservice.yaml文件里配置:</p>
<pre><code class="language-yaml"> servicecomb:
credentials:
project: cn-north-1_tianjing
</code></pre>
<ul>
<li>
<p>Environment表示当前微服务实例所属环境,可在microservice.yaml文件里通过service_description.environment配置当前实例环境。</p>
</li>
<li>
<p>Application代表一个软件应用的逻辑实体,表示一个有业务功能呈现给用户的计算机软件应用,可在microservice.yaml文件里通过APPLICATION_ID配置应用名。</p>
</li>
<li>
<p>Service是对按需取用的功能对象的一种描述,一个应用下存在多个服务,各服务间相互调用,可在microservice.yaml文件里通过service_description.name指定服务名。</p>
</li>
<li>
<p>Version表示当前服务的版本,一个服务下可存在多个版本,可在microservice.yaml文件里通过service_description.version配置当前微服务版本号;消费端进行访问时,默认按照路由规则进行访问,可以在消费端通过servicecomb.references.[providerName].version-rule设置版本规则。</p>
</li>
</ul>
<h1 id="_3">典型场景</h1>
<h2 id="_4">应用间隔离及跨应用调用</h2>
<h3 id="_5">功能介绍</h3>
<p>在ServiceComb框架中,一个应用下包含多个微服务。<br />
同一个微服务实例,可以作为公共服务部署到多个应用,通过指定不同的APPLICATION_ID来实现。</p>
<p><img alt="" src="../assets/isolation/app.png" /></p>
<p>不同的微服务实例,默认情况下,只允许在同一个应用里相互调用,当用户需要不同应用间的微服务相互调用时,就需要开启跨应用调用功能。 </p>
<h3 id="_6">配置说明:</h3>
<ol>
<li>若要开启跨应用调用,首先需在provider端的microservice.yaml文件开启跨应用调用配置。配置项如下:</li>
</ol>
<pre><code class="language-yaml"> service_description:
properties:
allowCrossApp: true
</code></pre>
<ol>
<li>Consumer端指定微服务名称调用provider的时候,需要加上provider所属的应用ID,格式由[microserviceName]变为[appID]:[microserviceName]。</li>
</ol>
<h3 id="_7">代码示例:</h3>
<p>假设consumer所属应用为helloApp,provider所属应用为hellApp2,微服务名称为helloProvider。<br />
* RestTemplate调用方式<br />
当consumer端以RestTemplate方式开发微服务消费者时,需要在调用的URL中将[microserviceName]改为[appID]:[microserviceName],如下:</p>
<pre><code class="language-java">RestTemplate restTemplate = RestTemplateBuilder.create();
ResponseEntity&lt;String&gt; responseEntity = restTemplate.getForEntity(“cse://helloApp2:helloProvider/hello/sayHello?name={name}”, String.class, “ServiceComb”);
</code></pre>
<ul>
<li>RPC调用方式<br />
当consumer端以RPC方式开发微服务消费者时,声明的服务提供者代理如下:</li>
</ul>
<pre><code class="language-java">@RpcReference(schemaId = “hello”, microserviceName = “helloApp2:helloProvider”)
private Hello hello;
</code></pre>
<p>跨应用调用与同应用下调用微服务的方式相同:</p>
<pre><code class="language-java">hello.sayHello(“ServiceComb”);
</code></pre>
<h1 id="_8">典型场景</h1>
<h2 id="_9">开发环境互相隔离及快速开发</h2>
<h3 id="_10">功能介绍</h3>
<p>ServiceComb框架通过设置environment,可以将微服务实例标记为开发、测试、预生产、生产环境,实现了在实例级别的天然隔离;客户端在查找服务端实例的时候,只能发现相同environment下的服务端实例。</p>
<p><img alt="" src="../assets/isolation/environment.png" /></p>
<p>ServiceComb在设计时,严格依赖于契约,所以正常情况下契约变了,就必须要修改微服务的版本。但是如果当前还是开发模式,那么修改接口就是很正常的情况,当修改完毕再次启动当前服务时,新生成的契约和Service Center上保存的旧契约会冲突并报错,导致启动失败,如果每次都通过修改微服务版本号,或者删除该服务在Service Center上的缓存数据来解决,显然对开发人员很不友好。<br />
ServiceComb框架支持在开发态进行微服务的快速调试,通过将environment配置为development即可。当接口修改了(Schema发生了变化),重启就可以正常注册到服务中心,而不用修改版本号。<br />
但是如果有consumer已经调用了重启之前的服务,那么consumer端也需要重启才能获取最新provider的schema;比如A-&gt;B,B接口进行了修改并且重启,那么A这个时候还是使用B之前的schema,调用可能会出错,以免出现未知异常,A也需要重启。 </p>
<h3 id="_11">配置说明:</h3>
<p>仅支持以下枚举值:development,testing,acceptance,production,不配置的情况下缺省值为""(空)。<br />
<em> 方法1:通过JVM启动参数-Dservice_description.environment=development(枚举值)进行设置;<br />
</em> 方法2:通过microservice.yaml配置文件来指定:</p>
<pre><code class="language-yaml"> service_description:
environment: development
</code></pre>
<ul>
<li>方法3:通过环境变量SERVICECOMB_ENV来指定(仅限于windows系统),若是开发态,其值配置为development;</li>
</ul>
<h1 id="_12">典型场景</h1>
<h2 id="_13">两地三中心</h2>
<h3 id="_14">功能介绍</h3>
<p>在以两地三中心的解决方案进行跨地区部署服务的场景,同一套服务存在于多个availableZone中,需要实现优先调用同一个AZ内的应用,若本AZ出现问题,要能够访问另一个AZ下的应用,从而保证服务的可靠性。<br />
ServiceComb提供了数据中心配置,来实现对微服务的分区和管理。数据中心包含3个属性:servicecomb.datacenter.name, servicecomb.datacenter.region, servicecomb.datacenter.availableZone,数据中心信息不提供隔离能力,微服务可以发现其他数据中心的实例。但是可以通过启用实例亲和性,来优先往指定的区域或者Zone发消息。</p>
<p><img alt="" src="../assets/isolation/datacenter.png" /></p>
<p>客户端在路由的时候,会优先将请求转发到zone/region都相同的实例,然后是region相同,但zone不相同的实例,都不相同的时候,则按照路由规则选择一个。亲和性不是逻辑隔离,只要实例之间网络是联通的,那么都有可能访问到;如果网络不通,则会访问失败。<br />
在华为云上部署时,可将region和availableZone的值与华为云的region(例如:cn-north-1)和可用区对应起来,但是因为华为云上的不同region目前网络不互通,所以此时不支持跨region访问;除了对应华为云的region值,也可以自行定义其他值,根据实际情况作相应调整,非常灵活。 </p>
<h3 id="_15">配置说明:</h3>
<pre><code class="language-yaml">servicecomb:
datacenter:
name: mydatacenter
region: my-Region
availableZone: my-Zone
</code></pre>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version">
</span>
</div>
<script>var base_url = '..';</script>
<script src="../js/theme_extra.js" defer></script>
<script src="../js/theme.js" defer></script>
<script src="../search/main.js" defer></script>
<script defer>
window.onload = function () {
SphinxRtdTheme.Navigation.enable(true);
};
</script>
</body>
</html>