摘要

在 Java 微服务生态中,Spring Cloud

注:由于 Spring Cloud 技术栈涵盖的特性众多,因此本文讨论的范围仅限于服务治理部分。

简介

Dubbo Spring Cloud 基于 Dubbo Spring Boot 2.7.1

2019年4月19日,Dubbo Spring Cloud 首个 Preview Release,随同 Spring Cloud Alibaba 0.2.2.RELEASE 和 0.9.0.RELEASE 一同发布

版本支持

由于 Spring 官方宣布 Spring Cloud Edgware(下文简称为 “E” 版) 将在 2019 年 8 月 1 号后停止维护13,因此,目前 Dubbo Spring Cloud 发布版本并未对 “E” 版提供支持,仅为 “F” 版 和 “G” 版开发,同时也建议和鼓励 Spring Cloud 用户更新至 “F” 版 或 “G” 版。

同时,Dubbo Spring Cloud 基于 Apache Dubbo Spring Boot 2.7.1 开发(最低 Java 版本为 1.8),提供完整的 Dubbo 注解驱动、外部化配置以及 Production-Ready 的特性,详情请参考:https://github.com/apache/inc...

以下表格将说明 Dubbo Spring Cloud 版本关系映射关系:

Spring Cloud

Spring Cloud Alibaba

Spring Boot

Dubbo Spring Boot

Finchley

0.2.2.RELEASE

2.0.x

2.7.1

Greenwich

0.9.0.RELEASE

2.1.x

2.7.1

Edgware

0.1.2.RELEASE

1.5.x

Dubbo Spring Cloud 不支持该版本

功能特性

由于 Dubbo Spring Cloud 构建在原生的 Spring Cloud 之上,其服务治理方面的能力可认为是 Spring Cloud Plus,不仅完全覆盖 Spring Cloud 原生特性

功能组件

Spring Cloud

Dubbo Spring Cloud

分布式配置(Distributed configuration)

Git、Zookeeper、Consul、JDBC

Spring Cloud 分布式配置 + Dubbo 配置中心

服务注册与发现(Service registration and discovery)

Eureka、Zookeeper、Consul

Spring Cloud 原生注册中心

负载均衡(Load balancing)

Ribbon(随机、轮询等算法)

Dubbo 内建实现(随机、轮询等算法 + 权重等特性)

服务熔断(Circuit Breakers)

Spring Cloud Hystrix

Spring Cloud Hystrix + Alibaba Sentinel

服务调用(Service-to-service calls)

Open Feign、RestTemplate

Spring Cloud 服务调用 + Dubbo @Reference

链路跟踪(Tracing)

Spring Cloud Sleuth

Zipkin、opentracing 等

高亮特性

1. Dubbo 使用 Spring Cloud 服务注册与发现

Dubbo Spring Cloud 基于 Spring Cloud Commons 抽象实现 Dubbo 服务注册与发现,应用只需增添外部化配置属性 “dubbo.registry.address = spring-cloud://localhost”,就能轻松地桥接到所有原生 Spring Cloud 注册中心,包括:

Nacos

Eureka

Zookeeper

Consul

Dubbo Spring Cloud 将在下个版本支持 Spring Cloud 注册中心与 Dubbo 注册中心并存,提供双注册机制,实现无缝迁移。

2. Dubbo 作为 Spring Cloud 服务调用

默认情况,Spring Cloud Open Feign 以及 @LoadBalanced RestTemplate 作为 Spring Cloud 的两种服务调用方式。Dubbo Spring Cloud 为其提供了第三种选择,即 Dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache Dubbo 注解 @Service和 @Reference 暴露和引用 Dubbo 服务,实现服务间多种协议的通讯。同时,也可以利用 Dubbo 泛化接口轻松实现服务网关。

3. Dubbo 服务自省

Dubbo Spring Cloud 引入了全新的服务治理特性 - 服务自省(Service Introspection),其设计目的在于最大化减轻注册中心负载,去 Dubbo 注册元信息中心化。假设一个 Spring Cloud 应用引入 Dubbo Spring Boot Starter,并暴露 N 个 Dubbo 服务,以 Dubbo Nacos 注册中心 为例,当前应用将注册 N+1 个 Nacos 应用,除 Spring Cloud 应用本身之前,其余 N 个应用均来自于 Dubbo 服务,当 N 越大时,注册中心负载越重。因此,Dubbo Spring Cloud 应用对注册中心的负载相当于传统 Dubbo 的 N 分之一,在不增加基础设施投入的前提下,理论上,使其集群规模扩大 N 倍。当然,未来的 Dubbo 也将提供服务自省的能力。

