blob: 15e7f167d199ee5d23c955cab4d9a0012cb16dd5 [file] [log] [blame]
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<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="../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 = "\u8bbe\u8ba1\u9009\u578b\u53c2\u8003";
var mkdocs_page_input_path = "start/design.md";
var mkdocs_page_url = null;
</script>
<script src="../js/jquery-3.6.0.min.js" defer></script>
<!--[if lt IE 9]>
<script src="../js/html5shiv.min.js"></script>
<![endif]-->
<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="Navigation menu">
<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="catalog.html">快速入门</a>
</li>
</ul>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal current" href="design.html">设计选型参考</a>
<ul class="current">
</ul>
</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="../general-development/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/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="Mobile navigation menu">
<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" class="icon icon-home" alt="Docs"></a> &raquo;</li>
<li>设计选型参考</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div class="section" itemprop="articleBody">
<p>Apache ServiceComb Java Chassis 结合大量微服务开发实践,实现<a href="https://microservices.io/patterns/microservice-chassis.html">微服务架构模式</a>, 帮
助开发者更加简单、快速的构建微服务应用。</p>
<p>微服务架构模式的核心包含如下几部分:</p>
<ul>
<li>微服务之间的 RPC 通信。Java Chassis 提供了非常高效的通信方式,并支持多协议扩展,比如最快的 REST 通信模式实现, 异步的二进制通信模式 HIGHWAY 。 </li>
<li>分布式微服务实例和服务发现。结合 ServiceComb Service Center, 实现分布式、多集群服务发现能力,以及强大的微服务元数据管理能力。</li>
<li>配置外置,动态、集中的配置管理。 能够使用 ServiceComb Kie, 华为云配置中心、 Nacos、 Apollo 等多种配置中心, 并且和 Spring Boot
配置管理能力完整融合。 </li>
<li>分布式故障管理,服务容错、隔离、熔断。 内置故障实例隔离、故障重试、耗时接口隔离等重要分布式故障处理能力。可选使用 Hystrix 的
容错、隔离、熔断能力, 只需要做简单的配置。</li>
<li>分布式日志追踪。 提供 Open Tracing 支持。 </li>
</ul>
<p>此外还有性能监控,日志记录系统、健康检查等。 Java Chassis 采用优雅的设计模式,实现了上述所有的核心部件的功能,并且使得这些功能
开箱即用。使用 Java Chassis , 开发者能够更加聚焦于业务功能开发,快速的构建商业可用的微服务应用。 </p>
<h2 id="java-chassis">Java Chassis 的软件工程实践 <a name="h1"></a></h2>
<p>Java Chassis 在设计的时候, 不仅考虑了如何更好的使用微服务架构模式, 还把优秀的软件工程思想融合进来, 帮助开发者更好的管理信息
资产, 提升软件工程管理能力。 </p>
<p>下图简单的描述 “以契约为中心” 的核心概念。 </p>
<p><img alt="" src="software-enginerring.png" /> </p>
<p>可以通过 Invocation 获取到 Java Chassis 的契约等源数据信息, 是 Java Chassis 的一个核心对象。 </p>
<p>可以阅读 <a href="https://bbs.huaweicloud.com/blogs/113640">基于CSE的微服务工程实践-以契约为中心</a> 了解契约如何应用的更多内容。 工程
实践不是 Java Chassis 的强制约束, 开发者可以结合实际情况进行选择。 </p>
<h2 id="java-chassis_1">Java Chassis 的运行时架构 <a name="h2"></a></h2>
<p>为了支持软件工程实践, Java Chassis 的运行时架构是一个哑铃结构, 两端分别是“编程模型” 和 “通信模型”, 中间是“运行模型”。 </p>
<p><img alt="" src="https://bbs-img.huaweicloud.com/blogs/img/images_162633886685280.png" /></p>
<p>“编程模型” 面向开发者写服务接口的习惯, “通信模型” 面向微服务之间的高效编码和通信, “运行模型” 基于“契约”, 提供一种服务服务无关
的插拔机制,能够让开发者独立于业务实现开发治理功能,并且灵活的移除和增加功能,以及调整这些治理功能的处理顺序。 </p>
<p>“运行模型” 的核心抽象接口是 Handler , 这个接口是一个异步的定义, Java Chassis 运行时模型采用纯异步的实现, 让整个系统运行非常
高效。 </p>
<p>可以阅读 <a href="http://servicecomb.apache.org/cn/docs/open-design/">Apache ServiceComb 的开放性设计</a> 了解 Java Chassis 运行时架构的其他设计考虑。 </p>
<h2 id="java-chassis_2">Java Chassis 微服务应用架构 <a name="h3"></a></h2>
<p>有很多优秀的微服务应用架构实践。 微服务应用架构应该充分考虑系统的弹性, 能够针对系统的性能瓶颈点进行扩容, 需要考虑应用系统内部微服务
拆分的灵活性, 为业务的变更做好及时调整。 </p>
<p>下图展示了一个典型的应用架构。 接入层采用一些网络基础设施,比如 DNS , 浮动 IP 等方便用户采用统一的 URL 访问系统, 或者采用 API 网关等
基础设施实现系统的能力开放。 业务层包含应用网关, 进行一些认证鉴权、 审计等功能, 经过认证的请求被应用网关转发到微服务系统内部。 </p>
<p><img alt="" src="application-architect.png" /></p>
<p>可以阅读<a href="https://bbs.huaweicloud.com/blogs/101611">单体应用微服务改造实践</a>, 了解为什么推荐这样的微服务应用架构。 Java Chassis
为应用架构提供了接入网关服务 <a href="../edge/by-servicecomb-sdk.html">Edge Servcie</a></p>
<h2 id="java-chassis_3">Java Chassis 微服务技术选型 <a name="h4"></a></h2>
<p>Java 语言拥有庞大的技术体系和标准, 并且广泛的应用到业务的系统的各个方面。 和 Java Chassis 有紧密关系的技术包括 JSP/Servlet 标准
和容器, Spring 和 Spring Boot 技术, 以及 Spring Boot 提供的 REST 开发框架 Spring MVC。 </p>
<h3 id="java-chassis-jspservlet">Java Chassis 和 JSP/Servlet 标准</h3>
<p>Java Chassis 不依赖于 JSP/Servlet 标准, 可以基于 Vert.x 的 HTTP 实现, 提供非常轻量级和高效的 REST 服务, 在性能要求高的核心
业务场景, 使用这种轻量级的技术非常合适。 这种场景下, 没有完整的实现 JSP/Servlet 相关接口, 比如 HttpServletRequest,
HttpServletResponse 等。 <a href="https://github.com/apache/servicecomb-samples/tree/master/porter_lightweight">servicecomb-samples</a>
提供了一个完整的使用这种部署模式的例子。 <a href="https://bbs.huaweicloud.com/blogs/101875">基于CSE的微服务架构实践-轻量级架构技术选型</a> 提供了
一些常见的组件的选型参考。 </p>
<p>Java Chassis 可以部署运行于 JSP/Servlet 容器里面, 在这个场景下, Java Chassis 的核心部件就是一个 Servlet , 在这个 Servlet 里面
实现了 Java Chassis 的核心 RPC 系统。 采用 JSP/Servlet 容器运行 Java Chassis, 业务请求首先经过容器的 HTTP 实现, 然后经过 Filter,
进入 Java Chassis 的 RestServlet , 运行 Java Chassis 的运行时模型 (Handlers) , 进入业务接口处理。 可以参考
<a href="../transports/rest-over-servlet.html">REST over Servlet</a> 了解如何在 Servlet 容器中加载 Java Chassis 的 Servlet。 </p>
<h3 id="java-chassis-springspring-boot">Java Chassis 和 Spring、Spring Boot</h3>
<p>Java Chassis 目前依赖于 Spring, 但是从设计上是可以独立于 Spring 运行的。 Spring 是被广泛使用的技术, 非常轻量级,
在 Java Chassis 中可以直接使用 Spring 相关的技术。 Java Chassis 不依赖于 Spring Boot, 但是可以将 Java Chassis 运行于 Spring
Boot 基础之上。 </p>
<p>Spring Boot 2 开始也提供了多种运行环境支持, WebApplicationType.NONE, WebApplicationType.SERVLET, WebApplicationType.REACTIVE,
Java Chassis 可以集成 NONE, SERVLET 两种模式。 在 NONE 模式下集成 Java Chassis, 和 Spring Boot 自身的 REACTIVE 非常类似,
但是比 Spring Boot 的 REACTIVE 运行更加高效, 并且支持早期的 RestTemplate API 和 RPC API 来访问服务。 </p>
<p>可以阅读<a href="https://bbs.huaweicloud.com/blogs/115961">基于CSE的微服务架构实践-Spring Boot技术栈选型</a> 了解一些常用的 Spring Boot
开发的组件选型参考。 <a href="https://github.com/apache/servicecomb-samples/tree/master/porter_springboot">servicecomb-samples</a> 提供
了 WebApplicationType.SERVLET 使用 Spring Boot 的完整例子。
WebApplicationType.NONE 模式等价于轻量级模式, 但是可以使用 Spring Boot 的打包功能以及其他开发组件支持。 </p>
<ul>
<li>Spring MVC </li>
</ul>
<p>Java Chassis 继承了 Spring MVC 的接口设计, 提供了 Provider 和 Consumer 层面的 API 接口来定义 REST 接口和访问 REST 接口。 但是需要
注意的是, 两个是完全不同的实现, 实现机制也不一样。 Spring Boot 主要基于 Servlet, 实现了 MVC 模式, 不仅可以开发 REST 接口, 还可以
开发其他 HTTP 功能, 比如重定向, 返回 HTML 页面等, 还可以通过 @ExceptionHandler, @ControllerAdvice 等机制拦截 Servlet 请求,进行
异常处理。 Java Chassis 只实现了 REST 服务定义和调用, 并且在异常处理机制和请求拦截机制上不一样。 开发细节上的差异可以通过
<a href="../build-provider/springmvc.html">用SpringMVC 开发微服务</a> 进行了解。 </p>
<h2 id="java-chassis-spring-cloud">Java Chassis 与 Spring Cloud <a name="h5"></a></h2>
<p>Java Chassis 和 Spring Cloud 都实现了微服务架构模式, 相比而言, Java Chassis 是一个更加紧凑的实现, 开箱即用, 而 Spring Cloud 则是
相对松散的实现, 整合了大量的 Netflix 组件。 </p>
<p>微服务架构模式关注微服务内部和微服务之间的设计, 也关注微服务与微服务基础设施之间的关系。 Java Chassis 微服务基础设施包括服务注册和发现,
服务配置管理, 灰度发布和契约管理等功能。 Spring Cloud 可以使用 <a href="https://github.com/huaweicloud/spring-cloud-huawei">spring-cloud-huawei</a>
来使用 Java Chassis 相关的微服务基础设施。 </p>
<p><img alt="" src="spring-cloud-servicecomb.png" /></p>
<p>可以阅读<a href="https://bbs.huaweicloud.com/blogs/115718">基于CSE的微服务架构实践-Spring Cloud技术栈选型</a>了解 Java Chassis
和 Spring Cloud 组件选型上的一些差异。 </p>
</div>
</div><footer>
<div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation">
<a href="catalog.html" class="btn btn-neutral float-left" title="快速入门"><span class="icon icon-circle-arrow-left"></span> Previous</a>
<a href="../build-provider/definition/service-definition.html" class="btn btn-neutral float-right" title="微服务定义">Next <span class="icon icon-circle-arrow-right"></span></a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/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><a href="catalog.html" style="color: #fcfcfc">&laquo; Previous</a></span>
<span><a href="../build-provider/definition/service-definition.html" style="color: #fcfcfc">Next &raquo;</a></span>
</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>