spring cloud 微服务
微服务更多干货spring cloud 微服务spring cloud 知识点服务发现与服务注册定制Rabbon客户端负载均衡策略Spring Cloud Feign使用1SpringCloud Feign使用二SpringCloud Hystrix 实现SpringCloud超时机制、断路器模式简介Spring Cloud Eureka HA 高可用SpringCloud TurbineSpri
·
微服务
更多干货
- spring cloud 微服务
- spring cloud 知识点
- 服务发现与服务注册
- 定制Rabbon客户端负载均衡策略
- Spring Cloud Feign使用1
- SpringCloud Feign使用二
- SpringCloud Hystrix 实现
- SpringCloud超时机制、断路器模式简介
- Spring Cloud Eureka HA 高可用
- SpringCloud Turbine
- SpringCloud zuul 网关 集成
- SpringCloud Conf 搭建配置中心
- spring cloud- 阿波罗 apllo 本地开发环境
- SpringCloud Conf 配置中心 属性加解密之对称加密
- Spring Cloud 配置中心 认证和高可用
- 微服务什么?
- 微服务解决了什么问题?
- 微服务有什么特点?
单体架构是什么
- 一个归档包包含了应用所有功能的应用程序, 我们通常称之为单体应用。
- 架构单体应用的架构风格, 我们称之为单体架构, 这是一种比较传统的架构风格。
单体架构存在的缺点
复杂性逐渐变高
- 以一个百万行级别的单体应用为例,整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,混乱地堆砌在一起……整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。
技术债务逐渐上升
- 随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,在单体应用中这种思想更甚。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。
部署频率低
- 随着代码的增多,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响的范围大、风险高,这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率比较高。
扩展能力受限
- 单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,我们不得不在硬件的选择上做出妥协。
阻碍技术创新
- 单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和框架,想要引入新的框架或技术平台会非常困难。例如,一个使用Struts 2构建的、100万行代码的单体应用,如果想要换用Spring MVC,切换成本无疑是非常高的。
无法按需伸缩
架构的演进
- 单体架构
- SOA
- 微服务
什么是微服务
- Martin Fowler:简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。
微服务具备的特性
- 每个微服务可独立运行在自己的进程里
- 一系列独立运行的微服务共同构建起了整个系统
- 每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理、用户管理等
- 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API或者RPC的方式进行调用
- 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API进行调用;
- 可以使用不同的语言与数据存储技术;
- 全自动的部署机制。
微服务优点
易于开发和维护
- 一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对是比较简单的。而整个应用是由若干个微服务构建而成的,所以整个应用也会维持在可控状态。
启动较快
- 单个微服务代码量较少,所以启动会比较快。
局部修改容易部署
- 单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
技术栈不受限
- 在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,我们可以使用Neo4J;甚至可以根据需要,部分微服务使用Java开发,部分微服务使用NodeJS进行开发。
按需伸缩
- 我们可以根据需求,实现细粒度的扩展。例如:系统中的某个微服务遇到了瓶颈,我们可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点。
微服务带来的挑战
运维要求较高
- 更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行;而在微服务中,需要保证几十甚至几百个服务的正常运行与协作,这给项目的运维带来了很大的挑战。
分布式的复杂性
- 使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都给我们带来了很大的挑战。
接口调整成本高
- 微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
重复劳动
- 很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。
微服务设计原则
- 单一职责原则
- 服务自治原则:服务是实体,它们独立地配置、更新和管理
- 轻量级通信原则
- 接口明确原则:每个服务的对外接口应该明确定义,并尽量保持不变。
微服务开发框架浅谈
- Spring Cloud:http://projects.spring.io/spring-cloud
- Dubbo:http://dubbo.io
- Dropwizard:http://www.dropwizard.io
- Consl、etcd &etc.
更多推荐
已为社区贡献15条内容
所有评论(0)