4. Dubbo 迁移 Spring Cloud 服务调用

尽管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服务调用特性,不过 Dubbo 服务治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及负载均衡稳定性等方面。因此,建议开发人员将 Spring Cloud Open Feign 或者 @LoadBalanced RestTemplate 迁移为 Dubbo 服务。考虑到迁移过程并非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即 @DubboTransported 注解。该注解能够帮助服务消费端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底层走 Dubbo 调用(可切换 Dubbo 支持的协议),而服务提供方则只需在原有 @RestController 类上追加 Dubbo @Servce 注解(需要抽取接口)即可,换言之,在不调整 Feign 接口以及 RestTemplate URL 的前提下,实现无缝迁移。如果迁移时间充分的话,建议使用 Dubbo 服务重构系统中的原生 Spring Cloud 服务的定义。

简单示例

开发 Dubbo Spring Cloud 应用的方法与传统 Dubbo 或 Spring Cloud 应用类似,按照以下步骤就能完整地实现Dubbo 服务提供方和消费方的应用,完整的示例代码请访问一下资源:

定义 Dubbo 服务接口

Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如 EchoService 接口:

public interface EchoService {

String echo(String message);

}

为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,如以上接口就存放在 artifact spring-cloud-dubbo-sample-api 之中。

对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact,并以接口调用的方式执行远程方法。接下来进一步讨论怎样实现 Dubbo 服务提供方和消费方。

实现 Dubbo 服务提供方

初始化 spring-cloud-dubbo-server-sample Maven 工程

首先,创建 artifactId 名为 spring-cloud-dubbo-server-sample 的 Maven 工程,并在其 pom.xml 文件中增添

Dubbo Spring Cloud 必要的依赖:

org.springframework.cloud

spring-cloud-dubbo-sample-api

${project.version}

org.springframework.boot

spring-boot-actuator

org.springframework.cloud

spring-cloud-starter-dubbo

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

以上依赖 artifact 说明如下:

spring-cloud-dubbo-sample-api : 提供 EchoService 接口的 artifact

spring-boot-actuator : Spring Boot Production-Ready artifact,间接引入 spring-boot artifact

spring-cloud-starter-dubbo : Dubbo Spring Cloud Starter artifact,间接引入 dubbo-spring-boot-starter 等 artifact

spring-cloud-starter-alibaba-nacos-discovery : Nacos Spring Cloud 服务注册与发现 artifact

值得注意的是,以上 artifact 未指定版本(version),因此,还需显示地声明 :

org.springframework.cloud

spring-cloud-alibaba-dependencies

0.9.0.RELEASE

pom

import

以上完整的 Maven 依赖配置,请参考 spring-cloud-dubbo-server-sample pom.xml 文件

完成以上步骤之后,下一步则是实现 Dubbo 服务

实现 Dubbo 服务

EchoService 作为暴露的 Dubbo 服务接口,服务提供方 spring-cloud-dubbo-server-sample 需要将其实现:

@org.apache.dubbo.config.annotation.Service

class EchoServiceImpl implements EchoService {

@Override

public String echo(String message) {

return "[echo] Hello, " + message;

}

}

其中,@org.apache.dubbo.config.annotation.Service 是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。

因此,下一步需要将其配置 Dubbo 服务(远程)。

配置 Dubbo 服务提供方

在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注 @DubboComponentScan 来实现基准包扫描。

同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 YAML 配置如下所示:

dubbo:

scan:

# dubbo 服务扫描基准包

base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap

protocol:

# dubbo 协议

name: dubbo

# dubbo 协议端口( -1 表示自增端口,从 20880 开始)

port: -1

registry:

# 挂载到 Spring Cloud 注册中心

address: spring-cloud://localhost

spring:

application:

# Dubbo 应用名称

name: spring-cloud-alibaba-dubbo-server

main:

# Spring Boot 2.1 需要设定

allow-bean-definition-overriding: true

