当前位置: 首页 > 编程日记 > 正文

系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

《微服务架构设计模式》 一书中,作者总结了关于微服务的一些“重点”,原文如下:

中国企业和开发者对微服务架构的热情让我印象深刻。但如同我给所有客户的忠告一样,我想对本书的读者说:
 
   第一,要记住微服务不是解决所有问题的万能“银弹”。
 
   第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础。
 
   第三,关注微服务的本质,即服务的分解和定义,而不是技术,如容器和其他工具。
 
   第四,确保你的服务松耦合,并且可以独立开发、测试和部署,不要搞成分布式单体(DistributedMonolith)那将会是巨大的灾难。
 
   第五也是最重要的,不能只是在技术上采用微服务架构。拥抱DevOps的原则和实践.在组织结构上实现跨职能的自治团队,这必不可少。
 
 还必须记住:实现微服务架构并不是你的目标。你的目标是加速大型复杂应用程序的开发。
 最后,我要感谢中国的所有客户,让我有机会与你们探讨微服务。我还要感谢那些让我能够讨论技术而不用学说中文(这可比微服务难多了)的同传翻译。我希望你会喜欢阅读这本书,它会教你如何成功开发微服务。我期待着再次访问中国,与我的读者见面,帮助更多企业客户实施微服务架构。
                                                                                                                                                                ChrisRichardson2019年2月13日

核心思想 第二 和 第五,总结为:微服务不只是技术问题, 也是团队结构问题。

想要理解这句话,可以先了解下著名的康威定律

康威第一定律

Conway’s law: Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.– Melvin Conway(1967)

组织设计的产品/设计等价于这个组织的沟通结构。

用人话来说,就是你组织是啥德行,产品就是啥德行。从这个角度上来说,阿里的产品架构都非常严谨,中规中矩,先顶层设计,后逐步细化。所以钉钉能够成功也来源于阿里本身的组织架构。


康威第二定律

There is never enough time to do something right, but there is always enough time to do it over。

时间再多一件事情也不可能做的完美,但总有时间做完一件事情。

这个定律在概念上就是“敏捷编程”,即持续集成持续部署持续交付,devops。


康威第三定律

There is a homomorphism from the linear graph of a system to the linear graph of its design organization.

线型系统和线型组织架构间有潜在的异质同态特性。

异质同态指的是系统和组织虽然是两个东西,但是有相同的结构。所以系统是啥样,组织也就得变成那个样子。

比如公司如果是单体架构,那就只需要一个开发组即可;但是如果是前后端分离,那么必然就会拆分为前端组和后端组,分别进行管理。这就是所谓的异质同态。

如果系统和组织的结构不匹配,那么将会是灾难。你想象一下系统是前后端分离,但是压根就没拆分前后端的岗位是啥情况?


康威第四定律

The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems。

大的系统组织总是比小系统更倾向于分解。

当系统功能越来越多,流量越来越大,垂直扩展无法解决这些问题。进而走向了水平扩展到道路,那么想要支持水平扩展,就需要解决很多基础问题,比如会话状态,比如lb等等。当你真的支持了水平扩展了,你自然而然就会发现,有些业务访问量很大,需要的资源很多,但是有些很小,业务上也无需塞到到一个服务里面,这时你就会想到去拆分了。拆分后,你反而需要解决更多的问题。所以这一定律也就更考验到服务拆分的能力。


综上所述,关于微服务架构,本身是服务于系统架构而生,面向日渐复杂的系统架构。

  1. 拆分微服务的目的应该为:性能伸缩, 运维独立以及团队结构优化。

  2. 如果你想要为了让团队技术追新儿使用新的微服务技术,为技术而技术,大可不必,springboot 也很香。

  3. 在大部分的系统架构升级中,往往会带来更多的维护成本,架构一直都是一个取舍,为了解决伸缩性的问题,就要舍弃单体应用的简单性,引入分布式的复杂性。往往 1+1 是 < 2的。

  4. 实现“高内聚,低耦合”,说得容易,做得费劲。

相关文章:

在k8s中使用gradle构建java web项目镜像Dockerfile

在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chowngradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle build --no-daemonFROM openjdk:8-jre-slimEXPOSE 10010RUN mkdir /appCOPY --frombuild /home/gradle/sr…

致26岁的自己

2021年10月17日&#xff0c;晴 想到很久很久没有去记录和输出想法&#xff0c;加上最近在不停地不停地思考&#xff0c;总结一下&#xff0c;并给两年后的自己做一个方向性的规划。 首先就是目前所取得的一个阶段性成果&#xff0c;到目前为止&#xff0c;我已经工作两年。在这…

阿里云K8S容器服务的使用

使用阿里云k8s构建服务一. 上传镜像二. k8s运行三. 服务配置导入四. 服务路由五. 节点亲和性和污点管理一. 上传镜像 在阿里云控制台找到“容器镜像服务”&#xff0c;开启镜像服务&#xff0c;这里选择个人实例即可&#xff08;个人版限额&#xff0c;企业版付费&#xff09;…

nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问

nginx配置http、https访问 要设置https访问需要从对应的云厂商申请证书&#xff0c;并下载Nginx证书到服务器。 我这里从阿里云申请了免费的域名证书&#xff0c;然后将证书放置在服务器的/etc/ssl/.com/路径下&#xff0c;开始配置 这里直接上server节点&#xff0c;放在你…

使用hello word写小说

2021-11-12 使用hello word写小说

2021-10-27 我与地坛

2021-10-27 我与地坛 要是有些事我没说&#xff0c;地坛&#xff0c;你别以为是我忘了&#xff0c;我什么也没忘&#xff0c;但是有些事只适合收藏。不能说&#xff0c;也不能想&#xff0c;却又不能忘。它们不能变成语言&#xff0c;它们无法变成语言&#xff0c;一旦变成语言…

mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。

下面有两条sql&#xff0c;主键查询&#xff0c;在mysql中查询到的结果相同。 SELECT* FROM USER WHEREid EM58hdK4nXC;SELECT* FROM USER WHEREid em58hdk4nxc;这种情况就是mysql查询大小写结果相同&#xff0c;因为大小写查询不敏感。 解决方法&#xff1a; 工具中&…

redisson get()数据报错,missing type id property ‘@class’

redisson get()数据报错&#xff1a; com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class java.lang.Object]: missing type id property ‘class’ 详细报错信息如下&#xff1a; com.fast…

go build 编译报错 missing go.sum entry for module providing package

go build 编译报错 missing go.sum entry for module providing package 解决方法 // 移除未使用的依赖 go mod tidy再次编译&#xff0c;就可以了。

在kotlin companion object中读取Bean,注入Bean对象

在kotlin companion object中读取Bean&#xff0c;注入Bean对象 在使用kotlin时&#xff0c;或多或少地会使用到一些公共组件&#xff0c;如 http、 mongo、 redis相关的组件。 使用组件时&#xff0c;我们往往会自定义一些通用的方法&#xff0c;用以全局调用&#xff0c;作…

locust入门:单机使用locust运行压力测试

locust的官方文档在这里&#xff1a; http://docs.locust.io/en/stable/ 前置&#xff1a;locust的测试脚本使用为python&#xff08;若未安装python环境&#xff0c;可以搜索安装python&#xff09; 1. 在已有的python环境中&#xff0c;使用pip3 install locust安装locust 2…

本地打包Docker镜像上传至阿里云远程仓库(一站式脚本)

打包镜像上传至远程仓库&#xff1a; 1. 本地项目为 mytest-project 2. 仓库为阿里云镜像仓库 registry.cn-beijing.aliyuncs.com/test/mytest-project #!/bin/sh echo "开始制作镜像..." image_tagdate %Y%m%d #_%H%M echo "当前时间&#xff1a;$image_tag…

mysql建立联合索引,mysql建立唯一键,mysql如何解决重复记录联合索引

在项目中&#xff0c;常常要用到联合唯一 在一些配置表中&#xff0c;一些列的组合成为一条记录。 比如&#xff0c;在游戏中&#xff0c;游戏的分区和用户id会形成一条记录。(比如&#xff0c;一个qq用户可以在艾欧尼亚、德玛西亚创建两个账号) 添加联合唯一索引 alter t…

关于新技术的引入原则 ——从零开始学架构

不以解决实际问题引入的技术都耍流氓。 新技术的引入不是为了证明自己&#xff0c;而是为了解决实际项目中遇到的问题。希望诸位能够控制住自己的心魔。 新技术的引入要求应该是解决的问题大于带来的问题。 再引入新技术&#xff0c;请在confluence中写下你的充足理由&#xff…

端口映射问题:Bad Request This combination of host and port requires TLS.

错误信息&#xff1a; Bad Request This combination of host and port requires TLS.遇到上面的错误信息&#xff1a;如果是通过域名访问&#xff0c;则该域名后配置的转发端口映射错误。 如果是通过ip端口 或者 域名端口访问&#xff0c;则为你端口填写错误。 我出现过若干…

正式压力测试:locust进阶,超简单搭建生产级locust集群

locust进阶&#xff0c;搭建生产级locust集群 本教程基于k8s集群搭建&#xff0c;使用helm作为包管理工具 通过helm安装locust&#x1f447;两个命令 helm repo add deliveryhero https://charts.deliveryhero.io/ helm install [起个服务名] deliveryhero/locust地址为&#…

mysql并发更新数据,多用户并发修改数据解决方案。

mysql并发更新数据&#xff0c;多用户并发修改数据解决方案。 在系统中&#xff0c;有一些如余额、资产、积分的数据&#xff0c;是要保证数据一致性的。如&#xff0c;一个人使用两个设备同时进行消费操作&#xff0c;如何保证数据一致性的问题。 我们一起来思考一下&#xf…

