前言

以后,微服务架构在很多公司都曾经落地施行了,上面用一张图简要概述下微服务架构设计中罕用组件。不能说曾经应用微服务好几年了,后果对微服务架构没有一个整体的认知,一个只懂搬砖的程序员不是一个好码农。

流量入口Nginx

在上图中能够看到,Nginx作为整个架构的流量入口,能够了解为一个内部的网关,它承当着申请的路由转发、负载平衡、动静拆散等性能。作为一个外围入口点,Nginx必定要采纳多节点部署,同时通过keepalived来实现高可用,从而保障整个平台的高可用。

举荐一个开源收费的 Spring Boot 实战我的项目:

https://github.com/javastacks/spring-boot-best-practice

网关

网关是在Nginx后的另外一个外围组件。它承当着申请鉴权,路由转发,协定转换,流量监控等一系列性能,上图中网关是采纳spring Cloud Gateway来实现业务网关的性能,在网关选型中,咱们还有其余的抉择,比方Zuul1,Zuul2,Kong等等,这些计划都有本人的劣势和局限性,咱们能够依据本人他们的特点来抉择到底选用哪一个计划。对于网关的深刻理解,能够参见之前的系列文章网关那点事,这里不做赘述。

上图中,Spring Cloud Gateway上面有jwt和OAuth2,其实这两个就是基于token的认证鉴权,个别互联网我的项目中,在登录模块都是反对微信或者qq登录,这就是用到OAuth2的受权登录。想深刻理解Oauth2相干细节,能够参考之前的Oauth2.0客户端服务端示例等系列文章。

业务组件

从下面的架构图中能够看到,网关之后就是咱们的业务组件了,能够了解就是拆分之后的微服务了,比方电商平台常见的账号服务、订单服务、发票服务、收银台服务等等。服务组件之间通过Feign来进行http调用,Feign集成Ribbon来实现客户端侧负载平衡。具体的服务畛域划分,服务限界上下文的设定,这就另外的常识了,如果想做好服务划分,DDD畛域驱动设计这块能够深刻理解下。

服务注册核心

不论是基于Dubbo实现的SOA,还是基于Spring Cloud拆分的微服务架构,服务注册核心都是必须的,咱们把所有的服务组件都注册到注册核心,进而实现服务的动静调用。常见能实现注册核心性能的有Zookeeper,Eureka,Nacos,Zookeeper在Dubbo中应用比拟多,目前公司服务微服务架构是基于Eureka的,Eureka如同目前不保护了。个别新的平台倡议间接集成Nacos,Nacos除了能做注册核心来应用,也能够作为分布式配置核心来应用,比Sping Cloud Config更好使。

缓存和分布式锁

在图中左下角,咱们能够看到Redis组件,咱们能够把Redis作为缓存来应用,把一些查问慢,使用率高的热点数据做缓存解决,能疾速进步接口响应工夫。同时redis在微服务中的一大应用场景就是分布式锁,传统的Sychronized和显示Lock锁显然是不能解决分布式并发问题。

为了保障Redis的高可用,能够采纳哨兵部署,不是三个redis节点,一主二从,同时部署三个哨兵节点,来实现故障转移,防止单点问题,如果Redis存储的数据量很大,达到了单节点的Redis的性能瓶颈,咱们也能够用Redis集群模式来实现分布式存储。

数据长久层

不论单体服务,还是微服务,数据长久层都是必须的,咱们是选用互联网我的项目常常应用的mysql作为DB,为了保障服务读写效率以及高可用性,咱们主从拆散模式,同时实现读写拆散,来保障mysql的读写性能。

随着业务量增长,单表的数据量达到性能瓶颈之后,咱们就要采纳分库分表来对数据库表进行程度拆分和垂直拆分了,具体如何进行正当的拆分,以及技术选型,这些和我的项目现有的表结构设计是非亲非故的,要思考后续的可拓展性,不能短期拆了一时爽,后续业务量增暴涨之后,服务器的性能不足以维持数据库的性能时,这时候要拆分服务器部署了。当然,个别企业的数据量级达不到那样的量级。

结构型数据存储

mysql比拟善于存储关系型数据,我的项目中有须要存储结构性数据的场景,比方存储JSON字符串,这种场景通过mysql来存储显然事不适合的。个别咱们会采纳Elasticsearch或者MangoDB来进行存储,如果业务中须要检索性能,更倡议应用Elasticsearch。Elasticsearch反对DSL,有比拟丰盛查问检索性能,甚至能实现GIS空间检索性能。

消息中间件

后面说到,微服务架构中,服务之间同步调用是通过Feign来实现的,那服务间的异步解耦就要通过MQ来实现了。尽管咱们能够通过多线程来实现异步调用,然而这种异步调用不反对长久化,可能会造成音讯失落,所以个别都集成RabbitMq或者RocketMq。

日志收集

在微服务架构中,通过一个组件,比如说订单服务都是多节点分布式部署,每个节点的log日志都是存储在节点本地,如果要查问日志,咱们难道要登录到各个节点找到对应的日志信息?这种查看日志必定是不行的。所以个别会引入ELK来做日志收集,和可视化展现查问。

  • Logstash 用来做日志收集工作,通常在Logstash前会加一个Filebeat,由Filebeat来收集日志,Logstash做数据转换工作。
  • Elasticsearch做数据存储,以及生成索引数据,便于Kibana做检索。
  • Kibana做数据的展现,以及查问检索性能,咱们通过检索关键词就能疾速的查问到想要日志信息。

任务调度核心

我的项目中常常会用到定时性能,单体利用中,咱们应用sping自带的Schedule,或者应用Quartz即可,在分布式应用中,咱们就要集成分布式定时器,比方Quartz(Quartz配合数据库表也是反对分布式定时工作的),还有Elastic-Job、XXL-JOB等等。

Elastic-job 当当网基于quartz 二次开发的弹性分布式任务调度零碎,功能丰富弱小,采纳zookeeper实现分布式协调,实现工作高可用以及分片。Elastic-Job是一个散布式调度的解决方案,由当当网开源,它由两个互相独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成,应用Elastic-Job能够疾速实现分布式任务调度。

XXL-JOB 是一个分布式任务调度平台(XXL是作者徐雪里姓名拼音的首字母),其外围设计指标是开发迅速、学习简略、轻量级、易扩大。将调度行为形象造成“调度核心”公共平台,而平台本身并不承当业务逻辑,“调度核心”负责发动调度申请。将工作形象成扩散的JobHandler,交由“执行器”对立治理,“执行器”负责接管调度申请并执行对应的JobHandler中业务逻辑。因而,“调度”和“工作”两局部能够互相解耦,进步零碎整体稳定性和扩展性。

分布式对象存储

我的项目中常常会有文件上传性能,比方图片,音频视频。在分布式架构中,咱们将文件存储在节点服务器上显然是不行的,这时候,咱们就须要引入分布式文件存储。常见计划有MinIo、阿里的OSS(免费),阿里FastDFS等等。

MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端反对Java、Net、Python、Javacript、Golang语言。

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行治理,性能包含:文件存储、文件同步、文件拜访(文件上传、文件下载)等,解决了大容量存储和的问题。特地适宜以文件为载体的在线服务,如相册网站、视频网站等等。

起源:blog.csdn.net/qq_28165595/article/details/128169770

更多文章举荐:

1.Spring Boot 3.x 教程,太全了!

2.2,000+ 道 Java面试题及答案整顿(2024最新版)

3.收费获取 IDEA 激活码的 7 种形式(2024最新版)

感觉不错,别忘了顺手点赞+转发哦!