java框架之SpringCloud(1)-微服务及SpringCloud介绍
微服务概述
是什么
业界大牛 Martin Fowler 这样描述微服务:
参考【微服务(Microservices)-微服务原作者Martin Flower博客翻译】。
下面是关于上述博客中的部分重点总结:
- 就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style)。
- 但通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTFul API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
技术维度理解:
微服务的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。
微服务与微服务架构
微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭义的看,可以看做 Eclipse 里面的一个个微服务工程或 Module。
- 微服务架构是一种架构模式或架构风格,如上总结。
微服务优缺点
优点
- 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求。
- 开发简单、开发效率高,一个服务可能就是专一的只干一件事。
- 微服务能够被小团队单独开发,这个小团队是 2 到 5 人的开发人员组成。
- 微服务是松耦合的,是由功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务能使用不同的语言进行开发。
- 易于与第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如 Jenkins、Hudson、Bamboo。
- 微服务易于被一个开发人员理解、修改和维护,这样小团队更能关注自己的工作成果,无需通过合作也能体现价值。
- 微服务允许你利用融合最新技术。
- 微服务只是业务逻辑的代码,不会和 HTML、CSS 或其它 UI 组件混合。
- 每个微服务都可以有自己的存储能力,可以有自己的数据库,也可以有统一数据库。
缺点
- 开发人员要处理分布式系统的复杂性。
- 多服务运维难度,随着服务的增加,运维的压力也在增大。
- 系统部署依赖。
- 服务间通信成本。
- 数据的一致性。
- 系统集成测试。
- 性能监控。
微服务技术栈
| 微服务条目 | 落地技术 |
|---|---|
| 服务开发 | SpringBoot、Spring、SpringMVC |
| 服务管理与配置 | Netflix 公司的 Archaius、阿里的 Diamond 等 |
| 服务注册于发现 | Eureka、Consul、Zookeeper等 |
| 服务调用 | Rest、RPC、gRPC |
| 服务熔断器 | Hystrix、Envoy 等 |
| 负载均衡 | Ribbon、Nginx 等 |
| 服务接口调用 | Feign 等 |
| 消息队列 | Kafka、RabbitMQ、ActiveMQ 等 |
| 服务配置中心管理 | SpringCloudConfig、Chef 等 |
| 服务路由(API 网关) | Zull 等 |
| 服务监控 | Zabbix、Nagios、Metrics、Spectator 等 |
| 全链路追踪 | Zipkin、Brave、Dapper 等 |
| 服务部署 | Docker、OpenStack、Kubernetes 等 |
| 数据流操作开发包 | SpringCloud Stream(封装与 Redis、Rabbit、Kafka 等发送接收消息) |
| 事件消息总线 | Spring Cloud Bus |
使用SpringCloud的原因
选型依据
- 整体解决方案和框架成熟度
- 社区热度
- 可维护性
- 学习曲线
主流微服务架构
- 阿里 Dubbo、HSF
- 京东 JSF
- 新浪微博 Motan
- 当当网 Dubbox
微服务框架对比
| 功能点/服务框架 | Netflix/SpringCloud | Motan | gRPC | Thrift | Dubbo/DubboX |
|---|---|---|---|---|---|
| 功能定位 | 完整的微服务框架 | RPC 框架,但整合了 ZK 或 Consul,实现集群环境的基本的服务注册/发现 | RPC 框架 | RPC 框架 | 服务框架 |
| 支持 Rest | 是,Ribbon 支持多种可插拔的序列化选择 | 否 | 否 | 否 | 否 |
| 支持 RPC | 否 | 是(Hession2) | 是 | 是 | 是 |
| 支持多语言 | 是 | 否 | 是 | 是 | 否 |
| 服务注册/发现 | 是(Eureka),Eureka 服务注册表,Karyon 服务端框架支持服务自注册和健康检查 | 是(Zookeeper/Consul) | 否 | 否 | 是 |
| 负载均衡 | 是(服务端 Zuul + 客户端 Ribbon)。Zuul:服务、动态路由、云端负载均衡;Eureka:针对中间层服务器 | 是(客户端) | 否 | 否 | 是(客户端) |
| 配置服务 | Netflix Archaius,SpringCloud Config Server 集中配置 | 是(Zookeeper 提供) | 否 | 否 | 否 |
| 服务调用链监控 | 是(Zuul),Zuul 提供边缘服务,API 网关 | 否 | 否 | 否 | 否 |
| 高可用/容错 | 是(服务端 Hystrix + 客户端 Ribbon) | 是(客户端) | 否 | 否 | 是(客户端) |
| 典型应用案例 | Netflix | Sina | |||
| 社区活跃程度 | 高 | 一般 | 高 | 一般 | 一般 |
| 文档丰富度 | 高 | 一般 | 一般 | 一般 | 高 |
| 其它 | SpringCloud Bus 为我们的应用程序带来了更多管理端点 | 支持降级 | Netflix 内部在开发继承 gRPC | IDL 定义 | 实践的公司比较多 |
SpringCloud介绍
概述
在 Spring 官网是这样描述 SpringCloud 的:
COORDINATE ANYTHING: DISTRIBUTED SYSTEMS SIMPLIFIED
Building distributed systems doesn't need to be complex and error-prone. Spring Cloud offers a simple and accessible programming model to the most common distributed system patterns, helping developers build resilient, reliable, and coordinated applications. Spring Cloud is built on top of Spring Boot, making it easy for developers to get started and become productive quickly.
协调一切:简化分布式系统
没有复杂和出错地构建分布式系统。Spring Cloud 为最常见的分布式系统模式提供了一种简单易用的编程模型,可帮助开发人员构建弹性,可靠和协调的应用程序。SpringCloud 构建于 SpringBoot 之上,使开发人员可以轻松入门并快速提高工作效率。
SpringCloud,基于 SpringBoot 提供了一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件,除了基于 NetFlix 的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
SpringCloud 利用 SpringBoot 的开发便利性巧妙地简化了分布式系统基础设施的开发,SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等,它们都可以用 SpringBoot 的开发风格做到一键启动和部署。
SpringBoot 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 SpringBoot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
总结上述,SpringCloud 就是分布式微服务架构下的额一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶。
SpringCloud VS SpringBoot
SpringBoot 专注于快速方便的开发单个个体微服务,可以离开 SpringCloud 独立使用开发项目。
SpringCloud 是关注全局的微服务协调整理治理框架,它将 SpringBoot 开发的一个个单体微服务整理并管理起来,为各个微服务之间提供配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。SpringCloud 离不开 SpringBoot,属于依赖的关系。
总结上述:SpringBoot 专注于快速、方便的开发单个微服务个体,而 SpringCloud 是关注全局的服务治理框架。
SpringCloud VS Dubbo
| Dubbo | SpringCloud | |
|---|---|---|
| 服务注册中心 | Zookeeper | SpringCloud Netflix Eureka |
| 服务调用方式 | RPC | REST API |
| 服务监控 | Dubbo-monitor | SpringBoot Admin |
| 断路器 | 不完善 | SpringCloud Netflix Hystrix |
| 服务网关 | 无 | SpringCloud Netflix Zuul |
| 分布式配置 | 无 | SpringCloud Config |
| 服务跟踪 | 无 | SpringCloud Sleuth |
| 消息总线 | 无 | SpringCloud Bus |
| 数据流 | 无 | SpringCloud Stream |
| 批量任务 | 无 | SpringCloud Task |
| ... | ... | ... |
最大区别:SpringCloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。
严格来说,这两种方式各有优劣。虽然从一定程度上来说,SpringCloud 牺牲了服务调用的性能,但也避免了上面提到的原生 RPC 带来的问题。而且 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。
很明显,SpringCloud 的功能比 Dubbo 更加强大,涵盖面更广,而且作为 Spring 的拳头项目,它也能够与 SpringFramework、SpringBoot、SpringData、SpringBatch 等其它 Spring 项目完美融合,这些对于微服务而言是至关重要的。使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们选择的自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 SpringCloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要使用非原装组件以外的东西,就需要对其基础底层有足够的了解。
社区支持和更新力度:
最为重要的是,Dubbo 停止了 5 年左右的更新,虽然 2017 年 7 月重启了。对于技术发展的新需求,需要由开发者自行脱战升级(比如当当网弄出了DubboX),这对于很多想要采用微服务架构的中小软件组织,显然是不太合适的,中小公司没有这么强大的技术能力去修改 Dubbo 源码及周边的一整套解决方案。
下面是 Dubbo 重启维护开发的主要负责人之一刘军对 Dubbo 及 SpringCloud 的关系阐述:
刘军,阿里巴巴中间件高级研发工程师,主导了 Dubbo 重启维护后的几个发版计划,专注于高性能 RPC 框架和微服务相关领域。层负责网易考拉 RPC 框架的研发及指导在内部使用,参与了服务治理平台、分布式跟踪系统、分布式一致性框架等从无到有的设计与开发过程。
问:目前 Dubbo 被拿来比较的最多的就是 SpringCloud,您怎么看待二者的关系,业务上是否有所冲突?
答:关于 Dubbo 和 SpringCloud 间的关系,我们在开源中国年终盛典的 Dubbo 分享中也作了简单阐述,首先要明确的一点是 Dubbo 和 SpringCloud 并不是完全的竞争关系,两者所解决的问题域并不一样:Dubbo 的定位始终是一款 RPC 框架,而 SpringCloud 的目标是微服务架构下的一站式解决方案。如果非要比较的话,我觉得 Dubbo 可以类比到 Netflix OSS 技术栈,而 SpringCloud 继承了 Netflix OSS 作为分布式服务治理解决方案,但除此之外 SpringCloud 还提供了包括 config、stream、security、sleuth 等等分不是问题解决方案。当前由于 RPC 协议、注册中心元数据不匹配等问题,在面临微服务基础框架选型时 Dubbo 与 SpringCloud 是只能二选一,这也是为什么大家总是拿 Dubbo 和 SpringCloud 做对比的原因之一。Dubbo 之后会积极寻求适配到 SpringCloud 生态,比如作为 SpringCloud 的二进制通信方案来发挥 Dubbo 的性能优势,或者 Dubbo 通过模块化以及对 http 的支持适配到 SpringCloud。
SpringCloud相关资料及社区
- 官网:https://spring.io/projects/spring-cloud
- 官方文档:https://cloud.spring.io/spring-cloud-static/Dalston.SR5/single/spring-cloud.html
- 官方文档中文版:https://springcloud.cc/spring-cloud-dalston.html
- SpringCloud Netflix 中文文档:https://springcloud.cc/spring-cloud-netflix.html
- SpringCloud 中国社区:http://springcloud.cn/
- SpringCloud 中文网:https://springcloud.cc/
java框架之SpringCloud(1)-微服务及SpringCloud介绍的更多相关文章
- 基于Spring-Cloud的微服务框架设计
基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍
- 微服务之SpringCloud基础
SpringCloud微服务基础 微服务架构--SpringCloud网站架构模式 单点应用/分布式系统面向于服务架构(SOA) /微服务架构web项目三层架构1.控制层2.业务逻辑层3.数据访问层传 ...
- 微服务之SpringCloud实战(二):SpringCloud Eureka服务治理
服务治理 SpringCloud Eureka是SpringCloud Netflix微服务套件的一部分,它基于Netflix Eureka做了二次封装,主要完成微服务的服务治理功能,SpringCl ...
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- 微服务、SpringCloud、k8s、Istio杂谈
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- Java生鲜电商平台-微服务入门与服务的拆分架构实战
Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...
- 用SpringCloud进行微服务架构演进
在<架构师必须要知道的阿里的中台战略与微服务> 中已经阐明选择SpringCloud进行微服务架构实现中台战略,因此下面介绍SpringCloud的一些内容,SpringCloud已经出来 ...
- SpringCloud学习--微服务架构
目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...
- SpringCloud与微服务系列专栏
一. 前置知识 学习SpringCloud之前需要具备和掌握如下框架和工具的使用:SpringMVC,Spring,Spring Boot,Mybatis,Maven,Git. SpringCloud ...
随机推荐
- [k8s]k8s的控制层kubelet+docker配合调度机制(k8架构)
意外停掉一台node的kubelet,发现调度有问题,研究了下调度的细节 k8s架构 控制层- kubelet(配合节点docker工作) 数据层- kube-proxy 逻辑图: object 参考 ...
- 搭建hbase1.2.5完全分布式集群
简介 有一段时间,没写博客了,因为公司开发分布式调用链追踪系统,用到hbase,在这里记录一下搭建过程 1.集群如下: ip 主机名 角色 192.168.6.130 node1.jacky.com ...
- ubuntu 使用旧式Gnome风格的菜单
sudo apt-add-repository ppa:diesch/testing sudo apt-get update sudo apt-get install classicmenu-indi ...
- Vue:生命周期
一.什么是vue的生命周期 Vue中的生命周期是指组件从创建到销毁的一系列过程.看下面这张官方文档的图: 从图片中可以看出Vue的整个生命周期包括8个状态,按照先后顺序分别为: beforeCreat ...
- caffe项目工程化封装FRCNN
各种坑!!想要做好,一定要自己一步步试,下载别人的总会出现各种问题. 步骤如下:(可以把这些文件打包在一个文件加下,分两个文件libs,include,一定要是自己的文件) 1 首先是配置caffe的 ...
- centos图形界面,vncserver
yum -y groupinstall "Server with GUI" RHEL7 安装图形界面1. 以root角色运行以下命令来安装TigerVNC server yum i ...
- SunRain
系统学习了半年java 开始业务攻坚 学习占缓 拼凑一个前后端分离的小项目 慢慢优化 https://gitee.com/fleam/SunRain.git
- 在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。
事件模式的实现步骤: 开发事件对象(事件发送者)——接口——接口实现类——设置监听对象 一定要理解透彻Gril.java程序. 重点:学会处理对一个事件源有多个事件的监听器(在发送消息时监听器收到 ...
- 怎样写一个PC端使用的操盘手软件(用来买卖股票,查看报表,行情)
我们想写一个操盘手软件,对于操盘而言,首先是快,然后是资料尽可能丰富,最好能看到行情,报表什么的.只是windows上写软件看似基础,实际上都不怎么好弄,用C++开发确实可以实现所有功能,估计光研发费 ...
- [原创]Fashion汽车定位器拆解
随着共享单车的爆发增长,定位方案被彻底激活.当下主流的共享单车都采用了MTK2503的方案(后续再详细分解),本文针对某商城热卖的汽车定位器进行拆解分析. 第一部分,定位器外观. 第二部分,拆解开壳, ...
