博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot——SpringBoot、SpringClould、微服务
阅读量:3941 次
发布时间:2019-05-24

本文共 5548 字,大约阅读时间需要 18 分钟。

SpringBoot——SpringBoot、SpringClould、微服务

一、SpringBoot简介

1.回顾Spring如何简化开发

1.基于POJO的轻量级和最小侵入性编程;

2.通过依赖注入DI和面向接口编程实现松耦合
3.使用AOP面向切面编程实现声明式编程
4.通过切面和模版减少样式代码;

虽然使用Spring是可以简化Java开发,但是当我们的项目变得庞大的时候,项目整合开发需要配合各种各样的文件,慢慢变得不那么易用简单,违背了最初的理念,SpringBoot就由此诞生。

2.SpringBoot简介

SpringBoot是一个简化Spring开发的框架。 SpringBoot整合了很多优秀的框架,我们就不用去配置复杂的配置文件。通过简化配置去简化整个开发过程,只需要在Maven的pom.xml文件中导入相应的依赖就可以代替繁琐的配置,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使开发人员不用去注重繁琐的配置,而去专注于业务逻辑。在SpringBoot最重要的就是“约定大于配置”,他将这个理念展现的淋漓尽致。

3.SpringBoot的优点:

  • 它避免了编写大量的样板代码,注释和XML配置。
  • Spring Boot应用程序与其Spring生态系统(如Spring JDBC,Spring ORM,Spring
    Data,Spring Security等)集成非常容易。
  • 它遵循“自用默认配置”方法,开箱即用,提供各种默认配置来简化项目配置
  • 它提供嵌入式HTTP服务器,如Tomcat,以开发和测试Web应用程序非常容易。
  • 它提供了许多插件来开发和测试Spring启动应用程序非常容易使用构建工具,如Maven
  • 它提供了许多插件,以便与嵌入式和内存数据库工作非常容易。

4.SpringBoot,SpringCloud与微服务的关系

(1)SpringCloud 是什么?

SpringCloud 是基于SpringBoot提供了一套为微服务(microservices)解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开营组件做 高度抽象之外,还有一些选型中立了的开源组件.

SpringCloud 是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的结合体,俗称为微服务全家桶.

(2)SpringBoot和SpringCloud的关系和区别
  • 1.SpringBoot专注于方便的开发单个个体微服务
  • 2.SpringCloud是关注于全局的微服务协调治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来。为各个微服务之间提供配置管理,服务发现,断路器,路由,微代理,事件总线,决策竞选,分布式会话等集成服务.
  • 3.SpringBoot可以离开SpringCloud单独使用,而SpringCloud离不开SpringBoot

二、微服务

1.单体应用架构

说到微服务就不得不提起单体应用架构。在传统的单体应用架构中,我们将所有的服务都封装在一个应用中,把各种各样的不同的功能都放在一个war包内。这样做的好处时开发部署都比较简单,当需要扩展的时候,只需要将war包复制多份,然后放在多个服务器上,再做一个负载均衡就可以了。

但是问题就出来了,单体架构所有模块全部耦合在一起,代码量很大,维护起来非常困难,当我想要修改一个小地方的时候,我们就必须停掉整个服务器,然后重新打包,部署。总之是非常的麻烦,这完全不是我们想要的…

2.微服务架构与单体架构

在单体应用架构的时候,我们把每一个功能单元都放在一个应用里面。然后将整个应用部署服务器上,这样是有明显的弊端的。

那么微服务架构又是怎样的呢?微服务架构就是打破了之前的单体应用架构,将每个功能单元独立出来,把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。

微服务架构与单体架构的区别

  • 单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
  • 单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
  • 单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

3.微服务优势与缺点(转)

微服务的特性

  • 每个微服务可独立运行在自己的进程里
  • 一系列独立运行的微服务共同构建起了整个系统
  • 每个服务都是一个独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理,用户管理等
  • 微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。

