一.微服务
1.1 什么是微服务?
- 微服务是一种架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级HTTP交互(也可以通过轻量级的消息总线来通信,例如RabbitMQ和kafaka)
- 服务围绕业务功能拆分(数据库也是独立的)
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言,不同的存储技术
- 微服务是一个分布式系统
1.2 微服务的优势
- 按照业务拆分,服务的边界明确,将复杂的问题简单化。编码也是按照业务拆分,代码的可读性和扩展性增加。
- 微服务系统是分布式系统,服务与服务之间没有任何耦合。随着业务的增加,可以根据业务再拆分业务,具有极强的横向扩展能力。随着应用的用户量的增加,并发量的增加,可以将微服务集群化部署,从而增加系统的负载能力。总而言之,微服务系统的微服务单元具有很强额横向扩展能力。
- 服务与服务之间使用HTTP网络通信协议来通信,单个微服务内部高度耦合,服务于服务之间完全独立,无耦合。这使得微服务可以采用任何的开发语言和技术来实现。
- 微服务的每个服务单元是独立部署的,即独立运行在某个进程里。微服务的修改和部署对其他服务没有影响
- 微服务在CAP理论中采用的是AP架构,即具有高可用和分区容错的特点。高可用主要体现在系统7*24小时不间断的服务,它要求系统有大量的服务器集群,从而提高系统的负载能力。另外,分区容错也使得系统更加健壮。
1.3 微服务的劣势
- 分布式部署,调用的复杂性高:单体应用的时候,所有模块之前的调用都是在本地进行的,在微服务中,每个模块都是独立部署的,通过 HTTP 来进行通信,这当中会产生很多问题,比如网络问题、容错问题、调用关系等。
- 独立的数据库,分布式事务的挑战:每个微服务都有自己的数据库,这就是所谓的去中心化的数据管理。这种模式的优点在于不同的服务,可以选择适合自身业务的数据,比如订单服务可以用 MySQL、评论服务可以用 Mongodb、商品搜索服务可以用 Elasticsearch。缺点就是事务的问题了,目前最理想的解决方案就是柔性事务中的最终一致性。
- 测试难度的提升:服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了。这里要强调一点,就是 API 文档的管理尤为重要。
- 运维难度的提升:在采用传统的单体应用时,我们可能只需要关注一个 Tomcat 的集群、一个 MySQL 的集群就可以了,但这在微服务架构下是行不通的。当业务增加时,服务也将越来越多,服务的部署、监控将变得非常复杂,这个时候对于运维的要求就高了。
1.4 微服务应该具备的功能
- 服务的注册与发现
- 服务的负载均衡
- 服务的容错
- 服务网关
- 服务配置的统一配置
- 链路追踪
- 实时日志
- ...
二.Spring Cloud
2.1 简介
Spring Cloud是基于Spring Boot的。首要目标就是通过提供一系列开发组件和框架,帮助开发者迅速搭建一个分布式的微服务系统。Spring Cloud是通过包装其他技术框架来实现的。Spring Cloud提供了开发分布式微服务的一些常用组件。如下:
- Eureka:服务注册中心,用于服务管理
- Ribbon:基于客户端的负载均衡组件
- Hystrix:容错框架,能够防止服务的雪崩效应
- Feign:Web服务客户端,能够简化HTTP接口的调用
- Zuul:API网关,提供路由转发,请求过滤等功能
- Config:分布式配置管理
- Sleuth:服务追踪
- Stream:构建消息驱动的微服务应用程序的框架
- Bus:消息代理的集群消息总线
2.2 Spring Cloud组件升级说明
服务注册中心
- × Eureka
- √ Zookeeper
- √ Consul
- √ Nacos
服务调用
- √ Ribbon
- √ LoadBalancer
服务调用2
- × Feign
- √ OpenFeign
服务降级
- × Hystrix
- √ resilience4j
- √ sentienl
服务网关
- × Zuul
- ! Zuul2
- √ gateway
服务配置
- × Config
- √ Nacos
服务总线
- × Bus
- √ Nacos