摘要本人所在的公司是国内主要的汽车维修诊断专业设备和诊断软件生产商,有着30年的行业积累。2018年3月公司经过市场调研,要大枣一个大型车辆网数据平台。通过采集车辆诊断数据、GPS位置数据、故障数据等信息,并通过分析、运算形成数据产品,为广大车主,维修厂商、保险公司提供车辆信息数据服务。我作为本项目的系统架构师负责该项目的架构设计工作。本文将以此项目为实例,围绕系统高可用技术的主题,讨论系统设计中,根据应用场景实际情况,结合CDN内容分发技术、负载均衡等应用层、网络层以及数据库层多方面的多种常用高可用方法,合理选择适应的技术来解决项目中遇到的困难并最终实现高可用系统质量目标的过程。本项目经过一年来的设计开发,系统顺利上线,经受了百万级设备接入的考验。最后针对系统维护量大,自动化运维的不足进行了总结。 正文随着国家经济的飞跃发展,人民生活水平的提高,对家庭用车的需求得到巨大的释放,特别是近五年以来,国内乘用车市场火爆,私人小汽车数量以每年2000万的速度快速增长,而我国也赶超美国,成为世界上小汽车保有量最大的国家。于此同时,车主对车辆的使用及维护等涉车活动的频度也越来越高,加上移动互联网 ...
基础篇1、 Java语言有哪些特点 简单易学、有丰富的类库阿里内部资料 面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 与平台无关性(JVM是Java跨平台使用的根本) 可靠安全 支持多线程 2、面向对象和面向过程的区别面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。 3 、八种基本数据类型的大小,以及他们的封装类 基本类型 大小(字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer long 8 0L Long float 4 0.0f Float double 8 0.0d Double ...
Linux 安装 Tesseract下载需要的包tesseract 需要单独下载1https://github.com/tesseract-ocr/tesseract/releases/tag/5.3.3 下载leptonica1wget http://www.leptonica.org/source/leptonica-1.78.0.tar.gz 安装依赖解压leptonica1tar -xvf leptonica-1.78.0.tar.gz 配置编译安装leptonica,进入到文件夹中123./configuremakemake install 安装automake和libtool1yum -y install automake libtool 配置leptonica环境变量修改profile,可以使用命令行或者直接编辑1vim /etc/profile 在文件结尾添加123export LD_LIBRARY_PATH=/usr/local/libexport LIBLEPT_HEADERSDIR=/usr/local/includeexport PK ...
实现单例模式的八种方式1.饿汉式(静态常量)【可用】优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。缺点:在类装载的时候就完成实例化,没有达到 Lazy Loading 的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。 12345678910public class Single { private static final Single SINGLE = new Single(); private Single() {} public static Single getInstance() { return SINGLE; }} 2.饿汉式(静态代码块)【可用】这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。 1234567891011121314public class Single { private static Si ...
概述Spring Framework 是一个非常流行的开源框架,为 Java 应用程序提供了广泛的支持和功能。其中,IOC 和 AOP 是 Spring Framework中最重要的两个部分之一,也是 Spring Framework 能够如此受欢迎的关键所在。本文将深入浅出地解读 Spring 源码中的 IOC 和 AOP 部分,包含详细的解决思路和方案、有步骤和代码、有实际的案例,旨在帮助读者更好地理解和使用Spring Framework。 一、IOC什么是IOC IOC(Inversion of Control,控制反转)是 Spring Framework 的核心概念之一,它是一种面向对象编程的设计模式,用于实现松耦合和可重用的代码。IOC 的基本思想是,将对象之间的依赖关系交由框架来管理,而不是由程序员手动编写代码来管理。 在传统的编程模型中,对象之间的依赖关系通常是硬编码在程序中的,这样会导致代码的耦合度很高,不利于代码的维护和重用。 而采用 IOC 模式可以将对象之间的依赖关系解耦,使得程序更加灵活、可扩展。 Spring IOC 的实现原理Spring IO ...
一、什么是设计模式设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。简单说: 模式:在某些场景下,针对某类问题的某种通用的解决方案。 场景:项目所在的环境 问题:约束条件,项目目标等 解决方案:通用、可复用的设计,解决约束达到目标。 二、设计模式的三个分类创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。 结构型模式:把类或对象结合在一起形成一个更大的结构。 行为型模式:类和对象如何交互,及划分责任和算法。 如下图所示: 三、各分类中模式的关键点单例模式:某个类只能有一个实例,提供一个全局的访问点。 简单工厂:一个工厂类根据 ...
编程学习
未读命令参数 -s|--start: 启动脚本, 参数后面跟端口号 -stop: 停止脚本,参数后面跟端口号 -c|--copy: 拷贝脚本 -l|--log: 查看日志,参数后面跟端口号例如: 1sh xxx.sh -s 12000 启动端口为12000服务的脚本 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586# 项目名称APP_NAME=safirst-etmf-api-1.0.0.jar# 启动方法,根据端口号启动start_port() { echo "准备启动服务 ... $PORT" pid=$(netstat -an | grep $PORT | awk '{print $4}') echo "pid: $pid ...
Compose配置文件结构123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596version: "3.8"services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes ...
编程学习
未读docker运行容器 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859docker run -it -v G:/docker/mysql/data:/var/lib/mysql -v G:/docker/mysql/config/my.cnf:/etc/mysql/my.cnf --restart=always --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysqldocker run -it -v /var/lib/mysql:/var/lib/mysql -v /etc/mysql/my.cnf:/etc/mysql/my.cnf --restart=always --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7docker run -it -d -p 6379: ...
对查询进行优化,要尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。 应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: 1select id from t where num is null 最好不要给数据库留NULL,尽可能的使用NOT NULL填充数据库.备注、描述、评论之类的可以设置为NULL,其他的,最好不要使用NULL。不要以为NULL不需要空间,比如:char(100)型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段,null不占用空间。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: 1select id from t where num = 0 应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫 ...