微服务的定义

个人理解

其实微服务就是DDD + cloud native
DDD:
提供了微服务的理论基础,一个大型复杂的服务可以按照其对外提供的业务功能划分成相对独立的小服务。注意这个小是相对而言的,每一个小服务其实就是一个独立的子域(subdomain),它应该足够大以便能够提供一个完整的上下文以及囊括这个上下文的通用语言。这儿其实是设计微服务最容易出错的地方,

1, 避免业务领域的过度拆分。如果你设计了2个子服务,发现他们之间的关系非常复杂,比如商品和订单,这俩概念在业务上几乎总是成对出现的,把他们拆分只会破坏概念的完整性,形成一个分布式的单体系统,没有好处只有坏处。当你不确定是不是应该拆分服务的时候,说明你还没有足够的理由支撑你这么做,应该等到服务边界变得更加清晰之后再做决策。记住:模块化的单体服务并不需要太大的努力就可以改造成微服务,毕竟微服务只是把模块分开部署了而已。

2,避免按照技术或者使用的工具拆分出所谓的公共服务。之前在shopee有个例子,有好几个服务都需要对数据进行排序,于是就有人想做一个sorting service。其实排序功能非常简单,只是有的时候对数据的一致性要求很高,有时候对性能的要求又很高。解决方案都是靠数据库排序+redis排序。抽出一个单独的sortingService其实很不合理,因为sortingService不可能同时提供高性能(比如百万qps)和高一致性的保证,这违背了cap定律。同时系统里面多出来了一个依赖,sortingService成了单点瓶颈,有可能一个不重要的服务耗尽了sortingService的资源而导致更重要的服务请求失败。并且还有可能牵扯到权限和数据安全的问题。总之,这种不包含业务逻辑的功能不适合作为一个单独的服务来建立,而更适合做成一个common library,只有调用方才能决定性能和一致性之间的取舍,并且每个服务都有单独的资源(数据库+redis本身就广泛存在,不大可能会引入额外的依赖),不存在互相影响的弊端。

3,同一个服务也可以分开部署。考虑性能的特殊情况。比如一个图片服务,它能提供图片的上传修改功能和和查询功能。图片的上传需要大量的内存,修改需要大量的cpu,而查询是一个非常轻量级的操作。

上传:IO密集 (异步请求队列)
修改:IO + GPU 密集 (异步请求队列)
查询:qps大 (同步)

这种情况下,有个折中的方案。提供上传修改查询的代码明显是一个domain的,所以他们肯定是放在一个service一个代码仓库里面,但是在部署的时候,我们可以部署三类实例,一类实例只处理上传图片请求,把这类实例放在大内存机器上,一类实例只接受修改图片请求,部署在大内存+GPU机器上,还有一类部署在普通机器上,只处理查询请求。通过api gateway + instance tag来路由前端的请求。

Cloud Native:
很多讲微服务架构的文章其实都是在讲cloud native的技术,其实这一部分应该在微服务架构确定以后再考虑,主要研究的是服务的治理和通信的问题。都是一些很具体的解决方案。比如注册,发现,路由,鉴权,tracing, metrics, logs, circuit breaker, rpc, messag queue 等等。在做架构设计的时候,不应该舍本逐末,一上来就陷入到这些技术细节之中。首先应该用DDD的方法做好业务逻辑的拆分,等到服务的拆分完成以后,再考虑服务之间的协作(如果你发现两个服务交互太多,说明你拆的太细了,而如果你发现一个服务内某些资源之间很少相互依赖,说明你该考虑拆分了,请重新审视你的DDD domain mapping),这时候就要用到cloud native的这些技术了。

Martin Flower的理解

原文
核心观点,微服务是一种架构风格,它对软件的划分,以及项目组织和管理都有很大的影响。它没有具体的定义(我发现软件领域很多概念都是描述性的定义而不是准确的定义,比如RESTFUL,比如设计模式)。

In short, the microservice architectural style [1] is an approach
to developing a single application as a suite of small services,
each running in its own process and 
communicating with lightweight mechanisms, 
often an HTTP resource API
These services are built around business capabilities 
and independently deployable by fully automated deployment machinery. 

Martin简洁的描述了微服务的三个特性:
一组服务,独立进程(分开部署),轻量级通信,围绕业务能力拆分,自动化部署(离不开cloud native和ci/cd)。

These frustrations have led to the microservice architectural style: 
building applications as suites of services. 
As well as the fact that services are independently deployable and scalable, 
each service also provides a firm module boundary, even allowing for different services to be written in different programming languages. 
They can also be managed by different teams .

微服务就是好:
1,独立部署,独立扩容
2,更严格的模块边界
3,每个服务都可以独立演进

We do not claim that the microservice style is novel or innovative, 
its roots go back at least to the design principles of Unix. 
But we do think that not enough people consider a microservice architecture and 
that many software developments would be better off if they used it.