在Dockerfile中设置G1垃圾回收器参数

在Dockerfile中设置G1垃圾回收器参数 ENV JAVA_OPTS"\ -server \ -XX:SurvivorRatio8 \ -XX:DisableExplicitGC \ -XX:UseG1GC \ -XX:MaxGCPauseMillis100 \ -XX:SoftRefLRUPolicyMSPerMB1000 \ -XX:HeapDumpOnOutOfMemoryError \ -XX:MetaspaceSize128m \ -XX:MaxMetasp…

Kubernetes 中 设置pod不部署在同一台节点上

在k8s中&#xff0c;节点的调度主要由亲和性和污点来进行控制的。 而在亲和性部分由分为了节点亲和性和节点反亲和性。 节点亲和性是指在pod部署时&#xff0c;尽量(软策略)或者必须满足(硬策略)部署在某些节点上。 而节点反亲和性就是指&#xff0c;在节点部署中&#x…

Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

Java 获取当前时间之后的第一个周几&#xff0c;java获取当前日期的下一个周几 //获得入参的日期 Calendar cd Calendar.getInstance(); cd.setTime(date);// 获得入参日期是一周的第几天 int dayOfWeek cd.get(Calendar.DAY_OF_WEEK); // 获得入参日期相对于下周一的偏移量…

Kubectl 常用命令, 开发人员常用k8s命令

Kubectl 常用命令&#xff1a; 什么是常用&#xff0c;我用的&#xff0c;就是常用的&#x1f602; 一个日常使用k8s的开发 所需要知道的命令 越攒越多&#xff01; PS: 下面的[ 这里的内容 ]不填 [和 ] 备份job kubectl get job -n [命名空间] [job名称] -o yaml > backup.…

Access to XMLHttpRequest at file from origin ‘null‘ has been blocked by CORS policy谷歌浏览器本地打开项目js文件报错

Access to XMLHttpRequest at ‘file:///xxxxx/PQ.BaseInfo.proto’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https. 报错信息 意…

为什么网线接法要分交叉连接和直连连接两种方式

水晶头有两种连接方式T568A和T568B。网线的两头都使用同一标准连接就是直连线,两头使用不同的标准就是交叉线。

抖音直播原理解析-如何在 Web 中播放 FLV 直播流

Media Source Extensions API(MSE)媒体源扩展 API 提供了实现无插件且基于 Web 的流媒体的功能,不同于简单的使用video元素,video元素对于开发者来说完全是一个黑盒,浏览器自己去加载数据,加载完了自己解析,解码再播放,这个过程中开发者无法进行任何操作。利用 MSE API 开发者可以自定义获取流媒体数据并且还可以对数据做一些操作。MSE 的兼容性如下图所示。可以发现 MSE 的兼容性还算可以,IE 11 都支持。

/var/lib/docker/overlay2/xxxxx no such file or directory docker文件删除引发的问题

记一次误删引发的服务雪崩 K8s node节点磁盘报警&#xff0c;报警后我找到服务中占用磁盘最多的地方&#xff0c;在overlay2目录下&#xff0c;对下面的文件进行了删除 删除后&#xff0c;有状态服务先出现了问题&#xff0c;服务无法启动、停止、删除。 对节点进行重启后&…

mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

先贴一张图&#xff01; 第一步&#xff0c;“很重要” 在mysql中&#xff0c;有一个创建之初自带的库information_schema&#xff0c;这个库中包含着数据库相关信息&#xff0c;查询数据占用空间就是使用该库&#xff0c;所以首先进入这个库 -- 首先进入mysql系统库 use in…

手机的ip地址是固定的吗,每个手机ip地址一样吗?

简单点说,路由器开启了“DHCP功能”,会自动给连接路由器网络的设备自动分配IP地址,这包括有线网络和无线网络;当设备开启了DHCP功能之后,在路由器开启了DHCP功能的前提下,就会自动接收路由器分配的IP地址,不需要用户手动设置静态IP地址,用通俗的话来形容“DHCP”,它可以省去用户手动设置IP地址的过程。

程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

程序主动进行电话短信报警&#xff0c;自定义电话、短信、钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段&#xff0c;有一个叫做事件监控的东西&#xff0c;可以通过自定义事件上传来进行监控报警。 流程&#xff1a; 程序发现错误 -> 调用事件上报 -…

系统遇到并发瓶颈时的优化方向

1. 设计高质量代码优化Map 使用读写锁&#xff0c;读写锁 读多写少&#xff08;存储用户连接信息&#xff09; map不要太大。 2. 突破系统瓶颈 优化连接数 linux下的系统最大连接数 3. 降低对Cpu资源的使用 降低io 降低json使用 一次编码 多次使用 4. 降低对IO资源的使用 …