微服务概述

简介: 本文对比单体应用与微服务架构,阐述微服务的定义、核心特征及优缺点。微服务通过服务拆分、独立部署、轻量通信实现高内聚、低耦合,提升系统可维护性与扩展性,但也带来运维复杂、分布式事务等挑战,并介绍基于SpringCloud的技术实现方案。

1.单体应用与微服务架构区别

世界土物金技术社区


如上图左侧为单体应用架构。在传统单体应用中,所有功能模块都在一个工程中编码、部署,即使是集群部署,也只是单体应用的水平复制。
如上图右侧为微服务架构。在微服务架构的项目中,每个应用会按照领域模型划分进行业务、功能聚合,由此拆分后聚合的应用往往:模型高度统一、职责清晰且收敛、应用与应用(领域与领域)之间边界清晰,并且提升了每个应用的独立性、扩展性。
除了应用拆分维度,微服务架构也保证了每个应用可以使用独立语言开发、独立数据存储技术,只要能保持对外统一交互语言即可,存储模型差异如下:

988

88号

MONOLITH-SINGLE DATABASE

MICROSERVICES-APPLICATION DATABASES

电梯上安全融字让区


见上图,应用拆分之后对应每个应用会独立、或共享一个数据库,数据库的拆分维度除了要考虑领域边界,还要更多的考虑每个数据库的QPS、TPS,避免高频写操作集中在一个DB,由此起到给数据库减压的功效。
基于上述分析,单体架构存在的问题主要集中在:功能混淆、边界模糊、维护成本高、可靠性差等角度,对于后续应用的升级、扩展同样存在瓶颈。因此随着互联网的发展,我们必须解决上述问题,而微服务就是这样一种架构模式。
2.什么是微服务
自2014年起,微服务架构由Martin Fowler、Adrain Cockcroft、Neal Ford等人接力进行介绍、完善、演进、实践后,一直维持着较高的热度直到现在,内容如下:
微服务架构是一种架构模式,它提倡将原本独立的单体应用,拆分成多个小型服务。这些小型服务各自独立运行,服务与服务间的通信采用轻量级通信机制(一般是基于HTTP协议的RESTful API),达到互相协调、互相配合的目的。被拆分后的服务都围绕着具体的业务进行构建,每个服务都能独立地进行开发、部署、扩展。由于相互独立,且采用轻量级通信机制,各个小型服务也能够使用不同的语言开发,也可以使用不同的数据存储技术。
微服务是一套经过漫长的架构演进、良好架构设计的分布式架构方案。从传统单体应用到分布式独立应用,从应用数据服务到引入缓存优化性能,从反向代理和CDN加速网站响应等等,技术架构不断演进的过程中,逐步出现前后端分离,数据读写分离,云原生、DDD领域驱动,最终孵化出如SpringCloud、SpringCloud Alibaba等成熟稳定的微服务架构方案。
微服务其主要特征:
服务自治:团队独立、技术独立、数据独立、部署独立
面向服务:微服务对外暴露业务接口,如RESTful API调用
单一职责:每个应用领域边界清晰,功能职责单一,无重复工作
3.微服务优缺点
3.1 优点
①易于开发维护
微服务基于领域模型拆分的应用,其内部模型高度统一,功能相对内聚,开发人员只需要对固定模型进行领域业务接口封装即可。
②技术栈开放
微服务因独立部署、独立开发,因此开发团队可以根据资深团队特点进行技术选型。如团队擅长关系型数据库则MySQL,擅长图形计算则Neo4j。
③升级错误隔离
A技术专项升级因单独部署,不再影响整个分布式架构中全部功能,只影响有接口交互的部分应用,而这种应用也可以通过灰度、服务降级、服务熔断的方式兼容和处理,不会因一个错误导致整个应用瘫痪。
3.2 缺点
①运维成本高
更多的服务意味着更多的运维投入,传统应用中只有一个应用,而为服务中,需要保障几十、上百个服务的正常运行和协作。
②调用链路复杂
微服务架构中,不可避免的会出现A服务依赖B服务,B服务依赖C服务,C继续依赖D服务的场景,一旦A调用异常,排查链路可能会从A->B->C->D,才能最终发现服务报错具体信息(后续skywalking可解决)。
③分布式事务问题
同上例A->B->C->D的长链路调用过程中,如果A先修改自己数据,但下游C却异常,此时预期是A回滚自己事务,这一点在单体应用因都是本地事务可以很好做到,但是分布式场景下却提升了复杂度(后续Seata可解决)。
④学习成本高
微服务学习除了需要一定基础之外:Spring、SpringMvc、MyBatis、SpringBoot、Maven、MySQL等,还需学习SpringCloud,中间件、缓存、Docker、文件服务器等多种技术,每一门学习都有很多难点需要克服。
4.如何实现微服务架构
至此我们了解了微服务的定义、优缺点,还总结了一些指导性的原则,下面我们进一步探讨下,如何实现微服务架构。
4.1 技术选型
1.开发框架
可使用SpringCloud作为微服务开发框架,因为SpringCloud为微服务架构提供了完整的解决方案,同时文档丰富,社区活跃,如下:

ALIBABASPRINGCLOUDALIBABABA

PUBLIC

7.5K

FORK

NOTIFICATIONS

24.4K

STAR

8 PULL REQUESTS

20

PROJECTS

SECURITY

WIKI

373

INSIGHTS

ACTIONS

CODE

ISSUES

ABOUT

GP 2.2.X

CODE

GO TO FILE

SPRING CLOUD ALIBABA PROVIDES A

THIS BRANCH IS 238 COMMITS AHEAD, 420 COMMITS BEHIND 2021.X.

ONE-STOP SOLUTION FOR APPLICATION

DEVELOPMENT FOR THE DISTRIBUTED

SOLUTIONS OF ALIBABA MIDDLEWARE.

2,142

10 HOURS AGO

WANGLIANG181230 OPTIMIZE: ALIBABA-SEATA:TRANSFE...

SPRING.IO/PROJECTS/SPRING-CLOUD-...

UPDATE POM.XML

.CIRCLECI

2 YEARS AGO

MICROSERVICES

SPRING

JAVA


当然借助于SpringBoot+Nacos+Dubbo等其他技术架构也可以实现微服务架构,但因SpringCloud丰富且完整的解决方案体系,作为新手学习笔者在此更推荐依此学习,此学习过程中涉及的理论在今后的工作中也一定大有帮助。
2.运行平台
微服务并不绑定运行平台,将微服务部署在PC server、阿里云、AWS等云计算平台都是可以的。出于轻量、灵活、应用支撑及现在市场主流部署模式,笔者选择Docker作为部署容器。
4.2 通用微服务技术架构图

内部服务

NACOS配置中心

分布式文件服务

服务追踪与监控

获取服务列表

注册

注册

服务监控

互联网

-注册

注册服务

NACOS

NACOS

监控报警

获取服务列表

NACOS服务注册中心集群

下型文件

上传文件

一获取服务列表

获取配置信息

一注册服务

网关GATEWAY集群

NGINX

WAF

SPRINGCLOUD GATEWAY

业务服务集群

业务服务集群

负载均衡

ES

日志存储

SPRINGCLOUD GATE WAY

NGINX

数据检索

服务熔断

LOGSTASH

SPRINGCLOUD GATEWAY

NGINX

数据持久化

数据缓存

消息队列

认证授权

防火墙

数据库集群

REDIS CLUSTER

读写分离+主从同步

心前同步

心跳同步

分布式缓存

MY

REDIS

REDIS MASTER

MY

生备热奶

KAFKA

KAFKA

BACKUP

KAFKA

KAFKA

REDIS SLAVE REDIS SLAVE

CI/CD

NEXUS

DOCKER

K8S

MAVEN仓库

JENKINS

KUBERNATERS APL

GITLAB

PIPELINE

开发人员


物理部署图、技术架构图、业务架构图、领域模型图、E-R图各自是什么?如何画?请移步:链接
5.总结
本文介绍了微服务基本概念、演变过程,主要的原则及优缺点,最后谈到了微服务的实现方案之一,作为引文此章节偏理论知识一些。后续笔者将借助具体技术实现带领读者一起逐步实现微服务架构体系。
思考问题
什么是微服务?
什么是微服务架构?
微服务架构演进过程?
6.推荐阅读资料

领域驱动设计:软件核心复杂性应对之道.pdf(59.1 MB)


相关文章
|
数据库
gorm 事务的使用
gorm 事务的使用
457 0
|
Java 编译器
Java“精度可能丢失”错误解决
在处理Java编程语言中“精度可能丢失”的警告或错误信息时,通常涉及到数据类型之间的转换,特别是从高精度类型(如long、double)转换到低精度类型(如int、short)时。本指南将帮助你理解这一问题的根源,并提供有效策略来避免或解决此类错误,确保程序正确无误地运行。我们将会探讨如何使用显式类型转换(cast),以及如何优化代码逻辑来规避潜在的数据丢失风险。
725 0
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
2310 0
|
2月前
|
SQL 容灾 数据库
分布式事务Seata
本章学习分布式事务问题及解决方案,涵盖CAP、BASE理论,并深入讲解Seata框架的XA、AT、TCC、SAGA四种模式原理与实现,掌握跨服务事务一致性处理及高可用部署。
 分布式事务Seata
|
2月前
|
XML Java 数据库
SpringCloud工程部署启动
本文介绍SpringCloud微服务工程的搭建与部署,涵盖项目创建、模块配置、数据库导入及服务远程调用实现。通过RestTemplate完成服务间HTTP通信,解决跨服务数据获取问题,并引导读者理解微服务拆分与调用关系,为后续深入学习奠定基础。(239字)
 SpringCloud工程部署启动
|
2月前
|
自然语言处理 Java Shell
安装ES、Kibana、IK
本文介绍了如何通过Docker部署单点Elasticsearch与Kibana,并配置IK分词器。内容涵盖网络创建、镜像加载、容器运行、DevTools使用,以及IK分词器的安装与扩展词典、停用词配置,助力中文文本分析。
 安装ES、Kibana、IK
|
11月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
413 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
310 2
|
监控 数据挖掘 测试技术
微服务架构
微服务架构
200 1
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)