go-微服务的设计概括

news2024/11/23 15:07:01

一、微服务到底是什么?

初学者很容易把微服务和分布式混为一谈,但其实二者之间存在非常大的差异,我个人认为主要有以下几点:

  1. 分布式主要是一种技术手段,用来保证多个相同的进程能够共同工作而不出错。采用各种复杂的技术手段(比如选举机制、数据同步机制、传输机制、心跳机制等等很多手段)来保证数据一致性、可靠性、分区容错性(CAP理论)。使得它们能够共同工作,使得存储、吞吐量等各项性能乘倍提升
  2. 微服务更多的是一种设计,通过业务职能将一个项目划分为多个服务,每个服务专注于自己的职能即可。有一个理论叫小即是美,微服务的划分将一个大模块划分为多个小模块,每个团队负责一个小模块会更加精细,并且更加灵活,所谓的灵活我们接下来会讲解。
  3. 在实际业务场景中,微服务和分布式又是密不可分的。如果公司选择了微服务架构说明公司的业务体量已经达到了一定规模,那么考虑到性能和高可用性一般同一个服务会有多个实例,同时存储组件也会有采用分布式的组件来存储。

二、微服务到底有什么好的?

并不是所有项目一定要使用微服务,只有当业务的复杂性和体量到达一定程度后,微服务才能发挥它的作用

我们想象自己是一名大厂架构师,公司正在经历从单体到微服务的转型。面对如此庞大、复杂的业务系统,我们会面临什么问题?

  1. 访问量暴增,一个单体服务即使它的物理机非常牛逼,仍然可能支撑不住导致宕机
  2. 数据量暴增,目前我们所有的数据都在一个数据库中,如何进行扩容
  3. 由于迭代太快,可能一些团队写了一些错误代码,导致整个程序不可用
  4. 每次新写几个功能都要部署整套单体系统才能够进行测试

针对问题一、二,简单粗暴的办法就是复制。复制几个相同的单体服务和数据库放在不同的物理机上,来提高性能。这种办法确实是短期最有效的,用来应急没有问题。但是长期来看这存在严重的浪费问题。有以下几点:

  • 大部分时候流量暴增都是针对几个热点模块,并不是所有的模块访问量都大,也并不是所有模块的数据表都需要扩容。粗暴的复制会浪费很多设备
  • 如果采用微服务的方式,只对热点模块和对应的数据库进行复制能够更加精准解决性能问题,且能够大大减小资源浪费

针对问题三、四,单体架构几乎无解,可微服务则能够很好的避免。
微服务中哪怕出现严重bug也只会影响自己的服务,并且上线都是逐步上线,没问题了才全部替换,能够大大提高整体的可用性。
测试的时候只需要部署该服务以及依赖的服务即可,不需要全部部署

三、微服务需要注意哪些问题?

微服务并不是银弹能够解决所有问题。它会增大系统的复杂性并严重依赖于基础设施。

  1. 设计微服务需要考虑服务的划分以及协同工作,最重要的是服务之间涉及到网络传输,需要考虑非常多的异常情况
  2. 微服务需要有配套的基础设施,比如链路跟踪、分布式日志、性能指标采集、动态扩缩容等等
  3. 需要考虑服务之间的通信问题,比如通信协议、api设计规范(非常重要)、打造一个统一的标准
  4. 需要考虑服务注册、发现
  5. 需要考虑分布式带来的问题
    等等很多

所以在业务还不复杂的时候,使用微服务是非常不明智的选择

四、微服务设计原则

去中心化原则:
微服务设计里面尽量不要有流量中心和数据中心。
比如我们通常会有一个BFF层用来并行调用多个微服务拿到数据进行组合,那么我们应该根据业务将BFF层拆分成多个BFF组件,否则所有接口的流量都走一个BFF容易导致宕机,也很容易因为一个地方的失误导致整个BFF不可用。
第二个就是数据中心,应该为每个服务设计一个数据库,这样当需要进行扩容伸缩时不需要对全部数据库进行扩容,更有针对性。

4.1 微服务架构

在这里插入图片描述

Gateway:提供认证授权、流量控制、负载均衡等通用支持。常见的手段是将认证得到的用户信息放到header中传输给BFF层
BFF: 并行访问微服务接口组装数据返回给用户,注意的是BFF应该提供粒度较大、较通用、并且风格统一的接口,用来减小前端人员调用的复杂度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

修复公路 (最小生成树)

//新生训练 Input 4 4 1 2 6 1 3 4 1 4 5 4 2 3 Output 5 #include <iostream> #include <algorithm> #include <bits/stdc.h> using namespace std; typedef long long ll;struct road {int u,v;ll w;bool operator<(const road a)const{return w<a.w…

每日练习*

