当前位置: 首页 > news >正文

基础篇:01-微服务概述

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

如上图左侧为单体应用架构。在传统单体应用中,所有功能模块都在一个工程中编码、部署,即使是集群部署,也只是单体应用的水平复制。

如上图右侧为微服务架构。在微服务架构的项目中,每个应用会按照领域模型划分进行业务、功能聚合,由此拆分后聚合的应用往往:模型高度统一、职责清晰且收敛、应用与应用(领域与领域)之间边界清晰,并且提升了每个应用的独立性、扩展性。

除了应用拆分维度,微服务架构也保证了每个应用可以使用独立语言开发、独立数据存储技术,只要能保持对外统一交互语言即可,存储模型差异如下:

见上图,应用拆分之后对应每个应用会独立、或共享一个数据库,数据库的拆分维度除了要考虑领域边界,还要更多的考虑每个数据库的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为微服务架构提供了完整的解决方案,同时文档丰富,社区活跃,如下:

当然借助于SpringBoot+Nacos+Dubbo等其他技术架构也可以实现微服务架构,但因SpringCloud丰富且完整的解决方案体系,作为新手学习笔者在此更推荐依此学习,此学习过程中涉及的理论在今后的工作中也一定大有帮助。

2.运行平台

微服务并不绑定运行平台,将微服务部署在PC server、阿里云、AWS等云计算平台都是可以的。出于轻量、灵活、应用支撑及现在市场主流部署模式,笔者选择Docker作为部署容器。

4.2 通用微服务技术架构图

物理部署图、技术架构图、业务架构图、领域模型图、E-R图各自是什么?如何画?请移步:链接

5.总结

本文介绍了微服务基本概念、演变过程,主要的原则及优缺点,最后谈到了微服务的实现方案之一,作为引文此章节偏理论知识一些。后续笔者将借助具体技术实现带领读者一起逐步实现微服务架构体系。


思考问题

  • 什么是微服务?
  • 什么是微服务架构?
  • 微服务架构演进过程?

6.推荐阅读资料

  • 📎领域驱动设计:软件核心复杂性应对之道.pdf
  • 📎大话设计模式.pdf

相关文章:

基础篇:01-微服务概述

1.单体应用与微服务架构区别 如上图左侧为单体应用架构。在传统单体应用中,所有功能模块都在一个工程中编码、部署,即使是集群部署,也只是单体应用的水平复制。 如上图右侧为微服务架构。在微服务架构的项目中,每个应用会按照领域…...

TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518

TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518 TC358775XBG芯片的主要功能是DSI到LVDS桥,通过DSI链路实现视频流输出,以驱动LVDS兼容的显示面板。该芯片支持单链路LVDS高达1366768 24位像素分辨率,双链路L…...

Android开发

前言:因为这学期选了手机APP开发这门课,所以还是写个博客记录一下学习过程,包括安卓开发和ios开发。用到的资料包括课程PPT,和我在网上找的一些视频和资料。 1.Andriod入门 XML:描绘应用界面 (决定APP长什…...

virtualbox虚拟机导入到vmware esxi虚拟机

virtualbox导出的ova文件转换为ovf文件导入到vmware esxi虚拟机 1、下载安装程序 链接:https://pan.baidu.com/s/1pRP8MQswDSDecMB5eJGNYA?pwdmv2q 提取码:mv2q 双击VMware-ovftool-3.0.1-801290-win.x86_64.msi默认安装 2、在cmd中进入到Vware OVF…...

如何使用命名空间管理C++代码

在编写 C 代码时,管理代码组织和消除名称冲突是一个重要问题。 为了解决这个问题,C 提供了一种叫做命名空间的机制。命名空间可以将代码组织在一起,并防止不同模块间的名称冲突。 定义命名空间 首先,你需要在代码中声明命名空间…...

海思3559:BT656调试笔记

前言 海思3559a的sdk例子是没有提供BT1120和BT656视频接入的,但实际上硬件是可以支持接入的。不过前提是只支持逐行方式输入,不支持隔行视频,如果想输入PAL制式的隔行视频,请先用芯片转成逐行再接入。不知道是官方手册有意无意的忽…...

reactor之hooks

Hooks 是一个工具类,它提供了一些方法,用来在 Reactor 的各个阶段添加回调函数,进行全局性的操作。总体来说分为三类: 本部分算是reactor中比较高级的部分,建议在开始上手用reactor做项目前,大概知道有这么…...

单片AR眼镜Monocle揭秘:基于反射棱镜,重15g续航1小时

提问:一个戴近视眼镜的人,会愿意再同时戴一副AR眼镜吗?这个问题对于VR来说并不难,通常VR头显为镜框留出了空间(一些Pancake VR自带屈光调节机制),因此二者并不冲突。然而AR眼镜体积更紧凑&#…...

计算机视觉框架OpenMMLab开源学习(五):目标检测实战

✨写在前面:强烈推荐给大家一个优秀的人工智能学习网站,内容包括人工智能基础、机器学习、深度学习神经网络等,详细介绍各部分概念及实战教程,通俗易懂,非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…...

SpringIOC推导IOC初步

了解准备 什么是Spring? Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式开源框架 2002年Spring的前身interface21发布,随后在2004年3月24日正式更名发布Spring1.0版本Spring Frameword缔…...

Linux(centOS7)虚拟机中配置 vim

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

消息中间件-RocketMQ入门 消息发送的三种方式

消息中间件-RocketMQ入门 消息发送的三种方式消息中间件简介应用场景常用消息中间件RocketMQ核心概念入门案例-生产者和消费者代码逻辑消息发送的三种方式同步发送异步发送一次性消息消息中间件简介 应用场景 假设现在有订单微服务和积分微服务,正常请求流程之后是不是一个订…...

【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?

掉电分两种,一种是正常掉电,另一种是异常掉电。不管是哪种原因导致的掉电,我们都希望,重新上电后,SSD都需要能从掉电中恢复过来,继续正常工作。正常掉电恢复,这个好理解,主机通知SSD…...

Java知识点细节简易汇总——(7)面向对象编程(高级部分)

一、类变量、静态变量static static访问方式: public class VisitStatic {public static void main(String[] args) {//方法一://类名.类变量名//说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问System.out.println(A.…...

阻塞式队列-生产者消费者模型

1.阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队…...

引导滤波code

文章目录1. 原理概述2. 实验环节2.1 验证与opencv 库函数的结果一致2.2 与 双边滤波比较2.3 引导滤波应用,fathering2.3 引导滤波应用,图像增强2.4 灰度图引导,和各自通道引导的效果差异2.5 不同参数设置影响3. 参考引导滤波1. 原理概述 引导…...

Leetcode.2353 设计食物评分系统

题目链接 Leetcode.2353 设计食物评分系统 Rating : 1782 题目描述 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。 返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings类: FoodRatings(String[] foo…...

C语言学习_DAY_2_变量的定义_输入与输出

高质量博主,点个关注不迷路🌸🌸🌸! 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先,我们新建一个.c文件在Dev C中,并把之前定义好的程序框架放进去。 此时我…...

mac 安装navicat

由于各种原因发布不了链接,这里记录下,保存在了阿里云里...

RocketMQ快速入门

2.1 消息生产和消费介绍使用RocketMQ可以发送普通消息、顺序消息、事务消息,顺序消息能实现有序消费,事务消息可以解决分布式事务实现数据最终一致。RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式,这…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...