摘要

我所在的公司是国内新能源汽车领域的新势力品牌。TSP车联网平台包括TSP云端基础平台、运营管理平台、大数据平台、生态系统管理平台,系统及应用监控平台以及其他车联网应用系统,如OTA、PKI、信息安全、App管理、生态OS管理等子系统的集成。
TSP系统是为支持公司新能源汽车实现智能网联的功能,搭建的车联网平台,是现代智能汽车的”云上大脑”,也是公司的核心系统,为汽车相关服务的云、管、端提供系统集成能力,并可为公司数十个车型提供统一的车联网服务。
随着互联网、人工智能、云计算和大数据等技术的应用,汽车的智能化、联网化程度越来越高,汽车已变成名副其实的万物互联时代的智能终端设备。汽车上的电子元器件和网络单元越来越多,汽车信息网络逐渐从一个单独的、具有封闭特性的网络变成一个接入互联网的网络,变得更加智能,给用户带来了更好的驾乘体验。

分层架构设计

ISSA层:防火墙、交换机、存储资源、网联资源、服务器、硬件负载均衡、统一监控
PAAS层:Docker、Kafka、RocketMQ、Redis、MySQL、Hadoop、HBase、PKI、Nginx、ELK
业务层:微服务、网关层
应用层:App、小程序、IVI、TBOX、管理平台

安全性设计

安全需求

应用安全
1、为参与车联网的核心实体对象如TSP、App、TBOX、IVI等赋予高强度的身份标志,保证实体对象的唯一性
2、基于各实体对象的身份标志,在业务访问过程中,提供高强度的身份验证,确保业务访问对象的身份合法性
3、保证传输指令、业务数据的完整性,防止通过中间人\中间对象对数据篡改而带来的安全隐患
4、对数据进行加密,保证数据的机密性,杜绝敏感信息的泄漏
数据安全
平台中包含大量的用户数据、车辆信息、资源信息等敏感数据,一旦泄露会对社会造成巨大的影响。

接口安全

1、数据加密,AESDES、RSA,对称、非对称、HTTPS,关键字段md5
2、数据加签,关键数据+privateKey 取md5,防止数据被篡改,内网防劫持
3、时间戳,防重放
4、针对IP,黑名单,限流,
5、数据合法性校验,签名检验、长度、类型、根据实际业务不能有不合常理的数据
6、AppId 机制

数据安全

1、敏感数据保护:数据加密保存(AES128)、数据屏蔽(业务数据无法完整看到,用*代替)、数据脱敏(对测试环境下的数据,对数据进行清洗、格式变换,不可逆加工)、异地存放,
2、数据库安全:强用户认证、合适的数据库安全策略、数据库管理员DBA权限控制、数据库行为审计与监测
3、异地存放:采用阿里云+私有云混合云架构,设置DMZ区,敏感数据存储在内网,与外网隔离,跳板机进行操作

物理安全

1、异地多备、区域隔离、容灾、机房安全

网络安全

1、企业防火墙、外网隔离、VPN、入侵检测

数据传输安全

1、传输秘钥交换,客户端生成传输秘钥,通过公钥加密后发送给后端,后端使用私钥进行解密,完成秘钥交换
2、数据加密传输加密,后端使用传输秘钥,对数据进行加密,客户端再解密

双向认证

1、App离线预置唯一的合法证书,TSP预置根证书与SSL通信站点证书
2、App使用预置证书通过TLS协议向TSP平台发起请求验证平台身份
3、TSP使用根证书通过TLS协议请求验证App身份
4、若双方验证通过,则建立双向TLS通道

代码安全

1、SonarQube:扫描质量扫描,漏洞检测,安全热点、坏味道、bug
2、lombok:消除冗余代码
3、alibaba-java-coding-guidelines:阿里java规约插件,Blocker/Critical/Major

性能指标

