编程语言
首页 > 编程语言> > 晒出收入,程序员Java面试宝典下载

晒出收入,程序员Java面试宝典下载

作者:互联网

微服务是什么

微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务(Micro-Web-Service),根本思想类似于Unix的管道设计理念。2014年,由Martin Fowler 与 James Lewis共同提出了微服务的概念,定义了微服务架构风格是一种通过一套小型服务来开发单个应用的方法,每个服务运行在自己的进程中,并通过轻量级的机制进行通讯(HTTP API)。关键的三点是small、automated以及lightweight

对比SOA,微服务可以看做是SOA的子集,是轻量级的SOA,粒度更细的服务,独立进程、数据分离,更注重敏捷、持续交付、DevOps以及去中心化实践。其共同的架构原理

特点

综合来看,其优缺点如下:

优点

缺点

为什么要采用微服务

是否选择微服务取决于你要设计的系统的复杂度。微服务是用来把控复杂系统的,但是随之而来的就是引入了微服务本身的复杂度。需要解决包括自动化部署、监控、容错处理、最终一致性等其他分布式系统面临的问题。即使已经有一些普遍使用的解决方案,但是仍然是有不小的成本的。

image

生产力和复杂度的关系如图所示,可见系统越复杂,微服务带来的收益越大。此外,无论是单体应用还是微服务,团队的技能都需要能够把控住。

马丁.福勒的一个观点是:除非管理单体应用的成本已经太复杂了(太大导致很难修改和部署),否则都不要考虑微服务。大部分应用都应该选择单体架构,做好单体应用的模块化而不是拆分成服务。

因此,系统一开始采用单体架构,做好模块化,之后随着系统变得越来越复杂、模块/服务间的边界越来越清晰,再重构为微服务架构是一个合理的架构演化路径。

四个可以考虑上微服务的情况

  1. 多人开发一个模块/项目,提交代码频繁出现大量冲突。

  2. 模块间严重耦合,互相依赖,每次变动需要牵扯多个团队,单次上线需求太多,风险大。

  3. 主要业务和次要业务耦合,横向扩展流程复杂。

  4. 熔断降级全靠if-else。

微服务的三个阶段

  1. 微服务1.0:

    仅使用注册发现,基于SpringCloud或者Dubbo进行开发。

  2. 微服务2.0:

    使用了熔断、限流、降级等服务治理策略,并配备完整服务工具和平台。

  3. 微服务3.0:

    Service Mesh将服务治理作为通用组件,下沉到平台层实现,应用层仅仅关注业务逻辑,平台层可以根据业务监控自动调度和参数调整,实现AIOps和智能调度。

微服务架构

先决条件

此外,根据康威定律和逆康威定律(技术架构倒逼组织架构改进),组织架构也是一个很关键的因素。对应于微服务架构,组织架构需要遵循以下原则:

  1. 一个微服务由一个团队维护,团队成员以三人为宜。

  2. 单个团队的任务和发展是独立的,不受其他因素影响。

  3. 团队是功能齐全、全栈、自治的,扁平、自我管理。

基础设施

微服务的推行需要依赖于很多底层基础设施,包括提供微服务的编译、集成、打包、部署、配置等工作,采用PaaS平台解决微服务从开发到运行的全生命周期管理,同时提供异构环境管理、容器资源隔离与互通、服务伸缩漂移、服务升级与回退、服务熔断与降级、服务注册与发现。

  1. 最基本的基础设施
  1. 提升外部服务对接效率和内部开发效率
  1. 提升测试和运维效率
  1. 进一步提升运维效率

在微服务数量很少的情况下,以上基础设施的优先级自上而下降低。否则,仅仅依赖人工操作,则投入产出比会很低。

还需要提到的是Docker容器技术。虽然这个对于微服务并不是必须的,但是容器技术轻量级、灵活、与应用依存、屏蔽环境差异的特性对于持续交付的实现是至关重要的,即使对于传统的单体应用也能够给其带来交付效率的大幅提升。

架构设计模式

