「实战记录」面向B端的系统架构

302 阅读4分钟

面向B端的系统有什么特点

  • 实际用户数量可能不多,相比于C端动辄以万或百万计的同时在线人数,B端系统的总注册用户数量可能才几十几百个;

  • 并发量几乎可以不考虑,但是一个操作的内部流程可能有数十个步骤,涉及的数据项比较多;

  • 业务方操作系统的门槛较高,而且研发团队没什么办法降低它。

什么样的架构才算好

没有最好的,只有合适的。

  1. B端系统所采用的技术栈一般选择传统的和稳定的;
  2. 如果客户方已经有一套业务支持系统,采用的技术栈最好和原来的体系保持一致;
  3. 评估研发团队拥有的资源,包括人员数量、个人能力、允许投入的研发时间和业务成熟度。

一个来自真实项目的架构

容器化集群化架构

对上述架构的一些解释

配置和注册中心

  1. 采用开源的Nacos作为配置中心;
  2. Nacos同时还是服务注册中心;
  3. 部署在容器中,3个节点组成集群。

认证和鉴权

  1. 有一个单独的认证和鉴权服务,提供登录、查询用户信息和访问权限校验等基础能力;
  2. 从用户端发起请求时,在网关层通过OpenFeign调用认证和鉴权接口;
  3. 登录后返回给用户端的token是jwt格式的,从token中可以解析得出不敏感的少数几项用户信息,比如用户id和账号名。

后端服务的关系

  1. 从用户端发起访问请求时,通过网关转发给实际提供接口的后端服务;
  2. 各后端服务之间是平等的,通过OpenFeign可以相互访问,获得对方提供的能力;
  3. 后端服务之间共享同一个traceId,用户端发起的一个业务请求经过多个后端服务,通过traceId可以查到一次请求产生的整条链路的日志。

前端不简单

  1. 前端不应该承担复杂的业务计算和流程控制;
  2. 开发者不要对最终的用户提出太高要求,哪怕是业务复杂,使用门槛较高的B端系统;
  3. 用户不会和开发者共情,显示给用户的提示信息都要“说人话”。

尽量容器化

  1. 架构设计时,就要考虑可以水平扩展,通过容器化部署,水平扩展更加便捷;
  2. 服务器资源在容器化部署时可以更加灵活地调配,使用率更加充分;
  3. 容器化可以有较低的成本,监测服务健康性,并且自动维护服务的状态处于健康状态。

日志采集和分析

  1. 使用filebeat或logstash采集日志;
  2. 在Logstash中使用gork做日志切割,转换成结构化数据;
  3. 日志保存到Elasticsearch;
  4. 使用Kibana查看日志,监测系统运行情况。

如果像我一样在使用华为云产品化的Elasticsearch,而且是安全模式的,很可能用不了filebeat,因为华为云提供不了必要的SSL证书。

自动化部署

  1. 在Jenkins配置好编译和部署项目的任务,接收从Gitlab推送的事件;
  2. 在Gitlab中添加webhook,把源码合并事件或创建新标签的事件推送到Jenkins,触发测试环境部署;
  3. 在容器集群中给各节点打上标签,由容器自行调度,分配给不同的服务实例。

重要的题外话

技术不分贵贱,架构不是拼凑在一起的高大上的东西越多就一定越好。

  1. 一个普通的业务系统没必要考虑过多的冗余备份问题;
  2. 业务本身不成熟的系统没必要考虑中台;
  3. 能用单线程解决的问题就不要引入多线程;
  4. 技术只是解决问题的手段,不是目的;
  5. 能在业务设计上避免的难题,就不要用技术去硬扛。

参考文档

  1. 华为云Kubernetes基础知识
  2. Nacos官方文档