热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务之总体架构篇

一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率

一、单体架构存在的问题

 

 

缺点:

1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;

2、部署项目麻烦:庞大之后项目部署效率低,每次升级都需要全部构建打包部署;

3、扩展能力受限:集群只能复制整个系统,即使是某个模块压力很大,无法根据业务模块需要进行伸缩,计算密集型和IO密集型只能部署在一起,硬件成本加大;

4、技术选型受限:只能采用同一种语言,很难根据不同业务需求开发不同的模块;

综上,随着业务需求的发展,功能的不断增加,单体架构很难满足互联网时代业务快速变化的需要,为了解决这些问题,所以微服务架构开始变得流行了。

二、微服务架构

什么是微服务

国外架构师Martin Fowler在他的博客中这样描述微服务:

 

https://martinfowler.com/microservices/

微服务架构的特点:

1、每个小型服务都跑在独立的进程中;

2、可通过自动部署机制进行独立部署;

3、服务是松散耦合的,服务被拆分后,服务之间没有很强的依赖关系;

4、服务之间采用轻量级通信(通常有文本协议:http+json数据格式,更轻的二进制协议:grpc+protocol buffer);

微服务架构的优点:

1、易于开发和维护:一个服务只会关注一个特定的业务,业务依赖减少,代码量较少;

2、部署容易:某个业务的修改只需要重新部署这个服务;

3、扩展性提高:可以根据业务需求进行细粒度扩展,比如某个业务访问量加大只需要升级这个微服务的服务器性能或者增加新的节点;

4、技术栈比较灵活:可以根据不同业务选用不同的语言或数据库,比如面对并发比较高的业务可以选用go语言提供服务;

综上所述,在面对业务变化很大,系统越来越庞大的时候,单体架构表现的全是缺点,而微服务都是优点。

微服务架构带来的问题:

使用微服务构建的是分布式系统,带来了很多问题,例如跟踪、测试、部署、分布式事务、服务治理等,增加了开发难度和运维成本

 

 三、微服务架构中重要的组件

API网关

为什么需要API网关:

1、客户端如果直接请求后端微服务,后端服务是十分松散的,这样会增加客户端的调用复杂度,所以需要API网关把后端服务的接口统一起来;

2、API网关的路由转发功能可以把客户端对后端服务调用完全解耦,后端服务变化不用调整客户端;

3、API网关有统一认证、负载均衡、流量限制等这些功能,可以有效的保护后端服务;

4、在面向不同客户端时,可以增加不同的API网关,而不需要调整微服务;

API网关一般会具备的功能:权限认证、流量控制、路由转发、负载均衡、熔断保护、缓存、日志记录等。

下图是API网关与后端微服务的工作流程:

 

下图是API网关面向不同客户端的调用:

服务注册与发现

在微服务架构中,每个服务都有自己的IP、Port信息和上线下线状态,这就需要一个服务治理中心来管理这些服务。 服务注册与发现组件就是系统内部的DNS服务,服务调用者通过服务名称从注册中心解析到IP和Port再完成服务直接调用。 每个服务一上线就会注册到服务治理中心,同时服务治理中心也会通过心跳检查每个服务的健康状态。

服务注册与发现组件有很多,例如Euraka、Consul、ZooKeeper、Etcd等。下图是基于Consul的注册与发现架构图:

上面就是注册与发现的架构图,从上图中会发现几个问题,

1、每次请求都要请求Consul服务器性能并不高,可以在请求时对注册表做缓存,由定时器定时去拉取注册表来更新缓存,这样即解决了性能问题也保证高可用的注册与发现服务真的不可用也不影响服务之间的调用;

2、由于加了缓存,就会出现缓存更新不及时的情况,这样就会请求到下线的服务器导致请求失败,这就需要容错组件了,当请求到不可用的服务时需要做出超时、失败转移、重试等这些策略。

容错组件

为什么需要容错组件:

微服务架构的应用系统都是通过网络进行通信,网络往往会有不可靠性,所以微服务之间的调用并不是100%可用,而微服务之间难免会存在依赖关系,一旦发生某个服务不可用都有可能引发级联故障,导致整个应用不可用,这个就是“雪崩效应“”。

为了防止雪崩效应,所以我们必须有一套强大的容错机制,容错组件应该包含以下几点:

1、网络超时:当网络请求达到设定的超时时间时,让资源尽快释放;

2、熔断器:当请求异常次数达到设定值时打开熔断器,让请求直接返回失败,这样有效提高服务的响应效率也能保证别的服务不受影响,当熔断时间一过自动关闭熔断器让服务恢复正常使用;

3、重试机制:在网络调用中有时会存在部分服务提供者不可用的情况,当第一次请求失败时再重试时又能恢复正常,这样保证接口成功率,减少用户请求,也可以设置重试其他节点服务以实现失败转移效果;

4、服务降级:当部分服务不可用时为了不影响用户正常使用可能会降级返回设定好的结果,以提升用户体验;

比较有伸缩性的容错策略为:网络超时->熔断->重试。

具体实现的组件java有Hystrix,.net core有Polly。

熔断器就像是生活中的保险丝,保护用电安全,下图是熔断器的调用过程图:

统一配置中心

对于传统的单体应用,通常使用配置文件来保存所有配置,如果有多套环境,可以设定多个配置文件不同环境启用不同的配置文件,而在微服务架构中,由于服务特别的多,一旦配置发生变化,修改配置是件很麻烦的事情而而且手动修改很容易出现漏改的现象,这就需要集中管理配置。

统一配置中心需要满足如下需求:

1、系统运行期间可以动态调整而不用停止微服务;

2、配置更新后可以自动更新到各个微服务中去;

配置中心架构图:

具体实现配置中心可以使用ZooKeeper、Redis、RabbitMQ等。

 

服务跟踪与监控

为什么需要服务跟踪:

服务之间通过网络进行通信,由于会存在网络不可靠和网络延迟等网络问题,我们的服务调用就会因为网络问题引发很多异常,为了能跟踪每个请求,了解请求经过哪些微服务、请求耗费时间、网络延迟、业务处理时间等指标,那么就能更好的分析系统性能和瓶颈、解决系统问题。

服务跟踪的实现:

所有请求在进入API网关请求头就带上一个traceid,用来标识请求并记录请求开始处理时间和转发时间等,在服务调用之间也会带上traceid并记录所有的请求时间和信息,这样所有经过的服务都会记录到到请求,最后通过可视化工具提供服务跟踪查询。

 

服务监控:

一个正在运行的系统少不了监控系统的存在,当我们的服务器出现CPU、内存负荷高或者我们的业务代码出现警告或异常记录时,通过采集完整的服务器和微服务运行日志来监控每个微服务的运行状态,设置一定策略实现提前预警。

 


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
  • 用LGWR WORKER的例子介绍strace分析Oracle数据库行为的方法
    可观测性能力是IT运维的强有力的支撑。日志告警、指标是两种在运维中很常用的可观测性指标。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
author-avatar
闻雪儿1116_414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有