微服务架构组件梳理之Netflix停更之后该何去何从
自2018年底,Netflix陆续宣布Eureka、Hystrix等框架进入维护状态,不再进行新功能的开发。
恰逢最近我打算对公司的办公项目进行微服务架构升级,所以恶补了一番微服务相关知识,在这里进行一个小小的总结梳理。
2020年的微服务项目,应该用啥子框架呢?
一、微服务基本概念
保持对知识的敬畏,这里还是先复习下,微服务架构的基本概念。
引用wiki如下:
2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,
与其他服务使用 HTTP API 通信。同时服务会使用最小的规模的集中管理 (例如 Docker) 能力,服务可以用不同的编程语言与数据库等组件实现。
落实到代码上,就是将原来的各个业务包、业务模块,拆分成可以独立部署的一个个业务服务。
这样做好处很明显,业务分开之后,我们可以针对各个业务的访问量,细粒度的进行性能优化,扩容,针对性的提高项目的性能。
但是也会随之带来一些问题,如微服务之间相互调用性能、分布式事务、服务限流降级熔断、服务配置等。
所以,要做好一个微服务项目,就要使用框架来帮助我们解决上述问题,使开发人员更好的面向业务。
二、微服务架构应该考虑的问题
那么微服务架构中,如何满足上述所说,让开发人员更好的面向业务,应该考虑哪些问题呢?前辈们早就思考过了,这里梳理一下。
1、微服务的注册与发现
微服务的注册与发现是什么?
我理解,当你有一堆微服务时,一定涉及对每个微服务进行管理。
如何管理呢?首先,应该有个微服务花名册,有多少个微服务,都叫啥名,都住哪,这些基本信息统统记录在案。如果这些都不清楚,何谈管理?
怎么实现呢?
现微服务的注册和发现,一般都使用注册中心来统一管理。
现在注册中心框架有哪些?都有啥子区别呢?网上一大把资料,参考网络整理如下:
| Nacos | Eureka | Consul | Zookeeper | |
| 一致性协议 | CP+AP | AP | CP | CP |
| 健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
| 雪崩保护 | 有 | 有 | 无 | 无 |
| 访问协议 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
| SpringCloud集成 | 支持 | 支持 | 支持 | 支持 |
| Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 |
| K8S集成 | 支持 | 不支持 | 支持 | 不支持 |
| 自动注销实例 | 支持 | 支持 | 不支持 | 支持 |
上述表中有一个一致性协议,涉及到CAP理论,此理论是分布式架构中的重要理论,描述了一致性、可用性、分区容忍性,这里不展开描述了。
2、微服务调用
当把一个个的业务模块拆分成单个服务时,就会出现服务之间的互相调用问题。
这里要吐槽一下我们原始的项目,微服务之间调用,是通过访问一个单独服务,拿到目标服务的ip+port,然后通过RestTemplate请求。
这种方式弊端含泪整理如下:
(1)这种方式会产生大量的重复代码;
(2)单独服务很容易成为性能瓶颈,因为所有的项目在调用其他服务之前,都要先请求这个服务,这个问题线上已经爆发了/(ㄒoㄒ)/~~
(3)若微服务地址发生变化,需要重新登记配置;
(4)已经配置的微服务,不支持扩容,对!没有看错!不支持!
前人挖坑后人填,吐槽完成之后,言归正传,用什么框架可以解决微服务的调用问题呢?
Ribbon : 一个客户端负载均衡的工具,由Netflix公司开发,很不幸,已经进入了维护状态,不再进行新的功能开发。详情见官方github:https://github.com/Netflix/ribbon
Feign :内集成了Ribbon,可以通过注解,像本地调用似的跨域调用微服务接口。
OpenFeign :Spring Cloud在Feign的基础上,支持了SpringMvc的注解。
3、服务的限流、降级、熔断
首先,什么是服务限流、服务降级、服务熔断呢?
服务限流:限流就是限制流量,服务就是微服务,服务限流,即限制微服务的访问流量。流量是个抽象概念,具体到项目接口上,就是请求数或者线程数。
服务降级:
把服务分成多个等级,比如我是开饭店的,客人就餐,我提供的三档服务。
一档:点菜服务、入座服务、上菜服务、喂食服务、加饭服务;
二档:点菜服务、上菜服务、加饭服务;
三档:点菜服务、上菜服务。
服务降级,就是所有客人默认都是一档服务,但是当我忙不过来的时候,我将服务等级下调至二档或三档,保障我饭店能正常点菜、上菜就行了,其余的非核心服务先不提供。
服务熔断:
还是拿餐馆举例子,我的饭店只能容纳100人同时就餐,忽然有一天,一下来了1000人吃饭。
为了不把我的餐馆挤爆,我决定,先不对外提供服务,来一个客人,我就赶走一个,等一段时间过后,我尝试着接纳一些人就餐,确认没问题了,我再正常营业。
概念梳理完毕,我们发现,不管是服务熔断还是降级,对于用户来说,都是非常不好的体验,那我们为啥还要这样做呢?回答这个问题,我们还是以开饭店来举例子:
先说明,我们现在的项目,是微服务项目,对应到“饭店例子”中,我们开的是连锁饭店,而不是一个小餐馆。
屁股决定思维,既然我们开的是连锁饭店,就得以大局为重。一个饭店暂停营业了,虽然少了当天的营业额,但是对于我们整个的品牌影响不大。反过来,如果不进行服务熔断等措施,用户强行就餐之后,体验不好,回头上网就是一个差评,这样影响的就不只是一个饭店的营业额,而是整个品牌的价值,后果严重的很。
从连锁饭店回到微服务项目,一个微服务不好用了,我们进行熔断降级,可减少其对我们整个微服务框架的影响,但是,如果不进行处理,可能由于一个节点失效,到时所有微服务雪崩,到最后整个微服务项目瘫痪,这显然是我们无法承受的,所以,服务熔断、限流、降级,在微服务架构中,很重要,必须做。
话又说回来了,咋做?
前辈们早就想好,现在人们大多数使用如下两个框架:
Hystrix : 由Netflix公司开发的一个进行服务熔断、降级的框架,但是很不幸,进入维护状态了
sentinel : 阿里开发的开源框架,提供可视化界面,多语言支持的服务熔断降级限流框架
4、微服务网关
微服务项目,首先他得是对外提供服务的,上面几个视角我们多是从微服务之间相互调用这一场景来考虑,这一小节,我们得转变视角,由内部看到外部,当客户端或者是用户,调用微服务的应用接口时,我们需要考虑哪些问题呢?
(1)首先需要考虑的是寻址,微服务伴随着服务升级,扩容等,其IP、端口一定是在变着的,微服务内部之间调用尚可以通过注册中心+Feign来进行,但是客户端的请求接口调用地址如何处理呢?
(2)其次是权限认证,微服务如何知道该次请求的客户端是合法的呢?
有人说,可以每个微服务节点都写一套权限认证逻辑(现在我们原始项目就是这么做的/(ㄒoㄒ)/~~),这种方法是不可取的,会造成代码膨胀,同时,若权限认证逻辑变更,得挨个修改每个项目中的代码,要疯掉了。
或者写一个统一权限认证工具,通过jar包形式集成在各个项目中。这种方式尚可,但是如果我要进行版本升级,得所有微服务挨个停止、升级、重启,运维同事估计要提着大刀来砍你了。
(3)对于外部的请求,我想知道哪些请求是比较热门的,每天有多少客户端请求,并记录日志,这个需求如何处理呢?
问题一旦可以明确,就相当于解决了一半。这个时候,很明显需要一个大管家,管理客户端到服务器的请求,来解决我们上述这些问题,所以微服务网关这个概念出现了。
微服务网关概念,摘自wiki百科:
转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
微服务网关主要职能:
请求接入:作为所有 API 接口服务请求的接入点,管理所有的接入请求;
业务聚合:作为所有后端业务服务的聚合点,所有的业务服务都可以在这里被调用;
中介策略:实现安全、验证、路由、过滤、流控,缓存等策略,进行一些必要的中介处理;
统一管理:提供配置管理工具,对所有 API 服务的调用生命周期和相应的中介策略进行统一管理。
(参考https://www.jianshu.com/p/a2f292221b5c)
微服务网关框架:
Zuul : 由Netflix公司开发,已经进入维护状态了。
Zuul2 : 还在开发过程中,多次跳票。
Spring Cloud GateWay :Spring Cloud开发,在SpringMvc上构建的API网关框架。
5、配置统一管理
原来的单应用项目,一个项目的配置文件集中的写在几个配置文件中,由于项目文件不多,维护、配置起来都比较方便,不能算作问题。但是微服务架构下,单个服务都拥有着自己的配置文件,当服务变多,再考虑到开发、测试、生产环境使用不同的配置文件,配置工作一下就变得复杂了起来,需要进行统一管理,方便配置修改及部署上线。
现在开源的配置管理框架:
Spring Cloud Config : Spring开发的配置服务,可以从github、支持JDBC的数据库或者其他文件系统中拉取配置。
Nacos :nacos除了有注册中心的功能之外,还可以提供配置管理服务。
6、分布式事务
在单应用的项目中,我们的事务一般交给数据取进行处理,但是微服务项目,不同的微服务连接着不同的数据库,原来的事务处理模式已经不可行了,那么在分布式微服务的项目中,我们该如何进行事务管理呢?
现在有通用的四种解决思路:
两阶段提交(2PC)
TCC(Try-Confirm-Cancel)
可靠的消息最终一致性
最大努力通知
分布式事务知识点很多,这里对四种思路不进行详细的介绍,有兴趣的同学自行学习。这里直接给出参考结果:Seata。下面借用seata官网一句话:
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
三、整理
回到本文的最一开始,自2018年底,Netflix陆续宣布Eureka、Hystrix等框架进入维护状态,不再进行新功能的开发,那么2020年,微服务项目该用啥子框架呢?推荐整理如下:
微服务的注册与发现:Nacos、Consul、Zookeeper
微服务调用:OpenFeign
服务降级、限流、熔断:Sentinel
微服务网关 :Spring Cloud Gateway
配置统一管理:Nacos
分布式事务:Seata
本文从上述六个角度进行了微服务常用框架的梳理,一个好的微服务项目,需要考虑的点多的很,各位看官,仅供参考。
微服务架构组件梳理之Netflix停更之后该何去何从的更多相关文章
- 微服务架构 | 5.1 使用 Netflix Hystrix 断路器
目录 前言 1. Hystrix 基础知识 1.1 Hystrix 断路器强调调用 1.2 两大类别的 Hystrix 实现 1.3 舱壁策略 1.4 Hystrix 在远程资源调用失败时的决策过程 ...
- 几种常见的微服务架构方案简述——ZeroC IceGrid、Spring Cloud、基于消息队列
微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...
- 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm
微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...
- 微服务架构 vs. SOA架构
面向服务架构(SOA)已经存在有些年头了,这是一种用于设计软件的伟大原则.在SOA中,所有组件都是独立自主的,并能为其他组件提供服务.要替换掉系统中的某些部分而不对整个系统造成较大的影响本是个难题,然 ...
- 微服务理论之五:微服务架构 vs. SOA架构
一.面向服务的架构SOA 面向服务的架构是一种软件体系结构,应用程序的不同组件通过网络上的通信协议向其他组件提供服务.通信可以是简单的数据传递,也可以是两个或多个服务彼此协调连接.这些独特的服务执行一 ...
- 微服务之旅:从Netflix OSS到 Istio Service Mesh
在这篇文章中,我们从Netflix开始,通过Envoy和Istio的崛起,快速浏览微服务的历史. 微服务是具有边界上下文的松散耦合服务,使您能够独立开发,部署和扩展服务.它还可以定义为构建独立开发和部 ...
- Re:从0开始的微服务架构:(一)重识微服务架构--转
原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_ ...
- 【微服务架构】SpringCloud组件和概念介绍(一)
一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...
- SpringCloud微服务架构分布式组件如何共享session对象
一.简单做一个背景说明1.为说明问题,本文简单微服务架构示例如下 2.组件说明分布式架构,每个组件都是集群或者主备.具体说明如下:zuul service:网关,API调用都走zuul service ...
随机推荐
- Iconfont的代码使用
1.Iconfont官网 相关阅读: Iconfont-阿里巴巴矢量图标库 Iconfont-阿里巴巴矢量图标库-代码使用 2.下载代码 注意到把鼠标悬停到图标上,会出现三个按钮. 我们点击" ...
- 18、Java中的 数据结构
Java2中引入了新的数据结构 集合框架 Collection,下一节再谈论(非常重要,面试也常问). 1.枚举 (Enumeration) 1.1 Enumeration 源码: public in ...
- SqlServer 版本号
RTM (no SP) SP1 SP2 SP3 SP4 SQL Server 2014 codename Hekaton 12.00.2000.8 SQL Server 2012 ...
- C#LeetCode刷题之#367-有效的完全平方数(Valid Perfect Square)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3869 访问. 给定一个正整数 num,编写一个函数,如果 num ...
- Python 3.x pip安装报错ERROR: No matching distribution found for PIL
安装完成即可解决无法引入PIL的问题.
- hdfs学习(二)
一.HDFS文件限额配置 在多人共用HDFS的环境下,配置设置非常重要.特别是在Hadoop处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取.Hdfs的配额设定是针对目录而 ...
- ESLint 使用简介
C 语言诞生之初,程序员编写的代码风格各异,在移植时会出现一些因为不严谨的代码段导致无法被编译器执行的问题.于是在 1979 年,一款叫 lint[1] 的程序被开发出来,能够通过扫描源代码检测潜在的 ...
- 精讲RestTemplate第10篇-使用代理作为跳板发送请求
本文是精讲RestTemplate第10篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层 ...
- SpringMVC关于拦截器的使用
这个是基于之前的视图定位进行的. @ 目录 拦截器类:IndexInterceptor 配置拦截器 修改 index.jsp 效果 拦截器类:IndexInterceptor package inte ...
- goland2019.2破解方法
第一步:下载 jetbrains-agent.jar 链接:https://pan.baidu.com/s/1V2qZokAeAGcbsKDaoD9eSw 提取码:nrce 第二步:将下载的jetbr ...