UNIX的模块化思想:每次只做一件事并且把它做好,或者相关联的KISS原则,真的是无处不在。因为所有复杂问题的解决方案都是一样的:把它拆分成更小的,没那么复杂的问题,然后逐个解决。

好了进入正题,微服务的九大特征:

Componentization via Services

Our definition is that a component is a unit of software 
that is independently replaceable and upgradeable.

由于可以独立的替换和升级,所以要求模块是高内聚低耦合的。

We define libraries as components that are linked into a program and called using in-memory function calls, 
while services are out-of-process components who communicate with a mechanism such as a web service request, or remote procedure call

模块是在内存里面的函数调用,但是service需要网络通信。性能变差了但是更安全了。
good:
1,独立部署和升级
2,更好的故障隔离。
3,更强制的模块接口
bad:
1, 性能不好
2,接口设计更麻烦,并且更加的粗粒度

Organized around Business Capabilities (重点)

按照技术能力进行划分:前端,后端,DBA,但是通常任何一个业务流程都包含这三者的变更,也就是任何一点改动都牵扯到大量的沟通,并且每个团队都要对业务了解,这样的效率和负担显然不理想。
按照业务能力进行划分:每个团队都负责自己的那一部分业务,包括开发该业务需要的所有技术工作,包括前段后端和DB。这样业务的变更只会影响到一个团队,一个service。
按照业务能力组建的团队具有更明确的业务边界。

Products not Projects

这个其实是上一条的扩展吧。以前程序员只关心写代码,代码写完就认为完成了,其实不是这个样的,我们要对整个产品负责,我build了这个feature,还要保证它在线上符合预期的工作,you build it, you run it。这并不是要求人人都是全栈工程师,而是说一个team应该作为一个整体,交互end to end的产品给用户。team内部可能各有所长和分工,但是team所有成员都必须对他们负责的产品足够了解。

Smart endpoints and dumb pipes

这一点是相对于SOA来说的,微服务提供轻量级的通信协议和使用简单消息队列。RPC本身和message queue不理解其中的消息,只是作为通信管道来使用。这是跟SOA很大的区别,但是我们也没用过SOA,所以没感觉。

Decentralized Governance

每个服务可以有不同的技术实现。通常我们不会这么做。

Decentralized Data Management

每个service有自己的domain logic,自然也要维护自己的domain data。由于数据被分散了,无法join查表,所以可能需要使用到event sourcing和data rebuild在一个service里面建立另一个service的data snapshot。
由于分布式事务很难实现,所以CQRS和最终一致性被采纳。这些都是DDD的概念
这里也提到了一个service就应该对应一个domain context, DDD天然的应用到了微服务

Infrastructure Automation

由于微服务的特性,人工测试和部署已经不现实了,所以要依赖现代的cicd技术。

Design for failure

由于function call变成了RPC,必须时刻做好错误处理和隔离。timeout和circuit break成为常态。

Evolutionary Design

单体模式是用简单方法解决简单的问题
微服务使用复杂的方法解决复杂的问题
为了避免过度设计,并且业务也是天然的倾向于越来越复杂,从单体服务转化为微服务也成了一件很自然的是。另外微服务也是按照DDD的思想来组织的,业务的变化导致微服务的增减也是常事。

Evolutionary design recognizes the difficulties of getting boundaries right and thus 
the importance of it being easy to refactor them. 
But when your components are services with remote communications, 
then refactoring is much harder than with in-process libraries.
Moving code is difficult across service boundaries, 
any interface changes need to be coordinated between participants, 
layers of backwards compatibility need to be added, 
and testing is made more complicated.

模块比service更容易重构,所以拆分微服务别太随意。

Another issue is If the components do not compose cleanly, 
then all you are doing is shifting complexity from inside a component to the connections between components

就像我说的,不要企图用一个common service去解决一个技术上的问题, 微服务是拆分复杂度不是转移复杂度。没有业务逻辑的service是没有存在价值的,避免创造蹩脚的公共服务!