微服务的优势

  • 易于开发和维护:由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。
  • 启动较快:这是相对单个微服务来讲的,相比于启动单体架构的整个项目,启动某个模块的服务速度明显是要快很多的。
  • 局部修改容易部署:在开发中发现了一个问题,如果是单体架构的话,我们就需要重新发布并启动整个项目,非常耗时间,但是微服务则不同,哪个模块出现了bug我们只需要解决那个模块的bug就可以了,解决完bug之后,我们只需要重启这个模块的服务即可,部署相对简单,不必重启整个项目从而大大节约时间。
  • 技术栈不受限:比如订单微服务和电影微服务原来都是用java写的,现在我们想把电影微服务改成nodeJs技术,这是完全可以的,而且由于所关注的只是电影的逻辑而已,因此技术更换的成本也就会少很多。
  • 按需伸缩:我们上面说了单体架构在想扩展某个模块的性能时不得不考虑到其它模块的性能会不会受影响,对于我们微服务来讲,完全不是问题,电影模块通过什么方式来提升性能不必考虑其它模块的情况。

微服务的缺点

  • 运维要求较高:对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。
  • 分布式的复杂性:对于单体架构来讲,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
  • 接口调整成本高:比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。
  • 重复劳动:对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。

三.微服务架构的问题(转)

1.这么多服务,客户端到底该如何去访问?(API Gateway,API网关)

传统的开发方式,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的一般都在独立的虚拟机上的 Java进程了。客户端UI如何访问他的?后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不符合我们拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销。还有一般微服务在系统内部,通常是无状态的,用户登录信息和权限管理最好有一个统一的地方维护管理(OAuth)。

所以,一般在后台N个服务和UI之间会有一个代理或者叫API Gateway,他的作用包括

  • 提供统一服务入口,让微服务对前台透明
  • 聚合后台的服务,节省流量,提升性能
  • 提供安全,过滤,流控等API管理功能

我的理解其实这个API Gateway可以有很多广义的实现办法,可以是一个软硬一体的盒子,也可以是一个简单的MVC框架,甚至是一个Node.js的服务端。他们最重要的作用是为前台(通常是移动应用)提供后台服务的聚合,提供一个统一的服务出口,解除他们之间的耦合,不过API Gateway也有可能成为单点故障点或者性能的瓶颈。

2.这么多服务,服务之间到底怎么通信?(服务调用)

因为所有的微服务都是独立的Java进程跑在独立的虚拟机上,所以服务间的通行就是IPC(inter process communication),已经有很多成熟的方案。现在基本最通用的有两种方式。这几种方式,展开来讲都可以写本书,而且大家一般都比较熟悉细节了, 就不展开讲了。

  • REST(JAX-RS,Spring Boot):表现层状态转换
  • RPC(Thrift, Dubbo):远程过程调用
  • 异步消息调用(Kafka, Notify)

同步消息调用:RESTful与RPC

一般同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。RESTful和RPC的比较也是一个很有意思的话题。一般REST基于HTTP,更容易实现,更容易被接受,服务端实现技术也更灵活些,各个语言都能支持,同时能跨客户端,对客户端没有特殊的要求,只要封装了HTTP的SDK就能调用,所以相对使用的广一些。RPC也有自己的优点,传输协议更高效,安全更可控,特别在一个公司内部,如果有统一个的开发规范和统一的服务框架时,他的开发效率优势更明显些。就看各自的技术积累实际条件,自己的选择了。

异步消息调用

而异步消息的方式在分布式系统中有特别广泛的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。不过需要付出的代价是一致性的减弱,需要接受数据最终一致性;还有就是后台服务一般要 实现幂等性,因为消息发送出于性能的考虑一般会有重复(保证消息的被收到且仅收到一次对性能是很大的考验);最后就是必须引入一个独立的broker,如果公司内部没有技术积累,对broker分布式管理也是一个很大的挑战。

3.这么多服务,服务到底该怎么去治理?(服务注册于发现)

