关于微服务的思考
目录
什么是微服务
定义
特点
利弊
引入时机
需要哪些治理环节
从单体架构到微服务架构的演进
单体架构
集群和垂直化
SOA
微服务架构
如何实现微服务架构
服务拆分
主流微服务解决方案
基础设施
下一代微服务架构Service Mesh
什么是Service Mesh?
Service Mesh的实现原理
什么是微服务
定义
微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出(原文链接:https://martinfowler.com/articles/microservices.html),他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理 (例如Docker)技术,服务可以用不同的编程语言与数据库等。
特点
从微服务的定义当中,我们可以提炼出如下几个微服务的核心特点:
- 一组小的服务(涉及到服务拆分的粒度问题,后面会涉及)
- 独立进程
- 轻量级通信(Rest和RPC)
- 独立部署
利弊
微服务带来的好处:
- 清晰的模块边界
- 各自独立部署,互不影响
- 各个服务可选择不同的技术实现
微服务带来的弊端:
- 分布式复杂性(从单体到微服务,系统内部复杂度降低,同时外部复杂度增加)
- 数据一致性问题
- 运维复杂度更高
- 测试复杂度更高
引入时机
前期业务不复杂的情况下,不建议引入微服务。对于一个业务,一开始就应该是怎么快怎么来,快速迭代,快速验证产品。随着业务不断发展越来越复杂,整个生产力开始下降的时候,就可以开始考虑引入微服务了。
在引入微服务的时候,整体的一个思路是:选择一个非核心模块开始微服务化,将微服务整套核心基础设施落地(核心基础设施后面会涉及),然后渐进式地去微服务化其他模块,稳步前进。
需要哪些治理环节
服务注册中心
服务通信
服务配置中心
统一网关
自动化部署
可观测性(日志Logs、监控Metrics、链路追踪Trace)
从单体架构到微服务架构的演进
单体架构
早期开发的时候,一个war包或者jar包,里面包含了一个应用的所有功能,这样的架构我们叫作单体架构。单体架构足够简单,可以快速开发和上线,适用于项目初期业务简单、用户量不大的情况。
集群和垂直化
集群:横向增加服务器,将单台机器变成由多台机器组成的集群。
垂直化:按照业务的垂直领域进行划分,降低业务的耦合度,同时提高应用的可伸缩性。
SOA
面向服务架构,核心目标是把一些通用的、会被多个上层服务调用的共享业务提取成独立的基础服务,这些被提取出来的共享服务相对来说比较独立,并且可以重用。所以在SOA中,服务是最核心的抽象手段,业务被划分为一些粗粒度的业务服务和业务流程。
SOA解决的问题:信息孤岛;共享业务重用。
微服务架构
我们可以简单地理解,多个微服务可以组成一个SOA服务。
由于SOA和微服务它们的关注点不同,就导致了它们之间有非常大的区别:
- SOA关注的是服务的重用性和信息孤岛问题;
- 微服务关注的是业务解耦。
解耦是降低业务之间的耦合度,重用性关注的是服务的复用。
微服务架构使得服务粒度细化之后,开发运维也变得更加重要,和容器技术也结合得更加紧密。
如何实现微服务架构
服务拆分
更多的时候,大家可能都是按照业务流程来进行服务的拆分的。除此之外,我们还可以按照性能、业务重要程度、可用性、稳定性这些维度来进行微服务的拆分,具体采取什么方式可以视具体情况而定。
那关于服务的粒度,我们应该如何把握呢?粒度太细或太粗都不太合适,粒度太细会导致开发、测试、运维更加复杂,整体性能会降低等;粒度太粗又会导致达不到我们的预期,服务之间依赖太大。这里有一个技巧:三个火枪手原则。拆分微服务的数量=服务端开发人数/3。
什么是三个火枪手原则?平均3个开发人员负责一个微服务。
为什么不是1个人?没有备份人员,一个人思维有局限。
为什么不是2个人?异常情况下一个人压力会比较大,另外两个人维护的服务复杂度可能偏低。
为什么不是4个或者更多?开发人员多了之后,每个人不一定能掌握单个服务的所有细节。
主流微服务解决方案
- Spring Cloud Alibaba(目前用得比较多的方案)
- Spring Cloud Netflix
- SpringBoot + K8s
- Dubbo
基础设施
微服务整个基础设施会包括下面这些内容,我们一起来看看。
- 服务接入层:服务网关;服务流控;服务降级;服务安全。
- 服务运行层:服务注册;服务发现;服务路由;服务容错。
- 技术支撑层:接口框架;分布式事务;自动化测试;容器编排;自动化部署;灰度发布;服务监控;服务跟踪。
- 基础设施层:配置中心;日志中心;分布式锁;消息队列。
上面说了这么多,那么它们的优先级是怎么样的呢?服务运行层 > 服务接入层 > 基础设施层 > 技术支撑层。其中微服务框架的核心是:服务注册、服务发现和服务路由。
下一代微服务架构Service Mesh
什么是Service Mesh?
Service Mesh是一种新型的用于处理服务与服务之间通信的技术,尤其适用以云原生应用形式部署的服务,能够保证服务与服务之间调用的可靠性。在实际部署时,Service Mesh 通常以轻量级的网络代理的方式跟应用的代码部署在一起,从而以应用无感知的方式实现服务治理。
Service Mesh 以轻量级的网络代理的方式与应用的代码部署在一起,用于保证服务与服务之间调用的可靠性,这与传统的微服务架构有着本质的区别,这么做主要是出于两个原因:
- 跨语言服务调用的需要
- 云原生应用服务治理的需要
Service Mesh的实现原理
Service Mesh 实现的关键就在于两点:一个是上面提到的轻量级的网络代理也叫 SideCar,它的作用就是转发服务之间的调用;一个是基于 SideCar 的服务治理也被叫作 Control Plane,它的作用是向 SideCar 发送各种指令,以完成各种服务治理功能。
1.SideCar
2.Control Plane
既然 SideCar 能实现服务之间的调用拦截功能,那么服务之间的所有流量都可以通过 SideCar 来转发,这样的话所有的 SideCar 就组成了一个服务网格,再通过一个统一的地方与各个 SideCar 交互,就能控制网格中流量的运转了,这个统一的地方就在 Sevice Mesh 中就被称为 Control Plane。
Service Mesh 在诞生不到两年的时间里取得令人瞩目的发展,Google、IBM 领导的 Istio是 Service Mesh 技术的代表之作。除吃之外还有微博的 Weibo Mesh、华为公有云 Service Mesh 以及蚂蚁金服的 SOFA Mesh 等。
相关文章:

关于微服务的思考
目录 什么是微服务 定义 特点 利弊 引入时机 需要哪些治理环节 从单体架构到微服务架构的演进 单体架构 集群和垂直化 SOA 微服务架构 如何实现微服务架构 服务拆分 主流微服务解决方案 基础设施 下一代微服务架构Service Mesh 什么是Service Mesh?…...

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合
群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合 自建 npm 资源库,使用Verdaccio。如果觉得麻烦,直接可以在外网注册 https://www.npmjs.com/ 网站。大同小异,自己搭建搭建方便局域网…...

老师旁听公开课到底听什么
经常参加公开课是老师提升自己教学水平的一种方式。那么,在旁听公开课时,老师应该听什么呢? 听课堂氛围 一堂好的公开课,应该能够让学生积极参与,课堂气氛活跃,而不是老师一个人唱独角戏。如果老师能够引导…...

一文让你深入了解JavaSE的知识点
꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …...

人体是否有清除hpv病毒能力?北京劲松HPV诊疗中心提出观点
HPV,全称人乳头瘤病毒,是一种常见的性传播疾病,其症状包括尖锐湿疣、皮肤疣等。那么,人体是否有清除HPV病毒的能力呢?答案是肯定的,人体确实具有清除HPV病毒的能力。 首先,我们要了解HPV病毒是如何感染…...
Linux下~目录和home目录的区别
在 Linux 中,~(波浪号)路径和 home 路径都与用户的主目录(home directory)相关。 ~(波浪号)路径:表示当前登录用户的主目录。例如,如果你当前是以用户user1的身份登陆&am…...

(二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
1 下载 Sublime Text 3 免安装版 Download - Sublime Text 2 下载 Package Control,放到 Sublime Text Build 3211\Data\Installed Packages 目录下。 Installation - Package Control 3 页面搜索 anaconda anaconda - Search - Package Control Anaconda - Pac…...
如何实现大数据渲染
在前端实现大数据渲染时,常见的优化方式是使用虚拟滚动(Virtual Scrolling)或无限滚动(Infinite Scrolling)技术。这些技术可以帮助降低内存消耗和提高渲染性能,以下是一些常用的实现方法: 虚拟…...

【差旅游记】走进新疆哈密博物馆
哈喽,大家好,我是雷工! 前些天在新疆哈密时,有天下午有点时间,看离住的宾馆不远就是哈密博物馆,便去逛了逛博物馆,由于接下来的一段时间没顾上记录,趁今天有些时间简单记录下那短暂的…...

单片机学习6——定时器/计数功能的概念
在8051单片机中有两个定时器/计数器,分别是定时器/计数器0和定时器/计数器1。 T/C0: 定时器/计数器0 T/C1: 定时器/计数器1 T0: 定时器0 T1: 定时器1 C0: 计数器0 C1: 计数器1 如果是对内部振荡源12分频的脉冲信号进行计数,对每个机器周期计数&am…...

a-table:表格组件常用功能记录——基础积累2
antdvue是我目前项目的主流,在工作过程中,经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 a-table:表格组件常用功能记录——基础积累2 效果图1.table 点击行触发点击事件1.1 实现单选 点击事件1.2 实现多选 点击事件1.3 实…...

leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记
131. 分割回文串 - 力扣(LeetCode) 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串 示例 1: 输入:s "aa…...
浅谈对于Android CMakeLists文件的理解
文章目录 文件结构 文件结构 cmake_minimum_required(VERSION 3.10.2) //设置cmake版本set(CMAKE_LIBRARY_OUTPUT_DIRECTORY${CMAKE_CURRENT_LIST_DIR}/../jniLibs/${ANDROID_ABI}) //设置.so文件输出路径 project("add") //编译目录add_library( common //生成.so文…...

虚函数可不可以重载为内联 —— 在开启最大优化时gcc、clang和msvc的表现
下面是对该问题的一种常见回答: 首先,内联是程序员对编译器的一种建议,因此可以在在重载虚函数时在声明处加上inline关键字来修饰, 但是因为虚函数在运行时通过查找虚函数表调用的,而内联函数在编译时进行代码嵌入&…...

【开源】基于Vue+SpringBoot的智能教学资源库系统
项目编号: S 050 ,文末获取源码。 \color{red}{项目编号:S050,文末获取源码。} 项目编号:S050,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…...
Sass基础知识之【变量】
文章目录 前言变量声明变量引用变量名用中划线还是下划线分隔后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Sass和Less 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。…...
云原生系列Go语言篇-泛型Part 1
“Don’t Repeat Yourself”是常见的软件工程建议。与其重新创建一个数据结构或函数,不如重用它,因为对重复的代码保持更改同步非常困难。在像 Go 这样的强类型语言中,每个函数参数及每个结构体字段的类型必须在编译时确定。这种严格性使编译…...
力扣1089题 复写零 双指针解法
2. 复写零 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 示例 1&…...
Redis基础与运用
一、redis介绍 简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...