目录 一、选择题二、知识点1.中间件特点的描述1.1中间件的定义和作用1.2中间件的主要特点1.3中间件的应用场景1.4中间件的发展趋势 二、重写与重载总结![](https://i-blog.csdnimg.cn/direct/aa4190dfbd0e463294e41059016b8895.png) 一、选择题 题目选自牛客网 1.执行下列代码…

自动化测试 - selenium 环境搭建

在进行自动化测试时&#xff0c;Selenium 是一个非常强大的工具&#xff0c;在使用前需要做一些环境准备。 1. 配置 Chromedriver 访问 Chrome 浏览器的官方网站&#xff08;https://www.google.cn/chrome/&#xff09;&#xff0c;下载并安装 Chrome 浏览器。 接下来&#x…

Postman 集合变量的实用指南

在运用 Postman 进行 API 测试时&#xff0c;变量扮演着动态数据存储器的角色。它们作为键值对存在&#xff0c;其中“键”是变量的标识&#xff0c;而“值”则是存储在变量中的数据。这种机制不仅可以在多个 API 调用中重用数据&#xff0c;还有助于降低数据冗余&#xff0c;优…

【已解决】Linux(Centos7)中yum过程域名无法解析问题

问题原因 Linux中yum过程域名无法解析问题&#xff0c;但是ping 域名时联通的&#xff08;即DNS没问题&#xff09;&#xff0c;所以初步判断是镜像源的问题。 解决方法&#xff08;Centos7&#xff09; 1、备份/etc/yum.repos.d/CentOS-Base.repo 2、下载CentOS-Base.repo…

WebGL-编译报错,如何定位sendfile报错位置

1&#xff09;WebGL-编译报错&#xff0c;如何定位sendfile报错位置 2&#xff09;设置DepthBufferBits和设置DepthStencilFormat的区别 3&#xff09;Unity打包exe后&#xff0c;游戏内拉不起Steam的内购 4&#xff09;使用了Play Asset Delivery提交版本被Google报错 这是第3…

Nginx的HA高可用的搭建

1. 什么是高可用 高可用&#xff08;High Availability, HA&#xff09;是一种系统设计策略&#xff0c;旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时&#xff0c;仍能持续稳定地运行。它通过实现冗余性、故障转移、负载均衡、数据一致性、监控自动化、预防…

MySQL下载安装(保姆式教程)以及解决一些可能的问题

目录 MySQL的下载和安装 显示路径已经存在问题解决 注意&#xff1a; 端口被占用问题解决 注意&#xff1a; 服务名占用问题解决 注意&#xff1a; 应用配置问题解决 注意&#xff1a; MySQL环境配置 检查MySQL是否成功安装 如何将MySQL文件删除干净 MySQL的下载和安装 首先直接…

Python(字符串)

方法名描述说明 str.lower() 将str字符串全部转化为小写字母&#xff0c;结果为一个新的字符串str.upper()将str字符串全部转化为大写字母&#xff0c;结果为一个新的字符串str.split(sepNone)将str按照指定的分隔符sep分隔&#xff0c;结果为列表类型str.count(sub)结果为…

Golang | Leetcode Golang题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; func maxSlidingWindow(nums []int, k int) []int {n : len(nums)prefixMax : make([]int, n)suffixMax : make([]int, n)for i, v : range nums {if i%k 0 {prefixMax[i] v} else {prefixMax[i] max(prefixMax[i-1], v)}}for i : n - 1…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明&#xff1a;这是自己做的课程设计作业&#xff0c;得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线&#xff0c;分别是存储用户信息和商品信息&#xff0c;并且都设为公共属性&#xff0c;方便对用户信息和商品信息…

QT5:多窗口跳转

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助 目录 前言 一、环境 二、步骤 三、代码实现 四、效果图 前言 学习使用qt5完成多窗口&#xff08;界面&#xff09;跳转&#xff1a;从主界面可分别跳转至界面一和界面二&#xf…

echarts实现3d柱状效果

代码如下&#xff0c;单个的调第一个方法&#xff0c;多个柱状的调第二个方法&#xff0c;具体情况修改参数或者二次开发即可 //3d柱状图 export function getEcharts3DBar (xAxisData:string[][name1,name2,name3], data:number[][1,2,3], colorObj:IBaseObject{topStartColo…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.4信息安全与2.1.5信息技术的发展

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

css前端面试题

1.什么是css盒子模型&#xff1f; 盒子模型包含了元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…

QT调用VNC并放到一个窗口中

1.VNC资源下载 本例中的这个VNC可以从以下连接中下载&#xff0c;也可以从官网上下载&#xff0c;应该都是类似的。 https://download.csdn.net/download/xiaoding_ding/89549092 下载完成后放到项目的release文件夹中 2.程序中引用 2.1在主界面中放置一个按钮&#xff0c;…

NAS新品“翻车”后,绿联科技要上市了

在消费电子市场回暖的东风中&#xff0c;又一消费电子知名企业登陆A股。 近日&#xff0c;深圳市绿联科技股份有限公司&#xff08;下称“绿联科技”&#xff09;开启申购&#xff0c;将在创业板上市。本次上市&#xff0c;绿联科技的发行价为21.21元/股&#xff0c;发行数量为…

【自动驾驶汽车通讯协议】SPI通讯:深入理解与应用

文章目录 0. 前言1. 工作原理2. 模式与配置2.1 CPOL (Clock Polarity)2.2 CPHA (Clock Phase)2.3 组合模式 3. 特性与优势4. 在自动驾驶汽车中的应用5. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见…

给定一整数数组,其中有p种数出现了奇数次,其他数都出现了偶数次,怎么找到这p个数?

给定一长度为m的整数数组 &#xff0c;其中有p种不为0的数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;找到这p个数。 要求&#xff1a;时间复杂度不大于O(n)&#xff0c;空间复杂度不大于O(1)。 由于时间复杂度不大于O(n)&#xff0c;则不能在遍历数组中嵌套遍…

SpringMVC源码深度解析(中)

接上一遍博客《SpringMVC源码深度解析(上)》继续聊。最后聊到了SpringMVC的九大组建的初始化&#xff0c;以 HandlerMapping为例&#xff0c;SpringMVC提供了三个实现了&#xff0c;分别是&#xff1a;BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…