关于微服务的那点事儿

前言

传统的单体项目有什么问题?
想想看,当你的项目源码达到几十M时,开个新功能启动一次项目需要20分钟,稍微修改一下bug也要20分钟,团队的效率得有多么低

再想想看这么大的项目,必定伴随着复杂的业务,对于新人来说直接接触这么多复杂的业务,没有半年时间难以融入团队进行输出

最主要的是,每次稍微改动一点bug,就要发版整个单体项目,出问题影响的是全部功能,这个是不能忍的

如何拆分微服务?

确认服务边界上下文,所谓边界上下文就是服务自身的职责的划分,每个服务都是个高內聚的个体,各个服务之间不发生耦合,我们需要脱离表的束缚,从业务上梳理出模块之间的边界

拆分微服务以后会有哪些问题?

1.服务之间如何调用?

单体项目里无非就是方法调用,微服务之间调用需要走网络通讯,是一个序列化与反序列化的数据传输过程,对于spring cloud,使用http传输协议,由feign进行声明式调用

2.如何保证服务的高可用?

为了保证服务的可用性,微服务模块不可能是单点跑的,一定是集群部署的,对于调用方客户端来说,我们需要知道目前已经注册的服务都有哪些,并且还需要对服务有着动态的上下线感知,除了这些,客户端还需要一个负载均衡的机制吧?这个就是ribbon做的事。

引入一句忘了在哪看到的话,计算机的所有问题都可以通过引入中间层来解决。这个中间件就是注册中心。注册中心维护了所有的注册的微服务,客户端依赖注册中心来找到真实的微服务地址。这块细节比较多,比如注册中心挂了怎么办,微服务内部是不是应该有个缓存的注册列表?如果出现了网络分区,分区内的注册中心应该仍然可以正常使用(zookeeper别到处看了。。。说的就是你。。。)

3.容错机制

想想这样的一个场景,某个后端微服务接口出现异常,客户端的请求发生超时。用户一般有个习惯,哪里出问题了会一直点,那么每一个请求都对应了后台的某一个线程,这个线程还是一直在runing直到超时的,系统资源是有限的,次数多了,系统必然由一个接口的问题导致大面积的雪崩。

传统做法是http请求设置sessionTimeout与connectTimeout,但这不是解决问题的根本。

我们需要有个类似家里保险丝的熔断机制,当服务出现问题时,断路器自动熔断。除了这个,断路器还要有自我修复能力,比如过段时间放出一个请求,如果成功了就自我修复。再一个比较重要的是资源隔离,各个微服务接口调用不同的线程池或者信号灯。springcloud hystrix

4.链路追踪

对于单体项目,都是单个jvm内的方法调用,日志的上下文很容易查看。对于微服务就不太一样了,服务都在不同的jvm通过网络进行通信,如何能拿到完整的调用链路日志?我们需要在微服务调用时传递traceID,使用traceID追踪调用链路,这个就是sleuth做的事

5.微服务网关

还是对比传统单体项目,项目的controller接口都在一起,统一管理很容易,但是到微服务就不太一样了,各个项目都会提供rest服务,我们需要一个统一的网关来做权限验证、统一跨域处理、路由跳转等等。。。这个就是zuul负责的功能。

6.配置中心

单体项目的配置都是放在一个项目内,如果要改的配置的话,比如改mysql地址,直接改一次就想了,微服的配置分散在各个服务内部,我们需要一个集中式的配置管理 ,这个就是配置中心springcloud config,配置中心除了集中管理配置,还应该有修改配置实时同步到各个服务内的功能,做的好一点的配置中心,还有灰度发布,父子配置继承的概念。

7.日志落地

单体项目的日志都是落在服务器的某个固定磁盘上,微服务的日志分散在各个机器的各个角落,而且微服务都是集群部署的,查一个完整的调用日志特别痛苦,我们需要一个日志收集机制,集中统一管理日志。

日志收集:logbak → kafka→ logstash → elasticsearch,kabana负责图形化展示

8.服务上线

这么多微服务,如果靠人工运维手动copy jar包java -jar启动,恐怕要累死运维,不像传统项目就一个包直接发就行了。这个时候就聊到容器化技术了,这里需要感谢docker与k8s解放了生产力。

传统的虚拟机比如vmvare,他在宿主机上完全虚拟了一套操作系统,而docker与他最大的不同就是他直接运行于宿主机内核bootfs,没有硬件虚拟,依托于linux的资源隔离。这样使单机可以跑大量的docker服务,性能甚至与原始方式相差无二。

光靠docker肯定是不行的,还是没有解决我们需要挨个轮流运维各个微服务,这个时候就轮到k8s登场了,k8s负责对容器的编排,所谓编排,就是对容器的管理,可以配置我们在集群内要启动哪个服务,这个服务在集群内要有几个副本,k8s会自动帮忙我们完成这个工作,如果服务某段时间挂掉了,k8s还会帮我们自动重新拉起来。服务上线时,他还会有个平缓的上线过度,比如服务x有A、B、C三个节点,他会先中断A节点,启动个新服务,启动成功之后再中断B节点。。。。k8s还有很多强大的功能,是个未来的趋势,是DevOps的重要环节。可以说,不会k8s,就谈不上懂DevOps。

现在有个docker容器跟k8s编排,最后一个工作是如果把这套流程动起来,从拉代码到maven打包再到构建容器发布到k8s集群,这个流水线就是jenkins。

微服务架构

写在最后

微服务除了上面的难题,还有许多其他的难题,比如分布式事务等等。。。但是技术不能因为这些难题而放弃复杂业务项目的微服务,作为技术也不能盲目追新,微服务并不适合小项目。还是那句话,微服务好是好,但不是适合所有项目,看自身项目情况来决定微服务是否引入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354