在微服务架构中,一般每一个服务都是有多个拷贝,来做负载均衡。一个服务随时可能下线,也可能应对临时访问压力增加新的服务节点。服务之间如何相互感知?服务如何管理?这就是服务发现的问题了。一般有两类做法,也各有优缺点。基本都是通过zookeeper等类似技术做服务注册信息的分布式管理。当服务上线时,服务提供者将自己的服务信息注册到ZK(或类似框架),并通过心跳维持长链接,实时更新链接信息。服务调用者通过ZK寻址,根据可定制算法,找到一个服务,还可以将服务信息缓存在本地以提高性能。当服务下线时,ZK会发通知给服务客户端。

  • 客户端做:优点是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端要维护所有调用服务的地址,有技术难度,一般大公司都有成熟的内部框架支持,比如Dubbo。
  • 服务端做:优点是简单,所有服务对于前台调用方透明,一般在小公司在云服务上部署的应用采用的比较多。

4.如果服务挂了,该怎么办?

分布式最大的特性就是网络是不可靠的。通过微服务拆分能降低这个风险,不过如果没有特别的保障,结局肯定是噩梦。我们刚遇到一个线上故障就是一个很不起眼的SQL计数功能,在访问量上升时,导致数据库load彪高,影响了所在应用的性能,从而影响所有调用这个应用服务的前台应用。所以当我们的系统是由一系列的服务调用链组成的时候,我们必须确保任一环节出问题都不至于影响整体链路。相应的手段有很多:

  • 重试机制
  • 限流
  • 熔断机制
  • 负载均衡
  • 降级(本地缓存)
几套解决方案:

①Spring Cloud NetFilx,一站式解决方案(2018年年底,NetFilx宣布无限期停止维护)

  • Api网关:解决客户端到底该如何去访问的问题
  • Feign技术(Feign基于HttpCloent,HttpCloent基于Http):解决服务之间通信问题
  • 服务注册与发现,Eureka技术:解决服务治理问题
  • 熔断机制,Hystrix技术:解决服务器挂了的问题

②Apache Dubbo zookeeper(Apache的顶级项目,还不完善)

  • API网关:没有!要么找第三方组件,要么自己实现
  • Dubbo:一个高性能的基于Java实现的RPC(远程服务调用)框架
  • 服务注册与发现,zookeeper:动物园管理者(管理Hadoop,Hive…)
  • 熔断机制:没有,借助于NetFilx的熔断机制Hystrix

③SpringClould Alibaba,一站式解决方案

④服务网格

目前,又提出了一种方案,服务网格:下一代微服务标准,Server Mesh
代表解决方案:istio(未来可能需要研究)

万变不离其宗,主要解决以下问题:

  • 1.API网关,服务路由
  • 2.HTTP,RPC框架,异步调用
  • 3.服务注册与发现,高可用
  • 4.熔断机制,服务降级

为什么要解决这些问题?

  • 网络是不可靠的!

转载地址:http://ctiwi.baihongyu.com/

你可能感兴趣的文章
矩阵积分
查看>>
optimization on macOS
查看>>
Template-Based 3D Model Fitting Using Dual-Domain Relaxation
查看>>
install libfreenect2 on ubuntu 16.04
查看>>
how to use automake to build files
查看>>
using matlab drawing line graph for latex
查看>>
How package finding works
查看>>
build opencv3.3.0 with VTK8.0, CUDA9.0 on ubuntu9.0
查看>>
how to compile kinfu_remake with cuda 9.0 opencv2.4.13.4
查看>>
qtcreator4.4.1中cmake 与cmake3.5.1本身generate出来的setting是有区别的解决方法
查看>>
ubuntu下解决csdn网页打不开的问题
查看>>
MySQL server has gone away 问题的解决方法
查看>>
MySQL十大优化技巧
查看>>
PHP中文件读写操作
查看>>
php开发常识b_01
查看>>
PHP单例模式
查看>>
PHP项目设计
查看>>
memcache的安装及管理
查看>>
git 传输
查看>>
创建新项目
查看>>