目前大家都在说微服务,其实微服务不是一个名字,是一个架构的概念,大家现在使用的基于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重要组件的使用,逐渐搭建出一个微服务项目,敬请期待~
如果不正确的地方,欢迎大家留言指出,共同进步~