我们为什么需要微服务
微服务技术是为了应对随着程序规模的扩大和功能的增多,代码的管理难度、可维护性、鲁棒性不断下降而产生的一个因素,其核心的技术就是通过将一个大的、耦合程度高的服务集合拆分成一个个具有独立功能的服务模块独立应用(即一个个Springboot应用),让每个服务之间进行相互通信和发现来进行服务之间的调用。在微服务架构中通常会包括以下的一些组件和中间件:
- 服务集群:服务集群是由一个个单独的服务应用组成的,是程序的核心和逻辑实现的地方,通过将大而广的服务集合拆分成一个个的单独服务,能够实现对项目的可扩展性。
- 注册中心:注册中心的主要功能是为服务之间的互相调用提供一个“广场”,即所有服务将自己注册到注册中心当中,当需要某个服务的时候,就到注册中心来查找自己所需要的服务,同时时刻保持和注册中心的联系(心跳检测机制),以确保自己时刻都是注册在注册中心当中,能够被其他服务所发现的。
当在集群中运行微服务的时候,多副本的服务实例能够使得程序的可靠性得到很大的提升,因为某个服务具有多个实例,即使一个服务因为某些原因没有注册在注册中心当中,其他相同的服务样本也会在注册中心中注册,从而使别的服务发现自己。 - 配置中心:当服务越来越多时,每一个服务都需要有一个配置文件,这对开发人员和运维人员来说都是不能接受的,过多的重复配置文件会导致维护修改十分困难,因此就有了配置中心的诞生,在配置中心存储了整个项目的所有配置文件,某个微服务需要的话只需要通过配置中心调取对应的配置文件即可,而不需要自己再重复写一遍。使用配置中心能够方便配置的修改和维护。
- 服务网关:服务网关的作用有点类似一个公司的前台,公司部门众多导致某个访客访问时不知道应该去哪,需要通过询问前台从而知道目的的地址,服务网关的作用类似,服务集群暴露的服务接口众多,用户可能不知道应该使用哪一个,这时就需要服务网关来做请求的路由或者负载均衡,让请求到达对应的服务。
- 消息队列:消息队列主要是为了减少消息串行调用带来的性能损耗和时间延迟,服务集群之间的调用需要到配置中心寻找对应的服务提供方,然后再调用服务提供方获取对应的结果,这将导致请求在服务间一层层的传递,会浪费很多时间。消息队列的出现是提供了一种异步的机制给服务调用,某个服务在收到请求后通过“消息”告诉自己所需要的服务开始工作,自己则直接返回结果。
- …
除上述之外,微服务架构还包括分布式缓存、分布式搜索、分布式日志服务等,结合 Jenkins、Docker、K8s 的持续集成/持续部署技术,构成了微服务的基本架构
认识微服务
服务架构演变
单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。优点主要有架构简单、部署成本低。但缺点在于耦合度高,打包时间编程,模块之间的边界越来越模糊,在拓展和修改代码的时候会导致其他模块受到影响
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。优点在于降低服务耦合,有利于服务升级拓展。
分布式架构要考虑的问题
- 服务拆分粒度如何
- 服务集群地址如何维护
- 服务之间如何实现远程调用
- 服务健康状态如何感知
微服务:经过良好架构设计的分布式架构方案,微服务的架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题。
认识微服务
SpringCloud 和阿里巴巴的 Dubbo 是国内比较知名的微服务框架。下面是三种微服务技术的对比
Dubbo | SpringCloud | SpringCloudAlibaba | |
---|---|---|---|
注册中心 | zookeeper、Redis | Eureka、Consul | Nacos、Eureka |
远程服务调用 | Dubbo协议(RPC) | Feign(http协议) | Dubbo、Feign |
配置中心 | 无 | SpringCloudConfig | SpringCloudConfig、Nacos |
服务网关 | 无 | SpringCloudGateway、Zuul | SpringCloudGateway、Zuul |
服务监控和保护 | dubbo-admin,功能弱 | Hystrix | Sentinel |
Spring Cloud
Spring Cloud 是目前国内使用最广泛的微服务框架,集成了各种微服务功能组件,并基于 SpringBoot 实现了这些组件的自动装配,从而提供了良好的开箱即用体验。Spring Cloud 提供的功能大致有以下的几点:
- 服务注册与发现:Eureka、Nacos、Consul
- 服务远程调用:OpenFeign、Dubbo
- 服务链路监控:Zipkin、Sleuth
- 统一配置管理:SpringCloudConfig、Nacos
- 统一网关路由:SpringCloudGateway、Zuul
- 流控、降级、保护:Hystix、Sentinel
SpringCloud于SpringBoot的兼容版本关系