cloud:

nacos:

# Nacos 服务发现与注册配置

discovery:

server-addr: 127.0.0.1:8848

以上 YAML 内容,上半部分为 Dubbo 的配置:

dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包

dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)

dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 "spring-cloud://localhost",说明挂载到 Spring Cloud 注册中心

当前 Dubbo Spring Cloud 实现必须配置 dubbo.registry.address = spring-cloud://localhost,下一个版本将其配置变为可选

(参考 issue #592),

并且支持传统 Dubbo 协议的支持(参考 issue #588)

下半部分则是 Spring Cloud 相关配置:

spring.application.name : Spring 应用名称,用于 Spring Cloud 服务注册和发现。

该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name,因此,无需再显示地配置 dubbo.application.name

spring.main.allow-bean-definition-overriding : 在 Spring Boot 2.1 以及更高的版本增加该设定,

因为 Spring Boot 默认调整了 Bean 定义覆盖行为。(推荐一个好的 Dubbo 讨论 issue #3193)

spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口

以上完整的 YAML 配置文件,请参考 spring-cloud-dubbo-server-sample bootstrap.yaml 文件

完成以上步骤后,还需编写一个 Dubbo Spring Cloud 引导类。

引导 Dubbo Spring Cloud 服务提供方应用

Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:

@EnableDiscoveryClient

@EnableAutoConfiguration

public class DubboSpringCloudServerBootstrap {

public static void main(String[] args) {

SpringApplication.run(DubboSpringCloudServerBootstrap.class);

}

}

在引导 DubboSpringCloudServerBootstrap 之前,请提前启动 Nacos 服务器。

当 DubboSpringCloudServerBootstrap 启动后,将应用 spring-cloud-dubbo-server-sample 将出现在 Nacos 控制台界面。

当 Dubbo 服务提供方启动后,下一步实现一个 Dubbo 服务消费方。

实现 Dubbo 服务消费方

由于 Java 服务就 EchoService、服务提供方应用 spring-cloud-dubbo-server-sample 以及 Nacos 服务器均已准备完毕。Dubbo 服务消费方

只需初始化服务消费方 Maven 工程 spring-cloud-dubbo-client-sample 以及消费 Dubbo 服务。

初始化 spring-cloud-dubbo-client-sample Maven 工程

与服务提供方 Maven 工程类,需添加相关 Maven 依赖:

org.springframework.cloud

spring-cloud-alibaba-dependencies

0.9.0.RELEASE

pom

import

org.springframework.cloud

spring-cloud-dubbo-sample-api

${project.version}

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-actuator

org.springframework.cloud

spring-cloud-starter-dubbo

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

与应用 spring-cloud-dubbo-server-sample 不同的是,当前应用依赖 spring-boot-starter-web,表明它属于 Web Servlet 应用。

以上完整的 Maven 依赖配置,请参考 spring-cloud-dubbo-client-sample pom.xml 文件

配置 Dubbo 服务消费方

Dubbo 服务消费方配置与服务提供方类似,当前应用 spring-cloud-dubbo-client-sample 属于纯服务消费方,因此,所需的外部化配置更精简:

dubbo:

registry:

# 挂载到 Spring Cloud 注册中心

address: spring-cloud://localhost

cloud:

subscribed-services: spring-cloud-alibaba-dubbo-server

spring:

application:

# Dubbo 应用名称

name: spring-cloud-alibaba-dubbo-client

main:

# Spring Boot 2.1 需要设定

allow-bean-definition-overriding: true

cloud:

nacos:

# Nacos 服务发现与注册配置

discovery:

server-addr: 127.0.0.1:8848

对比应用 spring-cloud-dubbo-server-sample,除应用名称 spring.application.name 存在差异外,spring-cloud-dubbo-client-sample

新增了属性 dubbo.cloud.subscribed-services 的设置。并且该值为服务提供方应用 "spring-cloud-dubbo-server-sample"。

dubbo.cloud.subscribed-services : 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 "," 分割。

不推荐使用默认值为 "*",它将订阅所有应用。

当应用使用属性 dubbo.cloud.subscribed-services 默认值时,日志中将会输出一行警告:

Current application will subscribe all services(size:x) in registry, a lot of memory and CPU cycles may be used,

thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services

由于当前应用属于 Web 应用,它会默认地使用 8080 作为 Web 服务端口,如果需要自定义,可通过属性 server.port 调整。

以上完整的 YAML 配置文件,请参考 spring-cloud-dubbo-client-sample bootstrap.yaml 文件

引导 Dubbo Spring Cloud 服务消费方应用

为了减少实现步骤,以下引导类将 Dubbo 服务消费以及引导功能合二为一:

@EnableDiscoveryClient

@EnableAutoConfiguration

@RestController

public class DubboSpringCloudClientBootstrap {

@Reference

private EchoService echoService;

@GetMapping("/echo")

public String echo(String message) {

return echoService.echo(message);

}

public static void main(String[] args) {

SpringApplication.run(DubboSpringCloudClientBootstrap.class);

}

}

不仅如此,DubboSpringCloudClientBootstrap 也作为 REST Endpoint,通过暴露 /echo Web 服务,消费 Dubbo EchoService 服务。因此,

可通过 curl 命令执行 HTTP GET 方法:

$ curl http://127.0.0.1:8080/echo?message=%E5%B0%8F%E9%A9%AC%E5%93%A5%EF%BC%88mercyblitz%EF%BC%89

HTTP 响应为:

[echo] Hello, 小马哥(mercyblitz)

以上结果说明应用 spring-cloud-dubbo-client-sample 通过消费 Dubbo 服务,返回服务提供方 spring-cloud-dubbo-server-sample 运算后的内容。

高阶示例

如果您需要进一步了解 Dubbo Spring Cloud 使用细节,可参考官方 Samples:https://github.com/spring-clo...

其子模块说明如下:

spring-cloud-dubbo-sample-api:API 模块,存放 Dubbo 服务接口和模型定义

spring-cloud-dubbo-provider-web-sample:Dubbo Spring Cloud 服务提供方示例(Web 应用)

spring-cloud-dubbo-provider-sample:Dubbo Spring Cloud 服务提供方示例(非 Web 应用)

spring-cloud-dubbo-consumer-sample:Dubbo Spring Cloud 服务消费方示例

spring-cloud-dubbo-servlet-gateway-sample:Dubbo Spring Cloud Servlet 网关简易实现示例

问题反馈

如果您在使用 Dubbo Spring Cloud 的过程中遇到任何问题,请内容反馈至 https://github.com/spring-clo...

进阶阅读

关于更多的 Dubbo Spring Cloud 特性以及设计细节,请关注

下篇预告

接下的文章将会介绍 Dubbo Spring Cloud 高阶示例的运用和实现,敬请关注小马哥微信公众号:次灵均阁

获得最新 Dubbo Spring Cloud 相关资讯。

本书全名为《Spring Boot 编程思想》,是以 Spring Boot 2.0 为讨论的主线,讨论的范围将涵盖 Spring Boot 1.x 的所有版本,以及所关联的 Spring Framework 版本,致力于:

场景分析:掌握技术选型

系统学习:拒绝浅尝辄止

重视规范:了解发展趋势

源码解读:理解设计思想

实战演练:巩固学习成果

欢迎小伙伴在京东或当当订购

京东存有少量现货(随机发送签名版),可先睹为快:http://t.cn/ExjBU2M

当当价格优惠,需要五月初发货:http://t.cn/EX0QteF

分享推荐

免费分享

收费分享

深入探讨 Java 相关技术,包括行业动态,架构设计,设计模式,框架使用,源码分析等。

关于作者

小马哥,Java 劝退师,Apache 和 Spring Cloud 等知名开源架构成员,点击查看详情。

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). - https://spring.io/projects/sp... ↩

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, light weight, java based RPC framework. - https://dubbo.apache.org ↩

Spring Cloud Alibaba provides a one-stop solution for distributed application development. - https://github.com/spring-clo... ↩

Nacos is an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications - https://nacos.io/ ↩

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers. - https://github.com/Netflix/eu... ↩

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. - https://zookeeper.apache.org ↩

Consul is a distributed service mesh to connect, secure, and configure services across any runtime platform and public or private cloud - https://www.consul.io/ ↩

从 2.7.0 开始,Dubbo Spring Boot 与 Dubbo 在版本上保持一致 ↩

Preview releases of Spring Cloud Alibaba are available: 0.9.0, 0.2.2, and 0.1.2 - https://spring.io/blog/2019/0...

目前最新的 Spring Cloud “F” 版的版本为:Finchley.SR2 - https://cloud.spring.io/sprin...

当前Spring Cloud “G” 版为 Greenwich.RELEASE ↩

Spring Cloud 原生注册中心,除 Eureka、Zookeeper、Consul 之外,还包括 Spring Cloud Alibaba 中的 Nacos ↩

Alibaba Sentinel:Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性 - https://github.com/alibaba/Se...

java 微服务 dubbo_Dubbo Spring Cloud 重塑微服务治理相关推荐

  1. SpringCloud 微服务入门-Spring Cloud 与微服务概述

    导语   首先要了解的是微服务是一种架构风格,跟SOA类似.而Spring Cloud 则是实现这种架构风格的一种技术栈.类似于实现SOA架构风格,用到的具体的技术栈就是ESB.博主也在之前的博客中分 ...

  2. 小马哥java_小马哥 Java 微服务实践 - Spring Cloud 系列

    资源内容: 小马哥 Java 微服务实践 - Spring Cloud 系列|____Java 微服务实践 - Spring Cloud系列(四)服务发现注册.wmv|____Java 微服务实践 - ...

  3. 微服务与Spring Cloud简介

    目录 分布式 集群 微服务简介 什么是集群 什么是分布式 集群/分布式 分布式/微服务/SOA 微服务 微服务优点及缺点 微服务技术栈 CAP原理 对CAP原理的一些常见的理解误区 分区容忍性P的例子 ...

  4. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  5. 2022最新基于 Spring Cloud 的微服务架构分析,java 技术经理岗位职责

    构建在开发团队之外的 API 网关必须具备负载均衡能力,可以配置多个 IP 地址.通过该 API 网关也最好具备和 Docker 容器扩展后的服务自动注册和地址加入扩展能力. Eureka 的竞品分析 ...

  6. Java微服务组件Spring cloud ribbon源码分析

    微服务组件Spring Cloud Ribbon源码分析_哔哩哔哩_bilibili Ribbon源码分析 | ProcessOn免费在线作图,在线流程图,在线思维导图 | 1.什么是ribbon? ...

  7. 微服务等于Spring Cloud?了解微服务架构和框架

    作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...

  8. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

  9. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  10. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

最新文章

  1. 6-6.用HLSL定义点光源
  2. 图论 ---- D. Multiples and Power Differences (全局lcm + 矩阵二分图)
  3. 天猫总裁靖捷回答了今年双11的热点问题
  4. 笔记(用Python做些事情)--变量(日期和时间)
  5. linux启动数据库orl,linux5.4下oracle问题
  6. 数据库中的时间数据在页面显示时后面会多一个.0的问题
  7. SQL查询效率:100w数据查询只需要1秒钟
  8. Maven 单元测试
  9. php分流短信服务商,使用第三方短信服务商云片发送短信(php样例)
  10. 洛谷P5831题题解(Java语言描述)
  11. Windows核心编程学习笔记
  12. Django 使用第三方服务发送电子邮件
  13. python文件中写中文_解决python中csv文件中文写入问题
  14. SOMEIP报文格式部分字段概述(二)
  15. matlab画经纬度点图,Matlab绘制汉经纬度的散点图 1
  16. 价值几千行代码的一键安装开源啦,欢迎各位领导莅临指导(贡献代码)
  17. Zabbix配置网络流量监控报警
  18. 漏洞分析---关于OpenSSL“心脏出血”漏洞的分析
  19. 针对上网本和便携式设备的第一批MeeGo构架
  20. pytorch中的dropout在drop什么?

热门文章

  1. 用QQ邮箱接收网易163企业邮箱的邮件
  2. Chrome 扩展开发教程
  3. Android简易实战教程--第三十七话《NotifiCation》
  4. 利用arduino给PCB800099液晶驱动板烧录程序
  5. 系统提供人民币(CNY)美元(USD)英镑(GBP)价值转换
  6. java马里奥_java马里奥毕业设计
  7. 不知如何走的立交桥(西直门交警一文背景)
  8. C#开发实战1200例(第I卷)目录
  9. unity 中是如何实现游戏人物换装的
  10. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计