最近使用Docker+SpringCloud来代替Zookper+Dobbo来做微服务,总结如下

现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚——Spring Cloud。这是序篇,主要讲述我们为什么选择Spring Cloud和它的技术概要。

1 为什么微服务架构需要Spring Cloud

简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Spring Cloud就是其中的佼佼者。

DevOps是英文Development和Operations的合体,他要求开发、测试、运维进行一体化的合作,进行更小、更频繁、更自动化的应用发布,以及围绕应用架构来构建基础设施的架构。这就要求应用充分的内聚,也方便运维和管理。这个理念与微服务理念不谋而合。

接下来我们从服务化架构演进的角度来看看为什么Spring Cloud更适应微服务架构。

1.1 从使用nginx说起

最初的服务化解决方案是给提供相同服务提供一个统一的域名,然后服务调用者向这个域名发送HTTP请求,由Nginx负责请求的分发和跳转。

这种架构存在很多问题:

Nginx作为中间层,在配置文件中耦合了服务调用的逻辑,这削弱了微服务的完整性,也使得Nginx在一定程度上变成了一个重量级的ESB。

服务的信息分散在各个系统,无法统一管理和维护。每一次的服务调用都是一次尝试,服务消费者并不知道有哪些实例在给他们提供服务。这不符合DevOps的理念。

无法直观的看到服务提供者和服务消费者当前的运行状况和通信频率。这也不符合DevOps的理念。

消费者的失败重发,负载均衡等都没有统一策略,这加大了开发每个服务的难度,不利于快速演化。

为了解决上面的问题,我们需要一个现成的中心组件对服务进行整合,将每个服务的信息汇总,包括服务的组件名称、地址、数量等。服务的调用方在请求某项服务时首先通过中心组件获取提供这项服务的实例的信息(IP、端口等),再通过默认或自定义的策略选择该服务的某一提供者直接进行访问。所以,我们引入了Dubbo。

1.2 基于Dubbo实现微服务

Dubbo是阿里开源的一个SOA服务治理解决方案,文档丰富,在国内的使用度非常高。

使用Dubbo构建的微服务,已经可以比较好地解决上面提到的问题:

调用中间层变成了可选组件,消费者可以直接访问服务提供者。

服务信息被集中到Registry中,形成了服务治理的中心组件。

通过Monitor监控系统,可以直观地展示服务调用的统计信息。

Consumer可以进行负载均衡、服务降级的选择。

但是对于微服务架构而言,Dubbo也并不是十全十美的:

Registry严重依赖第三方组件(zookeeper或者redis),当这些组件出现问题时,服务调用很快就会中断。

DUBBO主要使用RPC调用。使得服务提供方与调用方在代码上产生了强依赖,服务提供者需要不断将包含公共代码的jar包打包出来供消费者使用。一旦打包出现问题,就会导致服务调用出错。

1.3 最佳选择——Spring Cloud

作为新一代的服务框架,Spring Cloud提出的口号是开发“面向云环境的应用程序”,它为微服务架构提供了更加全面的技术支持。

结合我们一开始提到的微服务的诉求,我们把Spring Cloud与DUBBO进行一番对比:

微服务需要的功能 Dubbo SpringCloud

服务注册和发现

Zookeeper

Eureka

服务调用方式

RPC

RESTful API

断路器

负载均衡

服务路由和过滤

分布式配置

分布式锁

计划开发

集群选主

分布式消息

Spring Cloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。

Eureka相比于zookeeper,更加适合于服务发现的场景,这点会在下一篇会详细展开。

很明显,Spring Cloud的功能比DUBBO更加强大,涵盖面更广,而且作为Spring的拳头项目,它也能够与Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring项目完美融合,这些对于微服务而言是至关重要的。

前面提到,微服务背后一个重要的理念就是持续集成、快速交付,而在服务内部使用一个统一的技术框架,显然比把分散的技术组合到一起更有效率。更重要的是,相比于Dubbo,它是一个正在持续维护的、社区更加火热的开源项目,这就保证使用它构建的系统,可以持续地得到开源力量的支持。

2 Spring Cloud技术概要

下图展示了Spring Cloud的完整技术组成:

服务治理:这是Spring Cloud的核心。目前Spring Cloud主要通过整合Netflix的相关产品来实现这方面的功能(Spring Cloud Netflix),包括用于服务注册和发现的Eureka,调用断路器Hystrix,调用端负载均衡Ribbon,Rest客户端Feign,智能服务路由Zuul,用于监控数据收集和展示的Spectator、Servo、Atlas,用于配置读取的Archaius和提供Controller层Reactive封装的RxJava。除此之外,针对

Feign和RxJava并不是Netiflix的产品,但是被整合到了Spring Cloud Netflix中。

对于服务的注册和发现,除了Eureka,Spring Cloud也整合了Consul和Zookeeper作为备选,但是因为这两个方案在CAP理论上都遵循CP而不是AP(下一篇会详细介绍这点),所以官方并没有推荐使用。

分布式链路监控:Spring Cloud Sleuth提供了全自动、可配置的数据埋点,以收集微服务调用链路上的性能数据,并发送给Zipkin进行存储、统计和展示。

消息组件:Spring Cloud Stream对于分布式消息的各种需求进行了抽象,包括发布订阅、分组消费、消息分片等功能,实现了微服务之间的异步通信。Spring Cloud Stream也集成了第三方的RabbitMQ和Apache Kafka作为消息队列的实现。而Spring Cloud Bus基于Spring Cloud Stream,主要提供了服务间的事件通信(比如刷新配置)。