1、系统恢复时间RTO 2小时,系统恢复点 RPO 24H,年故障时间小于8小时
2、客户端页面响应时间,按照258原则,最大响应时间2s,评价影响时间1500毫秒,API调用成功率>99.9%
3、接口性能按照并发量3000,TPS(系统每秒处理数) 100返回时间小于200ms设计
4、业务服务器资源计算,系统吞吐量作为主要计算指标。一台4核8G的业务服务器,实际的TPS在1000以上,根据2-5-8原则(2秒内:感觉很快,2-5秒:还可以, 5-8秒:用户还能接受,8秒以上:无法接受),再据TPS= 并发数/平均响应时间 公式,可以算出,4核8G的配置能支持的并发数为10003=3000左右
5、带宽计算,系统部署使用200万的用户作为输入,并发量在10000,预计每个用户请求平均字节数为1kb,带宽需求为 10000
1k/1024*8=80M

可扩展性

对应用请求,应用程序能根据各个服务器的压力,动态转发请求;应用服务器能根据压力大小,自动弹性扩缩容
应用层负载均衡,Nginx做反向代理,正常使用Round-Robin负载均衡策略,通过以下4个配置项来感知后端服务的可用状态:keepalive_timeout、proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout,超时时间60。
应用服务器扩展,根据实际业务指标增长,当应用服务器达到一定性能瓶颈时,通过增加节点、配置节点、在Nginx的负载均衡中添加新节点的IP和端口、重启Nginx来进行扩容
中间件层扩容,redis、kafka集群部署,通过增加节点
数据库层扩容,添加mysql数据库节点组来扩展写操作,提高cluster的存储能力

基础架构选型

服务器配置清单

ECS 服务器 Centos 7.5
阿里ACK容器托管版 Kubernetes,Docker
数据库服务器 RDS MySql 5.7,1主两从
云数据库Redis

微服务框架

1-Spring Cloud Gateway(Hoxton.SR7):统一网关服务,提供统一的路由方式,并且基于Filter以链的方式提供网关基本功能
2-SpringCloud Eureka(Hoxton.SR7):服务治理,实现各个微服务实例的自动化注册和发现。
3-SpringCloud Config(Hoxton.SR7):服务配置中心
4-Feign(Hoxton.SR7):接口式服务调用组件,Netflix开发的声明式、模板化的HTTP客户端, 可帮助更快捷、优雅地调用HTTP API,用于微服务内部之间的接口调用
5-Ribbon(Hoxton.SR7):客户端负载均衡,适用于微服务中RPC远程调用实现本地服务负载均衡
6-Nginx:服务器负载均衡
6-Hystrix(Hoxton.SR7):熔断机制,过载保护,应对雪崩效应(业务依赖多个基础服务,当其中一个发生错误或遇到流量瓶颈时,导致不可用状态沿着调用链向上传递,系统最终无法提供服务)
7-Elasticsearch(7.6.2):分布式、RESTful 风格的搜索和数据分析引擎,底层是开源库Apache Lucene
8-Redisson(3.13.3):分布式锁,在微服务系统中,请求存在多级跨服务调用,往往需要牺牲一致性来保证系统高可用,比如通过分布式事务、异步消息等手段。但在某些场景比如”超卖、余额为负”,需要阻塞所有节点线程,限制对共享资源的使用

中间件

SpringBoot(2.2.6):微服务开发核心组件,Spring 的快速配置脚手架,快速开发单个微服务
Spring-Boot-Starter-Test(2.2.6):单元测试组件
Shiro(1.4.0):Java 的一个安全框架,既可以用在JavaSE中,也可以用在JavaEE中,可帮助实现认证、授权、加密、会话管理、Web集成等,微服务单点登录和权限管理组件
JWT(Json Web Token 3.7.0):用于无状态单点登录,不需要服务端保留用户的认证或会话信息,使用token验证
MyBatis(3.3.2):基于Java的持久层框架,可使用巨大的磁盘存储空间,具备持久存储能力,相当廉价。相比传统的JDBC,不需要关心connection、statement、resultset、异常,减少模板化代码,关注在 SQL 语句上。支持使用XML或注解来配置和映射原生信息,将接口和java中的对象映射成数据库中的记录。
MyBatis-enhance-actable:自动维护表组件
druid:阿里出品的数据库连接池,能提供强大的监控和扩展功能。
dynamic-datasource:动态数据源,读写分离组件
RocketMQ:队列模型的消息中间件,Producer、Consumer、队列集合Topic都可以分布式,严格的消息顺序、水平扩展、亿级消息堆积能力、依赖少。
Kafka:分布式消息队列服务,广泛用于日志收集、监控数据聚合、流式数据处理、在线和离线分析等,是大数据生态中不可或缺的产品之一。
Dubbo:阿里开源高性能分布式通信框架,专注与通信服务治理,类似 Spring 中 Ribbon、Hystrix、Feign核心功能

