微服务架构精选合集:SpringCloud+Dubbox+SpringBoot+Dock

1.什么是微服务

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务",

微,狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。

2. 微服务由来

微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

3. 为什么需要微服务?

在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。

3.1 早期的单体架构带来的问题

单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它暴露出来的问题也越来越多,主要有以下几点:

3.1.1.复杂性逐渐变高:比如有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题。

3.1.2.技术债务逐渐上升:公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。

3.1.3.部署速度逐渐变慢:这个就很好理解了,单体架构模块非常多,代码量非常庞大,导致部署项目所花费的时间越来越多,曾经有的项目启动就要一二十分钟,这是多么恐怖的事情啊,启动几次项目一天的时间就过去了,留给开发者开发的时间就非常少了。

3.1.4.阻碍技术创新:比如以前的某个项目使用struts2写的,由于各个模块之间有着千丝万缕的联系,代码量大,逻辑不够清楚,如果现在想用spring mvc来重构这个项目将是非常困难的,付出的成本将非常大,所以更多的时候公司不得不硬着头皮继续使用老的struts架构,这就阻碍了技术的创新。

3.1.5.无法按需伸缩:比如说电影模块是CPU密集型的模块,而订单模块是IO密集型的模块,假如我们要提升订单模块的性能,比如加大内存、增加硬盘,但是由于所有的模块都在一个架构下,因此我们在扩展订单模块的性能时不得不考虑其它模块的因素,因为我们不能因为扩展某个模块的性能而损害其它模块的性能,从而无法按需进行伸缩。

3.2 微服务与单体架构区别

单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。

单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。

单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

3.3 微服务与SOA区别

微服务,从本质意义上看,还是 SOA 架构。但内涵有所不同,微服务并不绑定某种特殊的技术,在一个微服务的系统中,可以有 Java 编写的服务,也可以有 Python编写的服务,他们是靠Restful架构风格统一成一个系统的。所以微服务本身与具体技术实现无关,扩展性强。

4. 微服务本质

微服务,关键其实不仅仅是微服务本身,而是系统要提供一套基础的架构,这种架构使得微服务可以独立的部署、运行、升级,不仅如此,这个系统架构还让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。这种所谓的“统一的整体”表现出来的是统一风格的界面,统一的权限管理,统一的安全策略,统一的上线过程,统一的日志和审计方法,统一的调度方式,统一的访问入口等等。

微服务的目的是有效的拆分应用,实现敏捷开发和部署 。

微服务提倡的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口,在一个团队内全栈,让团队自治,原因就是因为如果团队按照这样的方式组建,将沟通的成本维持在系统内部,每个子系统就会更加内聚,彼此的依赖耦合能变弱,跨系统的沟通成本也就能降低。

5. 什么样的项目适合微服务

微服务可以按照业务功能本身的独立性来划分,如果系统提供的业务是非常底层的,如:操作系统内核、存储系统、网络系统、数据库系统等等,这类系统都偏底层,功能和功能之间有着紧密的配合关系,如果强制拆分为较小的服务单元,会让集成工作量急剧上升,并且这种人为的切割无法带来业务上的真正的隔离,所以无法做到独立部署和运行,也就不适合做成微服务了。

能不能做成微服务,取决于四个要素:

小:微服务体积小,2 pizza 团队。

独:能够独立的部署和运行。

轻:使用轻量级的通信机制和架构。

松:为服务之间是松耦合的。

6. 微服务折分与设计

从单体式结构转向微服务架构中会持续碰到服务边界划分的问题:比如,我们有user 服务来提供用户的基础信息,那么用户的头像和图片等是应该单独划分为一个新的service更好还是应该合并到user服务里呢?如果服务的粒度划分的过粗,那就回到了单体式的老路;如果过细,那服务间调用的开销就变得不可忽视了,管理难度也会指数级增加。目前为止还没有一个可以称之为服务边界划分的标准,只能根据不同的业务系统加以调节。

拆分的大原则是当一块业务不依赖或极少依赖其它服务,有独立的业务语义,为超过2个的其他服务或客户端提供数据,那么它就应该被拆分成一个独立的服务模块。

6.1 微服务设计原则

单一职责原则:意思是每个微服务只需要实现自己的业务逻辑就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。

服务自治原则:意思是每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。

轻量级通信原则:首先是通信的语言非常的轻量,第二,该通信方式需要是跨语言、跨平台的,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。

接口明确原则:由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活,从而尽量避免其它模块也做调整。

7. 微服务优势与缺点

7.1 特性

每个微服务可独立运行在自己的进程里;

一系列独立运行的微服务共同构建起了整个系统;

每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理,用户管理等;

微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。

7.2 特点

易于开发和维护:由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。

启动较快:这是相对单个微服务来讲的,相比于启动单体架构的整个项目,启动某个模块的服务速度明显是要快很多的。

