一起来学spring Cloud | 第一章:spring Cloud 与Spring Boot
目前大家都在说微服务,其实微服务不是一个名字,是一个架构的概念,大家现在使用的基于RPC框架(dubbo、thrift等)架构其实也能算作一种微服务架构。
目前越来越多的公司开始使用微服务架构,所以在目前招聘java岗位时,有springcloud经验还是会占一点优势,今天young就和大家一起来学习Spring Cloud微服务框架。
本章,我们先解决新人都头疼的一个问题,spring Cloud 与spring Boot到底是什么关系????
一 、什么是spring Boot
在讲解什么是spring Boot之前,我们先可以思考一下,目前使用spring时,有没有感觉以下的两个问题经常被频繁的吐槽
1. 在过去的 Spring 发中,需要引入大量的 xml 文件。Spring 2.5 引入了包扫描,消除了显式的配置 Bean。 Spring 3.0 又引入了基于 JavaBean 的配置,这种方式可以取代 xml 文件。
尽管如此,在实际的开发中还是需要配置 xml 文件,例如配 SpringMVC 事务管理器、过滤器、切面等等。
2. 在项目的开发过程中,会引入大量的第三方依赖,选择依赖是一件不容易的事,解决依赖与依赖之间的冲突也很耗费精力。所以,在以前的Spring开发中,依赖管理也是一件棘手的事情。
结合上面Spring的两点瑕疵,我们在来总结一下,什么是SpringBoot:
1. Spring Boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装。所以,你以前可以用spring做的事情,现在用spring Boot都可以做。
2. Spring Boot是一种全新的编程规范,是一个服务于框架的框架,服务范围是简化配置文件和起步依赖,他的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件。
二 、什么是spring Cloud
1. Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案,它依赖于 Spring Boot ,有快速开发、持续交付和容易部署等特点。
2. Spring Cloud不像其他Spring子项目那样相对独立,它是一个拥有诸多子项目的大型综合项目。
三 、Spring Cloud与Spring Boot的对比
1. Spring Boot 是 Spring的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
2. Spring Boot专注于快速、方便集成的单个个体;Spring Cloud是关注全局的服务治理框架;
3. Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置;Spring Cloud很大的一部分是基于Spring Boot来实现。
4. Spring Boot可以离开Spring Cloud独立使用开发项目,但是SpringCloud离不开Spring Boot,属于依赖的关系。
四、Spring Cloud的常用组件
Spring Cloud 提供了开发分布式微服务系统的一些常用组件,例如服务注册和发现、配置中心、熔断器、 智能路由 、微代理、控制总线、全局锁、分布式会话等。
spring Cloud的子项目很多,但是目前在实际工作中,我们一般业务项目使用到的组件就是常规的几个,其它的一般开发用不到,做为新手,我们先熟悉常用且重要的几个。
接下来的这8个常用组件的描述来自(方志朋的《深入理解Spring Cloud 与微服务构建一书》)
(1)服务注册和发现组件 Eureka
利用 Eureka 组件可以很轻松地实现服务的注册和发现功能。 Eureka 组件提供了服务的健康监测,以及界面友好的 UI 。通过 Eureka 组件提供的 UI, Eureka 组件可以让开发人员随时了解服务单元的运行情况。
另外 Spring Cloud 也支持 Consul 和Zookeepe ,用于注册和发现服务。
(2)熔断组件 Hystrix
Hystrix是一个 熔断组件,它除了有一些基本的熔断器功能外,还能够实现服务降级、服务限流的功能。另外 Hystrix 提供了熔断器的健康监测,以及熔断器健康数据的 API 口。
Hystrix Dashboard 组件提供了单个服务熔断器的健康状态数据的界面展示功能,Hystrix Turbine 组件提供了多个服务的熔断器的健康状态数据的界面展示功能。
(3)负载均衡组件 Ribbon
Ribbon 是一个负载均衡组件,它通常和 Eureka 、Zuul、 RestTemplate、Feign 配合使用。Ribbon 和Zuul 配合,很容易做到负载均衡,将请求根据负载均衡策略分配到不同的服务实例中。
Ribbon和RestTemplate、Feign配合,在消费服务时能够做到负载均衡。
(4)路由网关 Zuul
路由网关 Zuul 有智能路由和过滤的功能。内部服务的 API 接口通过 Zuul 网关统一对外暴露,内部服务的 API 接口不直接暴露,防止了内部服务敏感信息对外暴露。在默认的情况下,Zuul和Ribbon相结合,能够做到负载均衡、智能路由。
Zuul过滤功能是通过拦截请求来实现的,可以对一些用户的角色和权限进行判断,起到安全验证的作用,同时也可以用于输出实时的请求曰志。
上述的4个组件都来自于 Netflix 的公司,称为 Spring Cloud Netflix。
(5)Spring Cloud Config
Spring Cloud Config 组件提供了配置文件统一管理的功能。Spring Cloud Config包括Server端和Client端,Server 端读取本地仓库或者远程仓库的配置文件,所有的Client 向Server读取配置信息,从而达到配置文件统一管理的目的。
通常情况下, Spring Cloud Config 和 Spring Cloud Bus 相互配合刷新指定 Client 或所有Client的配置文件。
(6) Spring Cloud Security
Spring Cloud Security 是对 Spring Security 组件的封装,Spring Cloud Security 向服务单元提供了用户验证和权限认证。一般来说,单独在微服务系统中使用 Spring Cloud Security 是很少见的,一般它会配合 Spring Security 0Auth2 组件一起使用, 通过搭建授权服务,验证 Token或者 JWT 这种形式对整个微服务系统进行安全验证。
(7)Spring Cloud Sleuth
Spring Cloud Sleuth 是一个分布式链路追踪组件,它封装了 Dapper Zipkin 和 Kibana 等组件,通过它可以知道服务之间的相互依赖关系,并实时观察链路的调用情况。
(8)Spring Cloud Stream
Spring Cloud Stream Spring Cloud 框架的数据流操作包,可以封装 RabbitMq 、ActiveMq 、Kafka 、Redis 等消息组件,利用 Spring Cloud Stream 可以实现消息的接收和发送。
五、微服务相比单体服务的优缺点
关于微服务的优缺点,我不想用官网模板或者书上说的一大堆,young我经历了从单体服务到微服务项目的过渡,我就从个人工作体会接地气的讲解一下微服务的优缺点。
优点:
1. 新人上手快:新人在参与新项目时,只需要下载需求相关模块的代码,了解这部分代码就行了,不需要关注整个项目的代码逻辑,可以减少上手时间。
2. 本地调试快:以前修改一个功能,整个项目启动,花费时间很长。现在只启动修改的单个模块,启动很快。(不知道有没有和我一样,以前本地启动一个复杂项目花费30s-60s,调试启动一次就能喝杯茶了)。
3. 开发进度加快:以前一个项目,多个人开发,你改的代码,影响我,我改的代码影响你,某个人改了错误代码提交,整个项目都启动不了。微服务不同功能模块,互不影响,你自己的锅自己背。
4. 跨语言合作: 同一个项目不同的功能模块可以使用不同语言开发,java,js,php,随心所欲。不同语言只需要提供 http 客户端,便可以实现跨语言调用。
5. 简单的分库: 同一个项目,不同模块连接不同的数据库,主要是配置简单。(我们项目就连接3个不同的mysql业务数据库,1个redis集群,1个mongo集群)。
6. 服务集群扩展容易 :现在springcloud做服务集群,节省资源,并且搭建速度快。比如项目中,资源服务功能模块压力大,运维只要快速copy一份配置,部署一台资源服务模块的服务就行了,其它功能服务模块不用管。
缺点:
1. 运维人员压力大: 单体应用以前运维同事只要监控个一个应用正常运行,而现在却需要保证几十甚至上百个应用运转正常,这是一个艰巨的任务。
2. 事务、异步、测试面临挑战:跨进程之间的事务、大量的异步处理、多个微服务之间的整体测试都需要有一整套的解决方案,而现在看起来,这些技术并没有成熟。
3. 服务分割难度大:对于一个项目,如何进行功能划分,哪些功能归属同一个服务模块,对架构师和设计人员的要求较高。
后面,我会以实际工作中的案例,逐步讲解springcloud重要组件的使用,逐渐搭建出一个微服务项目,敬请期待~
如果不正确的地方,欢迎大家留言指出,共同进步~
一起来学spring Cloud | 第一章:spring Cloud 与Spring Boot的更多相关文章
- Spring实战第一章学习笔记
Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...
- 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目
在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...
- 【第一章】 第一个spring boot程序
环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(j ...
- Spring 开发第一步(三)Spring与JDBC
<spring in action 3rd>中的前面4章讲解的是Spring的核心,也就是DI/IOC和AOP .从第5章开始是Spring在企业开发中的各个方面的应用.其实作为笔者从事的 ...
- (转)编写Spring的第一个案例并测试Spring的开发环境
http://blog.csdn.net/yerenyuan_pku/article/details/52832145 Spring4.2.5的开发环境搭建好了之后,我们来编写Spring的第一个案例 ...
- spring framework 第一章数据库管理(data access)
spring data access 的网址:https://docs.spring.io/spring/docs/current/spring-framework-reference/index.h ...
- Spring 开发第一步(四)Spring与JDBC事务
Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源.hibernate数据源.JPA数据源等等).在此基础上使用各种对应的Template来 ...
- 《快学Scala》第一章 基础
- 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)
本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1 ...
随机推荐
- 妙用this关键字
妙用this关键字 ## this关键字一般this关键字都是指的是对象的本身,在类的所有方法.构造器都可以拿到this引用,这是jvm"偷偷"帮我们传递进来的引用,指向调用方法对 ...
- Maven分模块以及打war包
我们如何进行模块化开发呢? 我们使用上面的例子进行演示,先进行合理的优化,我们希望dao和service作为通用的底层工具来使用,把它们合并成一个核心模块(core),build成core.jar,简 ...
- 佛祖镇楼,BUG避易
def FZZL(): print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") ...
- Pattern recognition and machine learning 疑难处汇总
不断更新ing......... p141 para 1. 当一个x对应的t值不止一个时,Gaussian nosie assumption就不合适了.因为Gaussian 是unimodal的,这意 ...
- spring+springmvc+mybatis构建系统
今天和大家分享的是spring+springmvc+mybatis搭建框架的例子,说到这里不得不说现在市面上一流大公司还有很多用这种架子,创业型公司大部分都用springboot集成的mvc+myba ...
- 【转】Sentry--错误日志收集
简介 Sentry是一个实时事件日志记录和汇集的日志平台,其专注于错误监控,以及提取一切事后处理所需的信息.他基于Django开发,目的在于帮助开发人员从散落在多个不同服务器上的日志文件里提取发掘异常 ...
- Scrapy爬虫框架第七讲【ITEM PIPELINE用法】
ITEM PIPELINE用法详解: ITEM PIPELINE作用: 清理HTML数据 验证爬取的数据(检查item包含某些字段) 去重(并丢弃)[预防数据去重,真正去重是在url,即请求阶段做] ...
- ES6-LET,变量提升,函数提升
1:let命令 ①类似var,但只在let所在代码块内有效 ②不存在变量提升 ③暂时性死区(TDZ)—有let命令时,在此命令前都没法使用此变量 ④不允许重复声明 ⑤ES6允许块级作用域任意嵌套 ⑥E ...
- app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印
在app的后台中,有时候为了标示版权,需要给图片加上水印. 在liunx中,IM4JAVA+GraphicsMagick是个高效处理图片的方案,图片的裁剪是使用了这个技术方案,为了减少不必要的开发成本 ...
- Visual Studio Code Tips
新项目要用到Visual Studio Code, 在使用的过程中有些tips, 记录下来以便查阅. 1. 自动保存代码 文件 => 自动保存 2. 帮助输入代码模式 扩展 => 安装HT ...