One reasonable argument we've heard is that you shouldn't start with a microservices architecture. 
Instead begin with a monolith, keep it modular, and split it into microservices once the monolith becomes a problem. (Although this advice isn't ideal, since a good in-process interface is usually not a good service interface.)

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

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

相关文章

043-第三代软件开发-第三方串口库使用

第三代软件开发-第三方串口库使用 文章目录 第三代软件开发-第三方串口库使用项目介绍第三方串口库使用示例代码 关键字: Qt、 Qml、 QextSerialPort、 QThread、 高频 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt…

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测预测效果基本描述程序设计参…

[云原生1. ] 使用Docker-compose一键部署Wordpress平台

文章目录 1. Docker-compose概述1.1 简介1.2 docker-compose 的三大概念1.3 docker-compose配置模板文件常用的字段1.4 docker-compose 常用命令及格式 2. YAML 文件的详细介绍及编写注意事项2.1 简介2.2 yaml的特性2.2.1 语法特点2.2.2 数据结构2.2.3 引号的区别2.2.4 内置类型…

算法训练营第九天 | 字符串:总结篇

文章目录 力扣 | 344 反转字符串力扣 | 514 反转字符串 || 剑指offer 05. 替换空格力扣 | 151 . 翻转字符串中的单词剑指offer 58-|| .左旋转字符串 一、344 反转字符串 : 344. 反转字符串 - 力扣(LeetCode) 整体思路: 双指针…

springboot配置https

SSL : secure socket layer 是一种加密协议,SSL主要用于保护数据在 客户端和服务器之间的传输,,防止未经授权的访问和窃取敏感信息 在腾讯云申请ssl证书 申请了之后在我的域名中,,解析 解析了之后&…

【驱动开发】注册字符设备使用gpio设备树节点控制led三盏灯的亮灭

注册字符设备使用gpio设备树节点控制led三盏灯的亮灭 设备树: 头文件: #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int OD…

物流小程序制作教程:从零到有,详细解析

随着互联网的快速发展,物流行业也逐渐实现了数字化转型。为了满足消费者对更加便捷、高效的服务需求,许多物流企业选择制作自己的小程序。本文将通过乔拓云网后台,带你轻松搭建物流小程序,主要分为以下几个部分: 一、进…

发送post请求、携带cookie、响应对象、高级用法

发送post请求 请求体中,两种方式:data{} ⇢ \dashrightarrow ⇢ 编码格式 urlencoded ⇢ \dashrightarrow ⇢ keyvalue&keyvaluejson{} ⇢ \dashrightarrow ⇢ 编码格式是json 使用方式: resrequests.post(url) 模拟登录 import …

Microsoft 365 管理自动化

Microsoft 365 服务被大多数组织广泛使用,每天生成的数据量巨大。解决 Microsoft 365 中的问题可能非常困难,并且使用多个管理中心来保护组织变得复杂。本机控制台还缺少某些批量管理任务、全面的审计报告和基于角色的精细访问控制。 Microsoft 360 管理…

云计算的思想、突破、产业实践

文章目录 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五…

【C++项目】高并发内存池项目第八讲 项目总结和面试问题分享

项目总结面试分享 1.项目总结1.1优点1.2不足1.3面试常见问题 2.面试分享项目部分C语法部分 项目源代码:高并发内存池 1.项目总结 1.1优点 增加动态申请的效率减少陷入内核的次数减少系统内存碎片提升内存使用率尽量减少锁竞争应用于多核多线程场景 1.2不足 当前…

有效的字母异位词[简单]

优质博文:IT-BLOG-CN 一、题目 给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram&quo…

万字解析设计模式之原型模式与建造者模式

一、原型模式 1.1概述 原型模式是一种创建型设计模式,其目的是使用已有对象作为原型来创建新的对象。原型模式的核心是克隆,即通过复制已有对象来创建新对象,而不是通过创建新对象的过程中独立地分配和初始化所有需要的资源。这种方式可以节…

shell script 案例二

需求,运行程序,用户输入firstname,回车,再次提示输入lastname,然后回车,屏幕打印fullname信息 注意:前期写程序要注意规范,方便以后自己写多了回头看可以看的懂,程序代码…

如何在麒麟上安装 ONLYOFFICE 桌面编辑器

我们很高兴地告诉大家,ONLYOFFICE 桌面编辑器现已上架麒麟软件商店。请阅读下文了解详情。 关于麒麟 麒麟是一款国产操作系统,主要是为了满足中国市场的需求和偏好而设计的。 它能够与各种硬件平台和软件应用程序的广泛兼容,因而受到认可。…

路由器如何设置IP地址

IP地址是计算机网络中的关键元素,用于标识和定位设备和主机。在家庭或办公室网络中,路由器起到了连接内部设备和外部互联网的关键作用。为了使网络正常运行,需要正确设置路由器的IP地址。本文将介绍如何设置路由器的IP地址,以确保…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中,名称为jmeter.log。我们可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起 另外,Jmeter可以很方便地设置日志输出级别: 通过这种方式修…

在最爱的秋天学习 linux 之 su 和 sudo

文章目录 [toc]你好,su你好,sudo关于 /etc/sudoers 文件四个 AliasDefaultssudo 授权配置语法 搞一下不就知道了配置 sudo免密切换到 root 用户查看当前 sudo 命令范围sudo 审计日志使用子配置文件的方式 开开心心享受生活,没事学学 Linux su…

腾讯云轻量级服务器哪个镜像比较好?

腾讯云轻量应用服务器镜像是什么?镜像就是操作系统,轻量服务器镜像系统怎么选择?如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科来详细说下腾讯…

使用shardingJDBC中的雪花算法生成id

常用ID解决方案 数据库自增id 依靠数据库系统的功能实现,但是未来扩容麻烦主从切换时的不⼀致可能会导致重复发号性能瓶颈存在单台sql上 UUID 性能非常高,没有网络消耗无序的字符串,不具备趋势自增特性UUID太长,不易于存储&am…