个人网站百度推广收费,电子报 网站开发,开发公司设计管理部绩效考核,seo推广专员招聘微服务是什么
微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务(Micro-Web-Service)#xff0c;根本思想类似于Unix的管道设计理念。2014年#xff0c;由Martin Fowler 与 James Lewis共同提出了微服务的概念#xff0c;定义了微服务架构风格是一种通过…微服务是什么
微服务起源于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 仅使用注册发现基于SpringCloud或者Dubbo进行开发。 微服务2.0 使用了熔断、限流、降级等服务治理策略并配备完整服务工具和平台。 微服务3.0 Service Mesh将服务治理作为通用组件下沉到平台层实现应用层仅仅关注业务逻辑平台层可以根据业务监控自动调度和参数调整实现AIOps和智能调度。
微服务架构
先决条件 快速的环境提供能力 依赖于云计算、容器技术快速交付环境。 基本的监控能力 包括基础的技术监控和业务监控。 快速的应用部署能力 需要部署管道提供快速的部署能力。 Devops文化 需要具有良好的持续交付能力包括全链路追踪、快速环境提供和部署等还需要快速的反应能力对问题、故障的快速响应开发和运维的协同工作。
此外根据康威定律和逆康威定律技术架构倒逼组织架构改进组织架构也是一个很关键的因素。对应于微服务架构组织架构需要遵循以下原则 一个微服务由一个团队维护团队成员以三人为宜。 单个团队的任务和发展是独立的不受其他因素影响。 团队是功能齐全、全栈、自治的扁平、自我管理。
基础设施
微服务的推行需要依赖于很多底层基础设施包括提供微服务的编译、集成、打包、部署、配置等工作采用PaaS平台解决微服务从开发到运行的全生命周期管理同时提供异构环境管理、容器资源隔离与互通、服务伸缩漂移、服务升级与回退、服务熔断与降级、服务注册与发现。
最基本的基础设施 进程间通讯机制 微服务是独立进程的需要确定之间的通讯方式。 服务发现服务路由: 提供服务注册中心服务提供者和消费者通过服务发现获取服务的信息从而调用服务实现服务的负载均衡等。 服务容错 微服务架构中由于服务非常多往往是一个服务挂了整个请求链路的服务都受到影响因此需要服务容错在服务调用失败的时候能够处理错误或者快速失败包括熔断、fallback、重试、流控和服务隔离等。 分布式事务支持 随着业务拆分为服务那么有时候不可避免的就是跨服务的事务即分布式事务的问题。 原则是尽量避免分布式事务如果无法避免那么可以使用消息系统或者CQRS和Event Sourcing方案来实现最终一致性。 如果需要强一致性则有两阶段提交、三阶段提交、TCC等分布式事务解决方案。
提升外部服务对接效率和内部开发效率 API网关: 负责外部系统的访问负责跨横切面的公共层面的工作包括安全、日志、权限控制、传输加密、请求转发、流量控制等。 典型的网关功能即对外暴露一个域名xx.com根据第一级目录做反向路由xx.com/userxx.com/trade。 每一级目录如user、trade对应一个服务的域名。 此外API网关也可以有服务编排的功能不推荐。 接口框架: 规范服务之间通讯使用的数据格式、解析包、自解释文档便于服务使用方快速上手等。
提升测试和运维效率 持续集成 这一部分并非是微服务特定的对于之前的单体应用此部分一般来说也是必要的。 主要是指通过自动化手段持续地对代码进程编译构建、自动化测试以得到快速有效的质量反馈从而保证代码的顺利交付。 自动化测试包括代码级别的单元测试、单个系统的集成测试、系统间的接口测试。 自动化部署 微服务架构节点数动辄上百上千自动化部署能够提高部署速度和部署频率从而保证持续交付。 包括版本管理、资源管理、部署操作、回滚操作等功能。 而对于微服务的部署方式包括蓝绿部署、滚动部署以及金丝雀部署。 配置中心: 运行时配置管理能够解决动态修改配置并批量生效的问题。 包括配置版本管理、配置项管理、节点管理、配置同步等。 持续交付 包括持续集成、自动化部署等流程。 目的就是小步迭代快速交付。
进一步提升运维效率 服务监控: 微服务架构下节点数目众多需要监控的机器、网络、进程、接口等的数量大大增加需要一个强大的监控系统能够提供实时搜集信息进行分析以及实时分析之上的预警。 包括监控服务的请求次数、响应时间分布、最大/最小响应值、错误码分布等 服务跟踪 跟踪一个请求的完整路径包括请求发起时间、响应时间、响应码、请求参数、返回结果等信息也叫做全链路跟踪。 通常的服务监控可以和服务监控做在一起宏观信息由服务跟踪呈现微观单个服务/节点的信息由服务监控呈现。 服务跟踪目前的实现理论基本都是Google的Dapper论文。 服务安全 内网之间的微服务调用原则上讲应该是都可以互相访问写一般并不需要权限控制但有时候限于业务要求会对接口、数据等方面有安全控制的要求。 此部分可以以配置的方式存在于服务注册中心中和服务绑定在请求时由做为服务提供者的服务节点进行安全策略控制。 配置则可以存储在配置中心以方便动态修改。
在微服务数量很少的情况下以上基础设施的优先级自上而下降低。否则仅仅依赖人工操作则投入产出比会很低。
还需要提到的是Docker容器技术。虽然这个对于微服务并不是必须的但是容器技术轻量级、灵活、与应用依存、屏蔽环境差异的特性对于持续交付的实现是至关重要的即使对于传统的单体应用也能够给其带来交付效率的大幅提升。
架构设计模式
在引入微服务之后传统的单体应用变为了一个一个服务之前一个应用直接提供接口给客户端访问的架构不再适用。微服务架构下针对不同设备的接口做为BFF层Backend For Frontend也叫做用户体验适配层负责聚合、编排微服务的数据转换成前端需要的数据。服务之间的调用则在允许的情况下允许延迟尽可能使用异步消息传递方式如此形成面向用户体验的微服务架构设计模式。如下图所示 Client - API Gateway - BFFBackend For Frontend - Downstream Microservices 后台采用微服务架构微服务可以采用不同的编程语言和不同的存储机制。 前台采用BFF模式对不同的用户体验如桌面浏览器Native App平板响应式Web进行适配。 BFF、API Orchestration LayerEdge Service LayerDevice Wrapper Layer是相同的概念。 BFF不能过多过多会造成代码逻辑重复冗余。 可以将网关承担的功能如Geoip、限流、安全认证等跨横切面功能和BFF做在同一层虽然增加了BFF层的复杂性但能够得到性能优势。
服务拆分
微服务架构最核心的环节主要是对服务的横向拆分。服务拆分就是讲一个完整的业务系统解耦为服务服务需要职责单一之间没有耦合关系能够独立开发和维护。
服务拆分不是一蹴而就的需要在开发过程中不断地理清边界。在完全理清服务之前尽量推迟对服务的拆分尤其是对数据库的拆分。
拆分方法如下 基于业务逻辑拆分 基于可扩展拆分 基于可靠性拆分 基于性能拆分
其中对于无法修改的遗留系统采用绞杀者模式在遗留系统外面增加新的功能做成微服务方式而不是直接修改原有系统逐步的实现对老系统替换。
拆分过程需要遵守的规范如下 先少后多、先粗后细粒度 服务纵向拆分最多三层两次调用 Controller、组合服务、基础服务 仅仅单向调用禁止循环调用 串行调用改为并行调用或者异步化 接口应该幂等 接口数据定义严禁内嵌透传 规范化工程名 先拆分服务等服务粒度确定后再拆分数据库。
微服务框架
上面讲述了微服务架构的众多基础设施如果每一个基础设施都需要自己开发的话是非常巨大的开发工作。目前市面上已经有不少开源的微服务框架可以选择。 Spring Boot Spring Boot是用来简化新Spring应用的初始搭建以及开发过程的。其虽然不是微服务框架但其设计的初衷本质就是微应用的底层框架因此非常适合用于微服务基础设施的开发以及微服务的应用开发。尤其对于Spring技术栈的团队来说基于Spring Boot开发微服务框架和应用是自然而然的一个选择。 DubboMotan Dubbo阿里开源的服务治理框架。其出现在微服务理念兴起之前可以看做是SOA框架的集大成之作。但其仅仅包含了微服务基础设施的部分功能诸如熔断、服务跟踪、网关等都没有实现。 Motan则是微博开源的类似Dubbo的RPC框架与Dubbo相比更轻量级。 服务发现 服务发布、订阅、通知 高可用策略 失败重试Failover、快速失败Failfast、资源隔离 - 负载均衡 最少活跃连接、一致性 Hash、随机请求、轮询等 扩展性 支持 SPI 扩展service provider interface 其他 调用统计、访问日志等 Spring Cloud Spring Cloud是基于Spring Boot实现的微服务框架也可以看做一套微服务实现规范。基本涵盖了微服务基础设施的方方面面包括配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等。其基于Spring生态社区支持非常好。但其很多组件都没有经过生产环境验证需要慎重选择。 Spring Cloud Netflix是Spring Cloud的一个子项目是Spring对Netflix OSS的集成实现。基于Netflix的大规模使用其中的已经被广泛使用的组件包括 此外另一个子项目Spring Cloud Alibaba则是Alibaba开源的基于Spring Boot的微服务框架主要是对阿里云服务的支持。 Eureka 服务注册和服务发现 Ribbon 弹性而智能的进程间和服务通讯机制客户端负载均衡 Hystrix 熔断器在运行时提供延迟和容错的隔离 Zuul: 服务网关 Service Mesh 上述的微服务框架都是侵入式的服务化的过程都需要进行代码改造。Service Mesh则是下一代微服务架构最明显的特征就是无入侵。采用sidecar模式来解决系统架构微服务化后的服务间通信和治理问题。如下图所示 目前主流的开源实现包括 限于Service Mesh带来的性能延迟的开销以及sidecar对分布复杂性的增加其对大规模部署(微服务数目多)、异构复杂(交互协议/开发语言类型多)的微服务架构带来的收益会更大。 Linkerd和Envoy 以 sidecar 为核心关注如何做好proxy并完成一些通用控制平面的功能。 缺乏对这些sidecar的管理和控制。 Istio和Conduit 目前最为流行的Service Mesh实现方案集中在更加强大的控制平面(sidecar被称为数据平面)功能。 前者由Google和IBM合作并使用了Envoy作为sidecar部分的实现 后者则是Linkerd作者的作品。 相比起来Istio有巨头背景功能强大但可用性和易用性一直不高Conduit则相对简单、功能聚焦。 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
最后
送大家一个小福利点击领取Java全套进阶资料 7718)] API网关 Zuul 服务注册中心 Dubbo 配置中心 disconf 服务监控全链路追踪 CAT 服务开发框架 Spring Boot 日志监控、告警 ELK Elasalert 流量控制 Sentinel 消息队列 Kafka
最后
送大家一个小福利点击领取Java全套进阶资料
[外链图片转存中…(img-1eFhDB6L-1625046737720)]
[外链图片转存中…(img-mP42HeGT-1625046737721)]