配置中心:基于Spring Cloud Netflix和Spring Cloud Bus,Spring又提供了Spring Cloud Config,实现了配置集中管理、动态刷新的配置中心概念。配置通过Git或者简单文件来存储,支持加解密。

安全控制:Spring Cloud Security基于OAUTH2这个开放网络的安全标准,提供了微服务环境下的单点登录、资源授权、令牌管理等功能。

命令行工具:Spring Cloud Cli提供了以命令行和脚本的方式来管理微服务及Spring Cloud组件的方式。

集群工具:Spring Cloud Cluster提供了集群选主、分布式锁(暂未实现)、一次性令牌(暂未实现)等分布式集群需要的技术组件。

go与Java微服务对比_微服务架构对比-Go语言中文社区相关推荐

  1. java io读取doc内容_Java word 内容读取-Go语言中文社区

    1.添加依赖关系(网上好多帖子没有写依赖,害我找半天) org.apache.poi poi 4.0.0 org.apache.poi poi-ooxml 4.0.0 org.apache.poi p ...

  2. java ee io_JAVAEE细细看 进阶 14 - IO总结-Go语言中文社区

    IO 总结 1. 字节流 2. 字符流 IO流总览 字节输入流 字节输出流 字符输入流 字符输出流 其他流 案例一 集合到文件 将一个ArrayList集合中的字符串数据写入到文本文件,要求:每个字符 ...

  3. appollo消息服务器,Springboot 集成 MQTT —— web 服务端实现(apollo 客户端)-Go语言中文社区...

    基于 MQTT 可以实现很多场景,例如现在使用比较多的物联网,还有消息的实时推送.联网的设备连接上 apollo 服务器以后,一直监听 apollo 推送过来的信令/消息即可. 1.web 服务端向联 ...

  4. java unbound_某个版本的JavaSE (unbound)的问题解决-Go语言中文社区

    异常原因:项目在eclipse中找不到对应版本的jdk或者jre,就会报错: 解决方案: ①轻度解决:右击项目 => Build Path => Configure Build Path ...

  5. golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合

    目前微服务架构仍是软件架构中最新的热门话题,虽然Golang是一门新的语言,但Golang的性能比python和java高出不少.既能承受程序使用运行的服务构建的繁重负载,又容易与GitHub集成,管 ...

  6. java 服务降级_微服务的降级学习

    参考博客: https://blog.csdn.net/glory1234work2115/article/details/51626322 https://blog.csdn.net/xiaofei ...

  7. lagom的微服务框架_微服务有麻烦吗? Lagom在这里为您提供帮助。 试试吧!

    lagom的微服务框架 蛋糕支持. 我们很自豪地宣布,新的Apache许可的微服务框架Lagom可在GitHub上使用 ! 当其他框架专注于打包和实例启动时,Lagom重新定义了Java开发人员构建基 ...

  8. 如何把项目改成微服务项目_微服务拆分那点事

    Mar. 19th 2018 BY 王保平 wangbaoping@360.cn 背景 最近参与了两个项目的开发,两个项目都有多组件,各自服务功能清晰等特点,也就是所谓的微服务,再结合以前的一些单体项 ...

  9. 微博中微服务缓存_微服务之间调用超时的设置治理

    原标题:微服务之间调用超时的设置治理 作者 | 奇正 微服务是⼀种分布式架构,系统内各部分(服务)被部署为单独的应用程序,并通过某种远程访问协议进⾏通讯.分布式应⽤的挑战之⼀就是如何管理远程服务的可用 ...

最新文章

  1. Linux驱动无硬件设备,Linux设备驱动与硬件通信
  2. SAP PM 初级系列8 - PM 组织架构
  3. 多媒体个人计算机必须硬件设备包括,计算机基础在线测试.doc
  4. 【转】矩阵的几何解释
  5. Qt学习笔记之项目管理(pro)文件
  6. WPF 和 windows Form Application的区别
  7. 解密 云HBase 冷热分离技术原理
  8. 用JS判断不同分辨率调用不同的CSS样式文件
  9. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
  10. python如何使数据加行_如何使用 Python 插入行
  11. 连续arq协议的利用率_Chrome底层原理和HTTP协议 - 石吴玉
  12. JavaScript(3):基础部分之异常处理
  13. echarts设置标题样式_Pyecharts 全局配置项之标题配置项
  14. 关于git远程分支操作
  15. [Android移动安全渗透基础教程] 模拟器篇
  16. win10怎么录制电脑屏幕 电脑录制视频
  17. 如何在PDF上添加电子签名?签名技巧分享
  18. 计算机无线网怎么安装教程,全民wifi驱动怎么安装_电脑安装全民wifi驱动教程
  19. Mysql分表:Merge
  20. 薛老师软考高项学员:2016年4月11日作业

热门文章

  1. Xamarin+vs2010部署错误:error MSB6004: 指定的任务可执行文件位置\sdk\\tools\zipalign.exe”无效...
  2. 团队项目第二阶段冲刺站立会议06
  3. android 高级画布绘图
  4. TEECHART使用TEXTOUT标注后,保存图片的方法?
  5. 105.通信同步异步定义及其相关
  6. 地球自转减速影响世界时 格林尼治时间或成历史
  7. 意法半导体STM32 ARM Cortex 32位微控制器
  8. 智能算法把奥巴马识别成白人,AI也学会歧视了?
  9. 程序员必备的在线编程辅导平台之TutorialsPoint
  10. Python语言编程之LEGB变量作用域法则