局部修改容易部署:在开发中发现了一个问题,如果是单体架构的话,我们就需要重新发布并启动整个项目,非常耗时间,但是微服务则不同,哪个模块出现了bug我们只需要解决那个模块的bug就可以了,解决完bug之后,我们只需要重启这个模块的服务即可,部署相对简单,不必重启整个项目从而大大节约时间。

技术栈不受限:比如订单微服务和电影微服务原来都是用java写的,现在我们想把电影微服务改成nodeJs技术,这是完全可以的,而且由于所关注的只是电影的逻辑而已,因此技术更换的成本也就会少很多。

按需伸缩:我们上面说了单体架构在想扩展某个模块的性能时不得不考虑到其它模块的性能会不会受影响,对于我们微服务来讲,完全不是问题,电影模块通过什么方式来提升性能不必考虑其它模块的情况。

7.3 缺点

运维要求较高:对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。

分布式的复杂性:对于单体架构来讲,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。

接口调整成本高:比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。

重复劳动:对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。

限于平台篇幅原因,同时也为了大家更好的阅读,微服务相关的资料及面试资料,笔者已经整理好了,感兴趣的朋友可以帮忙转发文章后,关注私信回复【学习】来免费获取

Spring Cloud 微服务实战

基础知识

主要包括了什么是微服务架构、与单体系统的区别、为什么选择Spring Cloud、什么是Spring Cloud

微服务构建(Spring Boot)

主要包含了:框架简介、快速入门、项目构建与解析、实现RESTfulAPI、配置详解、自定义参数、参数引用、命令行参数、多环境配置、加载顺序、监控与管理、初识actuator、原生端点。

服务治理(Spring Cloud Eureka)

主要内容包括:服务治理、Netflix Eureka、注册服务提供者、高可用注册中心、服务发现与消费、Eureka详解、服务治理机制、源码分析、配置详解、服务注册类配置、服务实例类配置、跨平台支持。

客户端负载均衡(Spring Cloud Ribbon)

主要内容包括:客户端负载均衡、RestTemplate 详解、GET请求、POST请求、PUT请求、DELETE请求、源码分析、负载均衡器、负载均衡策略、配置详解、自动化配置、Camden版本对RibbonClient配置的优化、参数配置、与Eureka结合、重试机制。

服务容错保护(Spring Cloud Hystrix)

主要内容包括:快速入门、原理分析、工作流程、断路器原理、依赖隔离、使用详解、创建请求命令、定义服务降级、异常处理、命令名称、 分组以及线程池划分、请求缓存、请求合并、属性详解、Command属性、collapser属性、thread Pool属性、Hystrix仪表盘、Turbine集群监控、构建监控聚合服务、与消息代理结合。

声明式服务调用:快速入门、继承特性、参数绑定、Ribbon配置、全局配置、指定服务配置、重试机制、Hystrix配置、全局配置、禁用Hystrix、指定命令配置、服务降级配置、其他配置、日志配置。

API网关服务(Spring Cloud Zuul)

快速入门、构建网关、请求路由、请求过滤、路由详解、传统路由配置、服务路由配置、服务路由的默认规则、自定义路由映射规则、路径匹配、路由前缀、本地跳转、Cookie与头信息、Hystrix 和 Ribbon 支持、过滤器详解、过滤器、请求生命周期、核心过滤器、异常处理、禁用过滤器、动态加载、动态路由、动态过滤器。

分布式配置中心:快速入门、构建配置中心、配置规则详解、客户端配置映射、服务端详解、基础架构、Git配置仓库、SVN配置仓库、本地仓库、本地文件系统、健康监测、属性覆盖、安全保护、加密解密、高可用配置、客户端详解、服务化配置中心、失败快速响应与重试、获取远程配置、动态刷新配置。

消息总线:消息代理、RabbitMQ实现消息总线、基本概念、安装与使用、快速入门、整合Spring Cloud Bus、原理分析、指定刷新范围、架构优化、RabbitMQ配置、Kafka实现消息总线、Kafka简介、快速入门、整合 Spring Cloud Bus、Kafka配置、深入理解、源码分析、其他消息代理的支持。

消息驱动的微服务:快速入门、核心概念、绑定器、发布-订阅模式、消费组、消息分区、使用详解、开启绑定功能、绑定消息通道、消息生产与消费、响应式编程、消费组与消息分区、消息类型、绑定器详解、绑定器SPI、自动化配置、多绑定器配置、RabbitMQ与Kafka绑定器、配置详解、基础配置、绑定通道配置、绑定器配置。

分布式服务跟踪:快速入门、准备工作、实现跟踪、跟踪原理、抽样收集、与Logstash整合、与Zipkin整合、HTTP收集、消息中间件收集、收集原理、数据存储、API接口。

由于篇幅限制,笔者只截取了部分内容,感兴趣的朋友可以帮忙转发文章后,关注私信回复【学习】来免费获取

微服务实战:Dubbox+Spring Boot+Docker

全部评论

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务