Spring Cloud 与 Dubbo 对比整理(2)

Stella981
• 阅读 639

一般初期公司需要面对非常复杂的业务场景,而且随着业务的发展,变化的可能性非常高。所以在微服务架构设计之初,我们就期望我们的微服务体系能:

  • 不绑定到特定的框架、语言
  • 服务最好是Restful风格
  • 足够简单,容易落地,将来能扩展
  • 和Docker相容性好

目前常见的微服务相关框架:

  • Dubbo、DubboX
  • Spring Cloud
  • Motan
  • Thrift、gRPC

这些常见的框架中,Dubbo几乎是唯一能被称作全栈微服务框架的“框架”,它包含了微服务所需的几乎所有内容,而DubboX作为它的增强,增加了REST支持。

它优点很多,例如:

  • 全栈,服务治理的所有问题几乎都有现成答案
  • 可靠,经过阿里实践检验的产品
  • 实践多,社区有许多成功应用Dubbo的经验

不过遗憾的是:

  • 已经停止维护
  • 不利于裁剪使用
  • “过于Java”,与其他语言相容性一般

Motan是微博平台微服务框架,承载了微博平台千亿次调用业务。

优点是:

  • 性能好,源自于微博对高并发和实时性的要求
  • 模块化,结构简单,易于使用
  • 与其他语言相容性好

不过:

  • 为“短平快”业务而生,即业务简单,追求高性能高并发。

Apache Thrift、gRPC等虽然优秀,并不能算作微服务框架,自身并不包括服务发现等必要特性。

如果说微服务少不了Java,那么一定少不了Spring,如果说少不了Spring,那么微服务“官配”Spring Cloud当然是值得斟酌的选择。

优点:

  • “不做生产者,只做搬运工”
  • 简单方便,几乎零配置
  • 模块化,松散耦合,按需取用
  • 社区背靠Spring大树

不足:

  • 轻量并非全栈
  • 没解决RPC的问题
  • 实践案例少

根据我们的目标,我们最终选择了Spring Cloud作为我们的微服务框架,原因有4点:

  1. 虽然Dubbo基础设施更加完善,但结构复杂,我们很难吃得下,容易出坑
  2. 基于 Apache Thrift 和 gRPC 自研,投入产出比很差
  3. 不想过早引入RPC以防滥用,Restful风格本身就是一种约束。
  4. 做选择时, Motan 还没有发布

Spring Cloud

Spring Cloud是一个集成框架,将开源社区中的框架集成到Spring体系下,几个重要的家族项目:

  • spring-boot ,一改Java应用程序运行难、部署难,甚至无需Web容器,只依赖JRE即可
  • spring-cloud-netflix ,集成Netflix优秀的组件Eureka、Hystrix、Ribbon、Zuul,提供服务发现、限流、客户端负载均衡和API网关等特性支持
  • spring-cloud-config ,微服务配置管理
  • spring-cloud-consul ,集成Consul支持

服务发现和配置管理

Spring Cloud Netflix提供了Eureka服务注册的集成支持,不过没选它是因为:

  • 更适合纯Java平台的服务注册和发现
  • 仍然需要其他分布式KV服务做后端,没解决我们的核心问题

Docker作为支撑平台的重要技术之一,Consul几乎也是我们的必选服务。因此我们觉得一事不烦二主,理所应当的Consul成为我们的服务注册中心。

Consul的优势:

  • 使用Raft一致性算法,能保证分布式集群内各节点状态一致
  • 提供服务注册、服务发现、服务状态检查
  • 支持HTTP、DNS等协议
  • 提供分布式一致性KV存储

也就是说,Consul可以一次性解决我们对服务注册发现、配置管理的需求,而且长期来看也更适合跟不同平台的系统,包括和Docker调度系统进行整合。

最初打算自己开发一个Consul和Spring Cloud整合的组件,不过幸运的是,我们做出这个决定的时候, spring-cloud-consul 刚刚发布了,我们可以拿来即用,这节约了很多的工作量。

因此借助Consul和 spring-cloud-consul ,我们实现了

  • 服务注册,引用了 srping-cloud-consul 的项目可以自动注册服务,也可以通过HTTP接口手动注册,Docker容器也可以自动注册
  • 服务健康状态检查,Consul可以自动维护健康的服务列表
  • 异构系统可以直接通过Consul的HTTP接口拉取并监视服务列表,或者直接使用DNS解析服务
  • 通过分布式一致性KV存储进行微服务的配置下发
  • 为一些业务提供选主和分布式锁服务
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这