首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客439678451号
山西大同大学 Java
发布于北京
关注
已关注
取消关注
@Java架go:
为什么大公司要使用微服务?你都知道吗?
这几年在 Java 工程师招聘时,会看到很多人的简历都写着使用了 Spring Cloud 做微服务实现,使用 Docker 做自动化部署,并且也会把这些做为自己的亮点。 而比较有趣的这其中以小公司出来的人为绝大多数,大的公司出来的人简历上倒是很少提这些东西。 对于我自己来说,从 2015 年就开始关注这一块,看过马丁·福勒最开始的关于微服务的论文、也看过不少对微服务的论证的英文文章和书,也研究过 Spring Cloud、Sofa 等开源实现以及 Service Mesh。 考虑到我们公司研发团队人力不足、基础设施不完善,当初是没有推行微服务的。 但随着看到上述的那种简历越来越多,有时候我也会疑问:难道真的不用微服务就落后了吗?公司的同事如果不掌握这些就真的没有竞争力了吗。 而随着最近公司业务的逐步提升,研发人员越来越多,借着在梳理公司的微服务落地计划时,也梳理了一下微服务的相关知识点,也是本文的主要内容。 主要从以下几个方面跟大家分享: 微服务是什么 为什么要采用微服务 微服务架构 架构设计模式 服务拆分 微服务框架 开篇之前先声明我对微服务的几点态度: 架构模式有很多,微服务不是唯一的选择也不是什么银弹。国内绝大多数中小公司引入微服务都是在盲目追新,也能看出做此种技术选型的工程师基础架构素质的不足。 “你必须长的足够高才能使用微服务”。微服务基础设施,尤其是容器技术、自动化部署、自动化测试这些不完备,微服务形同虚设,不会带来什么质的提升。 微服务架构的关键不在于具体的实现,而在于如何合理地划分服务边界以及组织架构是否相匹配。不考虑研发团队的规模和组成就盲目上微服务是不良的技术选型。 Spring Boot 是 Spring 全家桶的上层封装,并不是什么崭新的技术,也不是什么值得成为自己杀手锏的技术。 Spring Cloud 中 Spring Cloud Netflix 的组件是经过生产环境验证的,其他的则建议慎重选择。 微服务是什么 微服务起源于 2005 年 Peter Rodgers 博士在云端运算博览会提出的微 Web 服务(Micro-Web-Service),根本思想类似于 Unix 的管道设计理念。 2014 年,由 Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务架构风格是一种通过一套小型服务来开发单个应用的方法,每个服务运行在自己的进程中,并通过轻量级的机制进行通讯(HTTP API)。 关键的三点是: small automated lightweight 对比 SOA,微服务可以看做是 SOA 的子集,是轻量级的 SOA,粒度更细的服务,独立进程、数据分离,更注重敏捷、持续交付、DevOps 以及去中心化实践。 其共同的架构原理: 单一职责 关注分离:控制与逻辑相分离 模块化和分而治之 特点: 用服务进行组件化 围绕业务能力进行组织 是产品而非项目 端点智能化和哑管道: 控制逻辑都在端点,管道仅仅是传输 全自动化部署 语言和数据的去中心化控制 面向失败设计 渐进式设计 综合来看,其优缺点如下: 优点:模块的强边界;独立部署;技术选型的多样性。 缺点:分布式带来编程复杂度,远程调用的消耗;舍弃强一致性,实现最终一致性;操作复杂性要求有一个成熟的运维团队或者运维基础设施。 为什么要采用微服务 是否选择微服务取决于你要设计的系统的复杂度。微服务是用来把控复杂系统的,但是随之而来的就是引入了微服务本身的复杂度。 需要解决包括自动化部署、监控、容错处理、最终一致性等其他分布式系统面临的问题。即使已经有一些普遍使用的解决方案,但是仍然是有不小的成本的。 生产力和复杂度的关系如图所示,可见系统越复杂,微服务带来的收益越大。此外,无论是单体应用还是微服务,团队的技能都需要能够把控住。 马丁·福勒的一个观点是:除非管理单体应用的成本已经太复杂了(太大导致很难修改和部署),否则都不要考虑微服务。 大部分应用都应该选择单体架构,做好单体应用的模块化而不是拆分成服务。 因此,系统一开始采用单体架构,做好模块化,之后随着系统变得越来越复杂、模块/服务间的边界越来越清晰,再重构为微服务架构是一个合理的架构演化路径。 四个可以考虑上微服务的情况: 多人开发一个模块/项目,提交代码频繁出现大量冲突。 模块间严重耦合,互相依赖,每次变动需要牵扯多个团队,单次上线需求太多,风险大。 主要业务和次要业务耦合,横向扩展流程复杂。 熔断降级全靠 if-else。 微服务的三个阶段: 微服务 1.0:仅使用注册发现,基于 Spring Cloud 或者 Dubbo 进行开发。 微服务 2.0:使用了熔断、限流、降级等服务治理策略,并配备完整服务工具和平台。 微服务 3.0:Service Mesh 将服务治理作为通用组件,下沉到平台层实现,应用层仅仅关注业务逻辑,平台层可以根据业务监控自动调度和参数调整,实现 AIOps 和智能调度。 微服务架构 先决条件 微服务的先决条件如下: 快速的环境提供能力:依赖于云计算、容器技术,快速交付环境。 基本的监控能力:包括基础的技术监控和业务监控。 快速的应用部署能力:需要部署管道提供快速的部署能力。 Devops 文化:需要具有良好的持续交付能力,包括全链路追踪、快速环境提供和部署等,还需要快速的反应能力(对问题、故障的快速响应),开发和运维的协同工作。 此外,根据康威定律和逆康威定律(技术架构倒逼组织架构改进),组织架构也是一个很关键的因素。 对应于微服务架构,组织架构需要遵循以下原则: 一个微服务由一个团队维护,团队成员以三人为宜。 单个团队的任务和发展是独立的,不受其他因素影响。 团队是功能齐全、全栈、自治的,扁平、自我管理。 基础设施 微服务的推行需要依赖于很多底层基础设施,包括提供微服务的编译、集成、打包、部署、配置等工作,采用 PaaS 平台解决微服务从开发到运行的全生命周期管理,同时提供异构环境管理、容器资源隔离与互通、服务伸缩漂移、服务升级与回退、服务熔断与降级、服务注册与发现。 ①最基本的基础设施 进程间通讯机制:微服务是独立进程的,需要确定之间的通讯方式。 服务发现+服务路由:提供服务注册中心,服务提供者和消费者通过服务发现获取服务的信息从而调用服务,实现服务的负载均衡等。 服务容错:微服务架构中,由于服务非常多,往往是一个服务挂了,整个请求链路的服务都受到影响。 因此需要服务容错,在服务调用失败的时候能够处理错误或者快速失败,包括熔断、Fallback、重试、流控和服务隔离等。 分布式事务支持:随着业务拆分为服务,那么有时候不开避免的就是跨服务的事务,即分布式事务的问题。 原则是尽量避免分布式事务,如果无法避免那么可以使用消息系统或者 CQRS 和 Event Sourcing 方案来实现最终一致性。 如果需要强一致性,则有两阶段提交、三阶段提交、TCC 等分布式事务解决方案。 ②提升外部服务对接效率和内部开发效率 API 网关:负责外部系统的访问,跨横切面的公共层面的工作,包括安全、日志、权限控制、传输加密、请求转发、流量控制等。 典型的网关功能即对外暴露一个域名 xx.com,根据第一级目录做反向路由 xx.com/user,xx.com/trade。 每一级目录,如 user、trade 对应一个服务的域名。此外,API 网关也可以有服务编排的功能(不推荐)。 接口框架:规范服务之间通讯使用的数据格式、解析包、自解释文档,便于服务使用方快速上手等。 ③提升测试和运维效率 配置中心: 运行时配置管理能够解决动态修改配置并批量生效的问题。包括配置版本管理、配置项管理、节点管理、配置同步等。 持续交付:包括持续集成、自动化部署等流程。目的就是小步迭代,快速交付。 持续集成:这一部分并非是微服务特定的,对于之前的单体应用,此部分一般来说也是必要的。 主要是指通过自动化手段,持续地对代码进程编译构建、自动化测试,以得到快速有效的质量反馈,从而保证代码的顺利交付。 自动化测试包括代码级别的单元测试、单个系统的集成测试、系统间的接口测试。 自动化部署:微服务架构,节点数动辄上百上千,自动化部署能够提高部署速度和部署频率,从而保证持续交付。 包括版本管理、资源管理、部署操作、回滚操作等功能。而对于微服务的部署方式,包括蓝绿部署、滚动部署以及金丝雀部署。 ④进一步提升运维效率 服务监控:微服务架构下节点数目众多,需要监控的机器、网络、进程、接口等的数量大大增加,需要一个强大的监控系统,能够提供实时搜集信息进行分析以及实时分析之上的预警。 包括监控服务的请求次数、响应时间分布、最大/最小响应值、错误码分布等。 服务跟踪:跟踪一个请求的完整路径,包括请求发起时间、响应时间、响应码、请求参数、返回结果等信息,也叫做全链路跟踪。 通常的服务可以和服务监控做在一起,宏观信息由服务跟踪呈现,微观单个服务/节点的信息由服务监控呈现。服务跟踪目前的实现理论基本都是 Google 的 Dapper 论文。 服务安全:内网之间的微服务调用原则上讲应该是都可以互相访问写,一般并不需要权限控制,但有时候限于业务要求,会对接口、数据等方面有安全控制的要求。 此部分可以以配置的方式存在于服务注册中心中,和服务绑定,在请求时由做为服务提供者的服务节点进行安全策略控制。配置则可以存储在配置中心以方便动态修改。 在微服务数量很少的情况下,以上基础设施的优先级自上而下降低。否则,仅仅依赖人工操作,则投入产出比会很低。 还需要提到的是 Docker 容器技术。虽然这个对于微服务并不是必须的,但是容器技术轻量级、灵活、与应用依存、屏蔽环境差异的特性对于持续交付的实现是至关重要的,即使对于传统的单体应用也能够给其带来交付效率的大幅提升。 架构设计模式 在引入微服务之后,传统的单体应用变为了一个一个服务,之前一个应用直接提供接口给客户端访问的架构不再适用。 微服务架构下,针对不同设备的接口做为 BFF 层(Backend For Frontend),也叫做用户体验适配层,负责聚合、编排微服务的数据转换成前端需要的数据。 服务之间的调用则在允许的情况下(允许延迟)尽可能使用异步消息传递方式,如此形成面向用户体验的微服务架构设计模式。 如下图所示: Client→API Gateway→BFF(Backend For Frontend)→Downstream Microservices: 后台采用微服务架构,微服务可以采用不同的编程语言和不同的存储机制。 前台采用 BFF 模式对不同的用户体验(如桌面浏览器,Native App,平板响应式 Web)进行适配。 BFF、API Orchestration Layer,Edge Service Layer,Device Wrapper Layer 是相同的概念。 BFF 不能过多,过多会造成代码逻辑重复冗余。 可以将网关承担的功能,如 Geoip、限流、安全认证等跨横切面功能和 BFF 做在同一层,虽然增加了 BFF 层的复杂性,但能够得到性能优势。 服务拆分 微服务架构最核心的环节,主要是对服务的横向拆分。服务拆分就是将一个完整的业务系统解耦为服务,服务需要职责单一,之间没有耦合关系,能够独立开发和维护。 服务拆分不是一蹴而就的,需要在开发过程中不断地理清边界。在完全理清服务之前,尽量推迟对服务的拆分,尤其是对数据库的拆分。 拆分方法如下: 基于业务逻辑拆分 基于可扩展拆分 基于可靠性拆分 基于性能拆分 其中,对于无法修改的遗留系统,采用绞杀者模式:在遗留系统外面增加新的功能做成微服务方式,而不是直接修改原有系统,逐步的实现对老系统替换。 拆分过程需要遵守的规范如下: 先少后多、先粗后细(粒度) 服务纵向拆分最多三层,两次调用:Controller、组合服务、基础服务 仅仅单向调用,禁止循环调用 串行调用改为并行调用或者异步化 接口应该幂等 接口数据定义严禁内嵌,透传 规范化工程名 先拆分服务,等服务粒度确定后再拆分数据库。 微服务框架 上面讲述了微服务架构的众多基础设施,如果每一个基础设施都需要自己开发的话是非常巨大的开发工作。目前市面上已经有不少开源的微服务框架可以选择。 Spring Boot Spring Boot 是用来简化新 Spring 应用的初始搭建以及开发过程的。其虽然不是微服务框架,但其设计的初衷本质就是微应用的底层框架,因此非常适合用于微服务基础设施的开发以及微服务的应用开发。 尤其对于 Spring 技术栈的团队来说,基于 Spring Boot 开发微服务框架和应用是自然而然的一个选择。 Dubbo&Motan Dubbo 是阿里开源的服务治理框架。其出现在微服务理念兴起之前,可以看做是 SOA 框架的集大成之作。 但其仅仅包含了微服务基础设施的部分功能,诸如熔断、服务跟踪、网关等都没有实现: 服务发现:服务发布、订阅、通知。 高可用策略:失败重试(Failover)、快速失败(Failfast)、资源隔离 - 负载均衡 :最少活跃连接、一致性 Hash、随机请求、轮询等。 扩展性 :支持 SPI 扩展(service provider interface)。 其他 :调用统计、访问日志等。 Motan 则是微博开源的类似 Dubbo 的 RPC 框架,与 Dubbo 相比更轻量级。 Spring Cloud Spring Cloud 是基于 Spring Boot 实现的微服务框架,也可以看做一套微服务实现规范。 基本涵盖了微服务基础设施的方方面面,包括配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等。 其基于 Spring 生态,社区支持非常好。但其很多组件都没有经过生产环境验证,需要慎重选择。 Spring Cloud Netflix 是 Spring Cloud 的一个子项目,是 Spring 对 Netflix OSS 的集成实现。 基于 Netflix 的大规模使用,其中的已经被广泛使用的组件包括: Eureka:服务注册和服务发现 Ribbon:弹性而智能的进程间和服务通讯机制,客户端负载均衡 Hystrix:熔断器,在运行时提供延迟和容错的隔离 Zuul:服务网关 此外,另一个子项目 Spring Cloud Alibaba 则是 Alibaba 开源的基于 Spring Boot 的微服务框架,主要是对阿里云服务的支持。 Service Mesh 上述的微服务框架都是侵入式的,服务化的过程都需要进行代码改造。Service Mesh 则是下一代微服务架构,最明显的特征就是无入侵。采用 Sidecar 模式来解决系统架构微服务化后的服务间通信和治理问题。 如下图所示: 目前主流的开源实现包括: Linkerd 和 Envoy:以 Sidecar 为核心,关注如何做好 Proxy,并完成一些通用控制平面的功能。缺乏对这些 Sidecar 的管理和控制。 Istio 和 Conduit:目前最为流行的 Service Mesh 实现方案,集中在更加强大的控制平面(Sidecar 被称为数据平面)功能。 前者由 Google 和 IBM 合作,并使用了 Envoy 作为 Sidecar 部分的实现;后者则是 Linkerd 作者的作品。 相比起来,Istio 有巨头背景,功能强大,但可用性和易用性一直不高,Conduit 则相对简单、功能聚焦。 限于 Service Mesh 带来的性能延迟的开销以及 Sidecar 对分布复杂性的增加,其对大规模部署(微服务数目多)、异构复杂(交互协议/开发语言类型多)的微服务架构带来的收益会更大。 Sofastack 蚂蚁金服开源的构建金融级分布式架构的一套中间件。包括微服务开发框架、RPC 框架、服务注册中心、全链路追踪、服务监控、Service Mesh 等一整套分布式应用开发工具。 特别值得一提的是 SOFAMesh。其实对下一代微服务架构 Service Mesh 的大规模落地方案实践,基于 Istio 改进和扩展而来,应该是国内最为成熟的开源 Service Mesh 方案。 此外,需要提到 Kubernetes(K8s),其本身提供了部分的微服务特性支持(通过域名做服务发现),对代码无侵入。但服务调用、熔断这些都需要自己实现。 综上,目前公司技术团队技术栈是 Spring,并且已有服务的实现都是基于 Dubbo。 因此选择 Spring Cloud Netflix 做为基础的微服务框架,对其中不成熟或者缺乏的组件,选择业界更为成熟的组件替代即可: API 网关:Zuul。 服务注册中心:Dubbo。 配置中心:Disconf。 服务监控&全链路追踪:CAT。 服务开发框架:Spring Boot。 日志监控、告警:ELK+Elasalert。 流量控制:Sentinel。 消息队列:Kafka。
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-29 16:19
已编辑
上海大学 产品经理
从字节跳到美团,是我做的最正确选择
不是节子不好,而是这次跳槽对我本人来说是很正确的选择,对比两个厂的体验,可以给大家一些参考。节奏与压力:字节:强度绝对大于美团,早10晚10是常态,总在开会,开不完的会,各种文档@你,写不完的需求,神经经常处于精神紧绷状态,切实体会到工作到凌晨的崩溃感。美团:整体节奏相对更稳健成熟(这个要看部门)。同事关系也没有那么紧张,大家都务实,DDL是一定存在的,但基本都是可以商量着来,周末能做到和工作分离。工作模式:字节:给我的感觉就是「激进」,强目标导向,强调数据,喜欢创新,只要你的数据以及想法论证链路是闭环的,技术可支持,想法就能上线,得到市场的反馈,内部创新氛围浓厚。美团:更强调业务,一个产品策...
投递美团等公司10个岗位
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
07-30 14:54
干活最少的实习生因为长得漂亮转正了
这是一个吐槽,愤怒的吐槽,对社会不公平的吐槽!去年10月份的时候,我一路过关斩将,面了六轮,才拿到现在待的这个互联网大厂的暑期实习offer,到现在已经实习了半年多,结果今年3月底来了一个人,三面之后就直接进来了......(我为什么知道,是因为mt跟我说的)mt也觉得他简历挺水的,给我看了简历,双非只有一段小厂实习经验,我看不到任何的业务闪光点,但耐不过leader直接offer,等来了我才知道,原因是什么,原来是因为长得帅,身高180,三线爱豆脸,比较会穿后来他入职了,干活了,活被分的最少,难度也是最低的。但是他每天看着还挺忙,忙什么呢,忙着给领导提供情绪价值。比如每天早上给leader带...
一表renzha:
如果一个人认识不到颜值的重要性只能说他还没长大,从小到大的教育都告诉我们心灵美才是真的美,内在美大于外在美,但是现实会告诉你,外在美是绝对远远大于内在美的,好看的人就是会得到优待
工作中哪个瞬间让你想离职
点赞
评论
收藏
分享
06-30 20:13
影石Insta360_嵌入式软件部_音频嵌入式软件工程师
终于结束了提心吊胆的好几天
码农索隆:
牛波一
点赞
评论
收藏
分享
07-08 01:01
重庆大学 嵌入式软件开发
怎么提前批全挂啊?兄弟们帮我看下简历该怎么修改
实习经历没有,这个没办法,导师不放实习,兄弟们看看我这简历问题出在哪,投的是嵌入式软开岗位。
码农索隆:
你是块金子,但是不好意思,敢参加提前批的人,谁不是快金子
点赞
评论
收藏
分享
07-28 22:51
腾讯_CSIG_产品经理
腾讯内推腾讯内推码
欢迎大家投递哈,岗位多多,先到先得,感兴趣的话,腾讯全集团所有岗位都可以找我内推 热乎乎的内推码:EUTPZZRV 腾讯投递方式 腾讯为员工提供健全的福利保障和多样化的激励机制,助您实现财务和职业双丰收。 分享一些面经: 第一轮技术面 闭包作用及实际应用场景 HTTP/1.1、HTTP/2、HTTP/3的核心差异 实现红绿灯控制效果(异步时序逻辑) React Hooks的设计动机与类组件对比 浏览器事件代理原理及实际应用 手写Promise核心逻辑(包含resolve/reject) 数组去重与高频字符统计算法 Web安全防护措施(XSS、CSRF) 浏览器渲染流程与重排/重绘优化 跨域...
腾讯HR面2575人在聊
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
百度提前批,三面被推迟一周,喜提秋招第一凉
7605
2
...
虾皮秋招一面
3359
3
...
他拿大厂SSP Offer打牌是什么概念啊?25届双非之光
3237
4
...
百度提前批 三面
2902
5
...
小鹏offer
1668
6
...
虾皮一面凉经
1500
7
...
被猿辅导挂了简历,但我想说...
1486
8
...
上班一周,工资还没拿,先欠公司两千
1389
9
...
最强本科✌
1374
10
...
大学四年,我感觉我像个“孤勇者”
1300
创作者周榜
更多
正在热议
更多
#
简历上的经历如何包装
#
30103次浏览
825人参与
#
秋招被确诊为……
#
164462次浏览
757人参与
#
中兴秋招
#
206074次浏览
2300人参与
#
工作中哪个瞬间让你想离职
#
63953次浏览
570人参与
#
Offer比较,你最看重什么?
#
193980次浏览
1313人参与
#
和同事相处最忌讳的是__
#
24696次浏览
245人参与
#
找工作如何保持松弛感?
#
91922次浏览
1111人参与
#
26届的你,投了哪些公司?
#
46237次浏览
501人参与
#
你遇到最难的面试题目是_
#
16855次浏览
201人参与
#
我对___祛魅了
#
49237次浏览
442人参与
#
你最希望上岸的公司是?
#
135367次浏览
706人参与
#
虾皮求职进展汇总
#
249747次浏览
1869人参与
#
柠檬微趣工作体验
#
6782次浏览
40人参与
#
投格力的你,拿到offer了吗?
#
86935次浏览
584人参与
#
你跟室友的关系怎么样?
#
7386次浏览
111人参与
#
通信硬件岗投递时间线
#
18803次浏览
69人参与
#
你最讨厌面试问你什么?
#
28587次浏览
314人参与
#
什么样的背景能拿SSP?
#
38717次浏览
227人参与
#
地平线求职进展汇总
#
52692次浏览
370人参与
#
如何看待offer收割机的行为
#
817435次浏览
6096人参与
#
如何快速融入团队?
#
17058次浏览
206人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务