在引入微服务之后,传统的单体应用变为了一个一个服务,之前一个应用直接提供接口给客户端访问的架构不再适用。微服务架构下,针对不同设备的接口做为BFF层(Backend For Frontend),也叫做用户体验适配层,负责聚合、编排微服务的数据转换成前端需要的数据。服务之间的调用则在允许的情况下(允许延迟)尽可能使用异步消息传递方式,如此形成面向用户体验的微服务架构设计模式。如下图所示:

Client -> API Gateway -> BFF(Backend For Frontend) -> Downstream Microservices

服务拆分

微服务架构最核心的环节,主要是对服务的横向拆分。服务拆分就是讲一个完整的业务系统解耦为服务,服务需要职责单一,之间没有耦合关系,能够独立开发和维护

服务拆分不是一蹴而就的,需要在开发过程中不断地理清边界。在完全理清服务之前,尽量推迟对服务的拆分,尤其是对数据库的拆分。

拆分方法如下:

其中,对于无法修改的遗留系统,采用绞杀者模式:在遗留系统外面增加新的功能做成微服务方式,而不是直接修改原有系统,逐步的实现对老系统替换。

拆分过程需要遵守的规范如下:

微服务框架

上面讲述了微服务架构的众多基础设施,如果每一个基础设施都需要自己开发的话是非常巨大的开发工作。目前市面上已经有不少开源的微服务框架可以选择。

  1. Spring Boot

    Spring Boot是用来简化新Spring应用的初始搭建以及开发过程的。其虽然不是微服务框架,但其设计的初衷本质就是微应用的底层框架,因此非常适合用于微服务基础设施的开发以及微服务的应用开发。尤其对于Spring技术栈的团队来说,基于Spring Boot开发微服务框架和应用是自然而然的一个选择。

  2. Dubbo&&Motan

    Dubbo阿里开源的服务治理框架。其出现在微服务理念兴起之前,可以看做是SOA框架的集大成之作。但其仅仅包含了微服务基础设施的部分功能,诸如熔断、服务跟踪、网关等都没有实现。

    Motan则是微博开源的类似Dubbo的RPC框架,与Dubbo相比更轻量级。

  1. Spring Cloud

    Spring Cloud是基于Spring Boot实现的微服务框架,也可以看做一套微服务实现规范。基本涵盖了微服务基础设施的方方面面,包括配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等。其基于Spring生态,社区支持非常好。但其很多组件都没有经过生产环境验证,需要慎重选择。

    Spring Cloud Netflix是Spring Cloud的一个子项目,是Spring对Netflix OSS的集成实现。基于Netflix的大规模使用,其中的已经被广泛使用的组件包括:

    此外,另一个子项目Spring Cloud Alibaba则是Alibaba开源的基于Spring Boot的微服务框架,主要是对阿里云服务的支持。

  1. Service Mesh

    上述的微服务框架都是侵入式的,服务化的过程都需要进行代码改造。Service Mesh则是下一代微服务架构,最明显的特征就是无入侵。采用sidecar模式来解决系统架构微服务化后的服务间通信和治理问题。如下图所示:

    目前主流的开源实现包括:

    限于Service Mesh带来的性能延迟的开销以及sidecar对分布复杂性的增加,其对大规模部署(微服务数目多)、异构复杂(交互协议/开发语言类型多)的微服务架构带来的收益会更大。

  1. Sofastack

    蚂蚁金服开源的构建金融级分布式架构的一套中间件。包括微服务开发框架、RPC框架、服务注册中心、全链路追踪、服务监控、Service Mesh等一整套分布式应用开发工具。

    特别值得一提的是SOFAMesh。其是对下一代微服务架构Service Mesh的大规模落地方案实践,基于 Istio改进和扩展而来,应该是国内最为成熟的开源Service Mesh方案。

此外,需要提到Kubernetes(K8s),其本身提供了部分的微服务特性支持(通过域名做服务发现),对代码无侵入。但服务调用、熔断这些都需要自己实现。

综上,目前公司技术团队技术栈是Spring,并且已有服务的实现都是基于Dubbo,因此选择Spring Cloud Netflix做为基础的微服务框架,对其中不成熟或者缺乏的组件,选择业界更为成熟的组件替代即可。

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

标签:服务,Service,部署,Spring,宝典,晒出,Java,拆分,架构
来源: https://www.cnblogs.com/hgysvadavvc/p/15366237.html