go-微服务的设计概括

一、微服务到底是什么?

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

  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.mzph.cn/bicheng/48257.shtml

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

相关文章

Window任务栏应用图片无法加载解决方法

在Windows系统中,如果任务栏应用图标显示成白色方块,可能是由于图标缓存文件损坏或者显示设置错误导致的。以下是一些解决方法: 重新启动Windows资源管理器: 按下Ctrl Shift Esc组合键打开任务管理器。在“进程”标签页中找到…

2024-07-19 Unity插件 Odin Serializer1 —— 插件介绍

文章目录 1 介绍2 拓展序列化类3 学习目的 1 介绍 ​ Odin Serializer 是 Unity 的一个插件,其主要用途是扩展 Unity 现有的序列化(如 MonoBehaviour 或 ScriptableObject 类),并可以独立于 Unity 类使用 Odin Serializer。 ​ …

桌面应用打开默认全屏功能

1.修改package.json 在main属性上面引入新的html页面 {"main": "/index.html","name": "phadcloud","description": "名称","version": "1.0","keywords": ["名称"],&…

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用,keepliaved配置主备抢…

IntelliJ IDEA 直接在软件中更新为最新版

当我们的 IDEA 工具许久没有更新,已经拖了好几个版本,想跨大版本更新,比如从2020.2.1 -> 2023.x.x 此时,我们菜单栏点击 Help -> Check for Updates… ,右下角会有提示更新,如下图: 点…

leetcode位运算(3211. 生成不含相邻零的二进制字符串)

前言 经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。接下来重点专项练习,加强重难点知识的练习。 描述 给你一个正整数 n。 如果一个二进制字符串 x 的所有长度为 2 的 子字符串 中包含 至少 一个 "1",则称…

go 实现websocket以及详细设计流程过程,确保通俗易懂

websocket简介: WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 协议在 2011 年由 IETF 标准化为 RFC 6455,后由 RFC 7936 补充规范。 WebSocket 使得客户端和服务器之间的数…

Python PDF Magic:合并和拆分随心所欲

大家好!小编今天要为大家带来一篇关于Python操作PDF的秘籍——无论是要将PDF合并成一份整体,还是将一个庞大的PDF文件拆分成多个小伙伴,都轻松hold住!你准备好了吗?让我们开始这场奇妙的PDF操作之旅吧! 准…

机械学习—零基础学习日志(高数06——函数特性)

零基础为了学人工智能,真的开始复习高数 函数的性质,开始新的学习! 有界性: 解法放这里: 证明有界,其实内部的包含知识点很多。第一,如果有界,你需要证明函数在一定区间内&#xff…

《Techporters架构搭建》-Day02 集成Mybatis-plus

集成Mybatis-plus Mybatis-plus集成Mybatis-plus步骤小结 Mybatis-plus Mybatis-plus官网 MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它引入了一些新的特性&…

微信小程序:API 进行Promise化

小程序 API 进行Promise化 安装 miniprogram-api-promise1.0.4 npm install --save miniprogram-api-promise1.0.4yarn add miniprogram-api-promise1.0.4在 app.js 中调用 promisifyAll() 方法。 // 实现异步 API Promise 化 import { promisifyAll } from miniprogram-api-pr…

【探索Linux】P.40(传输层 —— TCP滑动窗口 | 快重传 | 流量控制 )

阅读导航 引言一、TCP滑动窗口1. 为什么要用滑动窗口(1)逐个确认(2)优化逐个确认(滑动窗口) 2. TCP滑动窗口的工作原理 二、快重传的引入三、快速重传详细介绍1. 机制原理2. 触发条件3. 操作步骤4. 与超时重…

如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧

如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧 🌑 如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧 🌑摘要引言“Gradient Vanishing”问题的成因分析 🤔1. 激活函数的选择2. 网络层数过深3…

Python补充前文未述知识

函数名说明 chr(x) 将对应的字符转换为ASCII编码,也可以将整数x转换为一个字符ord(x)将对应的字符转换为unicode编码(包括中文)bin(x)将一个整数x转换为一个二进制字符串oct(x)将一个整数x转换为一个八进制字符串hex(x)将一个整数x转换为一个…

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

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

Linux 之 awk命令详解

Linux命令详解:巧妙使用awk命令进行文本处理 基本用法 常用功能 1. 打印指定列 2. 使用分隔符 3. 条件过滤 4. 格式化输出 高级功能 1. 使用BEGIN和END块 2. 内置变量 3. 自定义函数 实战案例 总结 Linux命令详解:巧妙使用awk命令进行文本处…

力扣 217. 存在重复元素,389. 找不同,705. 设计哈希集合,3. 无重复字符的最长子串,139. 单词拆分

217. 存在重复元素 题目 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 AC代码 class Solution { public:bool containsDuplicate(vector<int>& nums) {// …

Shell 构建flutter + Android 生成Apk

具体步骤 #shell 具体实现和说明如下: echo "build_start_apk!" echo "编译此脚本的前提条件如下:" #在Android 项目的主工程下,进入主工程文件夹,创建build-android 文件夹,在其文件夹下有build-android.sh文件,此文件就是整个文章的脚本内容(…

【MCGS学习-待更】

1、Mcgspro与mcgse区别&入门先学哪个合适&#xff1f; &#xff1f; 2、软件下载 现在官网没有找到下载链接。 这个网盘里有学习资料&#xff1a; 昆仑通态Mcgspro学习笔记&#xff08;V3.3.6&#xff09;-CSDN博客 3、基础入门资料视频&#xff08;待找&#xff09; …

谷粒商城实战笔记-36-前端基础-Vue-介绍HelloWorld

文章目录 一&#xff0c;MVVM 思想直接操作DOM的示例使用Vue和MVVM的示例MVVM与DOM操作的主要区别 二&#xff0c;Vue 简介三&#xff0c;第一个Vue项目1 新建项目2 安装依赖3 使用Vue 这一节的主要内容是演示Vue的简单使用。 一&#xff0c;MVVM 思想 M&#xff1a;即 Model…