文章目录
- 一,网络
- 二,网关
- 1,网关选型
- 2,认证鉴权
- 3,动态路由
- 4,限流
- 5,负载均衡
- 6,熔断降级
- 三,微服务
- 四,存储层
- 五,服务治理
- 六,日志系统
- 七,自动化部署
这一节的内容是介绍项目的架构图,这是从上帝视角看整个项目,非常重要、非常关键。
这一节应该不止看一遍,在学习的过程中经常回过头来温习一遍,看看自己当前学习的是架构图中的哪部分,做到胸中有数。
这是一个结构非常完整的微服务架构图,基本上所有的微服务都类似,掌握其中精髓,万变不离其宗,无论是以后架构新的项目还是重构旧的项目,都可以参考这个架构。
谷粒商城-微服务架构图原图如下。
根据各部分作用的不同,我将这个架构图分为7个部分,接下来逐一介绍。
一,网络
虽然网络主要是运维同事负责,作为开发人员也应该了解项目的网络部署,在排查线上问题时,可能会起到关键作用。
从图中可以看出,整个项目的网络部署有内外网之分,绝大部分都部署在内网,极少数部署在外网。
内网无法通过公网直接访问,这是出于安全考虑,包括网络安全、数据安全等等。
前端项目一般部署在外网,因为前端是整个系统的入口,是开放给公网用户访问的。
后端服务包括所有的商城服务、数据存储、日志、数据治理服务、K8S等等,全部都部署在内网,与外网隔离,拒绝外网直接访问。
二,网关
网关相当于商城系统的后台门户,是极其重要的一部分。
商城页面上所有的后台请求都要经过网关,网关担负的主要职责如下:
- 认证鉴权
- 动态路由
- 限流
- 负载均衡
- 熔断降级
1,网关选型
这个项目选用SpringCloud Gateway作为网关。
2,认证鉴权
商城的有些操作是需要客户登录后操作的,比方说加购物车、下单、付款,这些操作都需要鉴权,判断用户是否登录。
再比如后台管理系统,涉及到库存、商品的管理,所有的操作都有对应的权限,库存管理员只能管理库存,商品管理员只能管理商品。类似这种权限控制都在网关进行。
3,动态路由
大多数服务都是集群部署,分布在多台机器上。
比如商品服务,可能部署在10台服务器上,当前端发出一个商品服务请求时,只需要一台服务器接收请求,从多台服务器中选取一台服务器接收响应,称之为路由
。
网关具备路由的能力,可以配置多种路由策略,比如随机路由、轮询、最小连接数、Hash等等。
4,限流
限流是指在高峰期或者发现黑客攻击,就要对请求进行流量控制,或者让请求排队等候处理,或者直接拒绝请求,避免整个系统瘫痪失去响应。
限流有很多种方式,常见的有令牌限流、漏桶限流。
- 令牌限流。系统生成固定数量的令牌,给每个请求发放令牌,只有得到令牌的请求才能进入系统,没有令牌的请求将被拒绝。
- 漏桶限流。漏桶相当于一个缓存,请求先进入漏桶等待,后端服务以恒定速率从漏桶中取出、处理请求,超出桶容量的请求会被丢弃。
5,负载均衡
因为网关是后台服务的门户,有动态路由的能力,所以也可以实现负载均衡,将请求均匀的分发到后台服务器上。
6,熔断降级
网关可以收集后台服务的响应情况,在满足某种规则的情况下,拦截熔断请求,避免后台服务资源耗尽。
三,微服务
这是业务核心,包括商品服务、订单服务、库存服务、描述服务、搜索服务等等,这些服务在启动后,会将自身信息包括服务名称和IP注册到注册中心。
这些服务之间也需要相互调用,这个项目使用feign完成内部服务间的相互调用。
四,存储层
这个项目中,存储层选用多个中间件。
- 持久化存储选用了MySQL,搭建了MySQL集群,采用读写分离的策略。
- 缓存选用了Redis,搭建了Redis集群。
- 消息中间件选用了RabbitMQ。
- 日志存储选用了Elasticsearch。
- 商品搜索存储选用了Elasticsearch。
- 图片存储使用阿里云的OSS。
五,服务治理
- 注册中心Nacos
- 配置中心Nacos
- 链路追踪Sleuth、Zipkin
- 降级熔断限流Sentinal
六,日志系统
日志记录了系统运行过程中的各种信息,是排查线上问题的必备资料。
这个项目使用ELK作为日志采集、管理、查询系统。
- Logstash收集日志
- 存储到Elasticsearch中
- 用可视化工具Kibana作为前端工具搜索、展示日志
七,自动化部署
- K8S提供容器管理功能
- Jenkins实现从Git代码仓库拉取代码,自动打包,生成Docker容器
- KubeSphere提供简单易用的容器编排功能
流水线作业的原理和流程示例:
-
① 源代码变更:
- 开发者提交代码到版本控制系统,触发 Jenkins pipeline。
-
② 构建和测试:
- Jenkins 根据 pipeline 规则拉取最新代码,构建 Docker 镜像,并运行测试。
- 如果测试通过,Jenkins 将构建的镜像推送到私有或公共的 Docker Registry,如 Harbor 或 Docker Hub。
-
③ 部署到 Kubernetes:
- Jenkins 使用 Kubernetes 的 API 或 CLI (kubectl) 将更新后的镜像部署到目标环境(如开发、测试或生产环境)。
- 这一步可能涉及更新 Kubernetes 的 Deployment、StatefulSet 或其他资源。
-
④ 监控和反馈:
- 部署完成后,Jenkins 可以通知相关人员,同时 KubeSphere 提供监控和日志功能,便于跟踪应用状态和问题排查。
通过这种方式,Jenkins、Kubernetes 和 KubeSphere 形成一个紧密合作的体系,实现了从代码变更到应用部署的自动化流程,大大提高了开发效率和运维的灵活性。