谷粒商城-微服务架构图
原文 :谷粒商城-微服务架构图 上帝视角分析 - osc_9reytqkm的个人空间 - OSCHINA - 中文开源技术交流社区
https://my.oschina.net/u/4346209/blog/4950015
整个项目采用前后端分离开发,外网部署前台项目、内网部署后台项目。本文以客户使用客户端访问网站,向后台发送请求这一条线索对上图进行分析。
文章目录
一、Nginx集群→API网关
请求首先到达Nginx集群
,并由Nginx将请求转交给API网关
。
项目中使用SpringCloud Gateway技术作为API网关。
二、API网关→服务模块
第二步,API网关
拿到请求后进行认证授权,如果认证合法,就由API网关将请求动态路由到指定的业务模块
。
动态路由
:因为这条请求可能是调用商品服务、购物车服务、搜索服务、等众多服务中的一种,所以需要动态路由。认证授权
:由网关进行。
1.Ribbon实现负载均衡
由API网关
将请求动态路由到指定的业务模块
时,如果该业务模块存在多个,就需要在业务集群中使用负载均衡技术进行统筹管理。
业务集群中使用
Ribbon组件
实现负载均衡。
2.Sentinel进行熔断降级
由API网关
将请求动态路由到指定的业务模块
时,如果某些服务出现问题,就需要在API网关中使用熔断降级进行管理。
API网关中使用
Sentinel组件
进行熔断降级。(该技术由 Spring Cloud Alibaba提供)
- 注:Sentinel组件在本项目中还实现了令牌限流的功能。
三、服务模块对请求进行处理
请求路由到服务模块后,服务模块对请求进行处理。
SpringBoot
:每个微服务模块都是使用SpringBoot技术进行编写。
远程调用
:使用SpringCloud 的Feign组件
进行远程调用。(服务之间可能会有互相调用,如订单服务调用商品服务查询商品信息。)
OAuth2.0认证中心
:除了一般的登录,还使用OAuth2.0整合了社交登录。(额外判断了某些请求是否需要登陆后才能进行处理)SpringSecurity
:使用SpringSecurity进行安全与权限控制。
四、数据存储解决方案
1.存储数据
服务处理请求时,免不了要使用数据库与缓存进行数据的存储
。
Redis集群
:使用Sentinel分片集群+Shard哨兵集群
进行缓存处理。MySQL集群
:持久化数据使用MySQL集群,可以使用 读写分离 也可以使用 分库分表。
2.消息队列
模块集群中,服务模块与服务模块之间的通信,需要使用消息队列进行异步解耦,和分布式事务的最终一致性。
RabbitMQ集群
:使用RabbitMQ集群做消息对立,完成服务与服务之间的 异步解耦 、分布式事务的最终一致性。
3.全文检索
有些服务模块需要进行检索,如对商品信息进行检索。
ElasticSearch
:使用ElasticSearch进行检索。
4.OSS云存储
有些服务需要存储图片,视频等大文件,可以使用阿里云的对象存储服务OSS。
OSS:使用阿里云的对象存储服务OSS进行图片、视频的云存储。
五、日志管理
项目上线以后,为了快速定位项目中可能出现的问题,需要进行日志管理。
ELK
:使用ELK对日志进行处理。LogStash
:使用LogStash搜集业务中的各种日志,将他们放入ES中。再使用Kibana可视化界面,从ES中检索出相关的日志信息。快速定位项目中的问题。
六、注册中心&配置中心
分布式系统中,由于每一个服务都可能部署在很多台机器,服务与服务之间要互相调用,这就需要指导彼此都在哪里。推荐将所有服务注册到注册中心,这样服务之间就可以从注册中心发现彼此。
每一个服务的配置众多,为了集中管理这些配置,也需要使用Nacos作为配置中心,这样,所有的服务都可以从配置中心中动态的获取其配置。
Nacos注册中心
:使用Nacos作为服务的注册中心。(该技术由 Spring Cloud Alibaba提供)Nacos配置中心
:同样使用Nacos作为服务的配置中心。(该技术由 Spring Cloud Alibaba提供)
七、服务追踪
服务在调用期间,可能会出现问题。比如:...→订单服务→商品服务→库存服务→...
,可能某一个链路出现了问题,就需要对整个服务调用链进行追踪,查看哪里出现了问题,这就需要使用服务追踪。
使用
Sleuth+Zipkin+Metrics
进行服务追踪,将每一个服务的信息交给开源的Prometheus
进行聚合分析后,由Grafana
进行可视化展示。再通过Prometheus提供的Altermanager
实时得到服务的告警信息,以邮件或者短信的方式通知开发或运维人员。
八、持续集成&持续部署
项目发布时,由于微服务众多,每一个都打包部署到服务器上过于麻烦,使用持续集成与持续部署可以简化这些流程。
持续集成CI/持续部署CD
:开发人员可以将修改后的代码提交给Github,运维人员通过自动化工具Jenkins从Github中获取代码,将其打包成Docker镜像。最终使用k8s集成整个Docker服务。以服务Docker容器的方式来运行。
本文转载自:https://blog.csdn.net/weixin_43691058/article/details/113725349