架构总结 - 图1
Zookeeper:分布式服务框架,可实现分布式应用配置管理、统一命名服务、状态同步服务、集群管理等
FastDFS:开源的分布式文件系统,可对文件进行管理,包括文件存储、同步、访问等,可解决大容量存储和负载均衡的问题。有两个角色,Tracker和storage节点,跟踪器做调度工作,起负载均衡的作用。
阿里云OSS:基于网络的对象存储服务,包括文本、图片、音视频等,以对象形式上传都存储空间 bucket

概念

网关

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。

  • 性能:API高可用,负载均衡,容错机制。
  • 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
  • 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
  • 缓存:数据缓存。
  • 监控:记录请求响应数据,api耗时分析,性能监控。
  • 限流:流量控制,错峰流控,可以定义多种限流规则。
  • 灰度:线上灰度部署,可以减小风险。
  • 路由:动态路由规则。
  • 流行的网关有:Nginx 、 Kong 、Orange
  • 为什么用 Spring Cloud Gateway
  • 1、Nginx这类网关,都是用不同的语言编写的,不易于扩展;而Gateway就不同,它是用Java写的,易于扩展和维护。
  • 2、Nginx 适合做门户网关,系统最外层,Gateway适合做业务网关,用来对不同的客户端提供服务,用于聚合服务。各个微服务独立部署,业务单一,对外提供服务时需要把他们聚合起来。
  • 特性:集合了 Filter 过滤器(修改HTTP请求)、Hystrix 断路器(保护服务免受级联失败影响,提供预备响应)、速率限制、路径重写,聚合业务、重试等

    服务治理

    服务向注册中心登记自己的服务,包括服务的主机与端口号、服务版本号、通讯协议等,注册中心按照服务名分类组织,同时以心跳检测的方式去监测服务清单中的服务是否可用,不可用则清除,以达到服务故障排除的效果。
    服务间的调用不再通过具体的实例地址来实现,而是通过服务名发起服务请求。获取清单列表,通过负载均衡策略取出一个服务来进行调用。
    Spring Cloud Eureka,由Java编写,适合由java实现的分布式系统,或JVM语言构建的系统,跨平台。包括服务端与客户端,服务端即服务注册中心,可集群部署,当集群中分片故障时,可自我保护与恢复,客户端处理服务的注册与发现。

    服务器端负载均衡

    负载均衡是对系统的高可用、网络压力缓解、扩容能力的重要手段之一。
    硬件负载均衡,主要在服务器节点之间安装专门用于负载均衡的设备,比如F5;下挂服务器清单,心跳检测,出错剔除,设备按照某种算法来选择服务端地址
    软件负载均衡,在服务器上安装一些拥有负载均衡能力的功能或模块来完成请求的分发工作,比如Nginx。

    客户端负载均衡

    最大的不同在于服务清单存储的位置。客户端负载中,所有客户端节点都维护自己要访问的服务清单,它来自服务注册中心,如Eureka,客户端也要心跳去维护服务端的健康性。
    Ribbon是一个基于HTTP和TCP的客户端负载均衡工具。可轻松的将面向客户端的REST模板请求转换成客户端负载均衡的服务调用。微服务间的调用,API请求转发,都通过Ribbon来实现,Feign就是基于此。

    其他

    微服务监控- Spring Boot Admin

    管理和监控Spring Boot 应用程序

    集群监控-Prometheus

    需开通ARMS服务,包含前端监控、应用监控、Prometheus三部分

    日志收集与监控-SLS

    阿里Log Service,简称SLS

    接口自动化测试-Hippie-Swagger

    Hippie-Swagger是一个测试RESTFul API的工具,带有自动化的swagger断言。