阿里云发布 Spring Boot 新脚手架
背景相信很多人都使用过 start.spring.io 来初始化自己的 Spring Boot 工程,这个工具为开发者提供了丰富的可选组件,并且可以选择多种打包方式,大大方便了开发人员的使用。最近,阿里的 Nacos、Sentinel 也进入 start.spring.io 的选项中,进一步的方便开发者使用阿里云的产品。
对软件工程的抽象层次自上而下进行切分,会得到如下的几个层级:行业、解决方案、应用、功能、组件;明显的, start.spring.io 目前只能提供组件级别的支持。再将组件这层展开,会发现这样一个生命周期:组件引入、组件配置、功能开发、线上运维。start.spring.io 也只实现了“组件引入”这一功能。
阿里云上线了自己的 bootstrap 站点 start.aliyun.com :https://start.aliyun.com/
当然,本着不重复造轮子的原则,我们不再构建一套工程生成底层框架,而是使用 Spring Initializr 来实现这部分功能。在此之上专注于增加新特性,实现服务广大开发者的目标。
Spring Initializr:https: ...
使用pm2在Linux后台监控hexo运行
自己搭建了一个Hexo渲染的博客,并用Nginx为他作了反代,根据官方的方式使用 hexo server & 时发现,当我关闭终端时博客也就关闭了,并不能一直在后台运行,查阅资料发现可以通过pm2来托管。
第一步,安装pm2
npm install -g pm2
第二步,在博客根目录写一个名为hexo_run.js的脚本
//runconst { exec } = require('child_process')exec('hexo server',(error, stdout, stderr) => { if(error){ console.log('exec error: ${error}') return } console.log('stdout: ${stdout}'); con ...
消息队列模式学习
消息队列模式和它的应用场景、可靠性、同步和异步性
一、消息模型点对点消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。
发布/订阅消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。
发布与订阅模式和观察者模式有以下不同:
观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。
观察者模式是同步的,当事件触发时,主题会去调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,发布者向频道发送一个消息之后,就不需要关心订阅者何时去订阅这个消息。
参考:
Observer vs Pub-Sub
消息队列中点对点与发布订阅区别
二、使用场景异步处理发送者将消息发送给消息队列之后,不需要同步等待消息接收者处理完毕,而是立即返回进行其它操作。消息接收者从消息队列中订阅消息之后异步处理。
例如在注册流程中通常需要发送验证邮件来确保注册用户的身份合法,可以使用消息队列使发送验证邮件的操作异步处理,用户在填写完注册信息之后就可以完成注册,而将发送验证邮 ...
HTTP学习-基础知识
Http基础知识、方法、状态码、具体应用等
一 、基础概念URL
URI(Uniform Resource Identifier,统一资源标识符)
URL(Uniform Resource Locator,统一资源定位符)
URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4。
URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
请求和响应报文1. 请求报文
2. 响应报文
二、HTTP 方法客户端发送的 请求报文 第一行为请求行,包含了方法字段。
GET
获取资源
当前网络请求中,绝大部分使用的是 GET 方法。
HEAD
获取报文首部
和 GET 方法一样,但是不返回报文实体主体部分。
主要用于确认 URL 的有效性以及资源更新的日期时间等。
POST
传输实体主体
POST 主要用来传输数据,而 GET 主要用来获取资源。
更多 POST 与 GET 的比较请见第八章。
PUT
上传文件
由于自身不带验证机制,任何人都可以上传文 ...
Linux操作系统
Linux相关内容、常用操作、磁盘、分区、文件系统压缩、正则匹配、进程管理等
一、常用操作以及概念快捷键
Tab:命令和文件名补全;
Ctrl+C:中断正在运行的程序;
Ctrl+D:结束键盘输入(End Of File,EOF)
求助1. –help指令的基本用法与选项介绍。
2. manman 是 manual 的缩写,将指令的具体信息显示出来。
当执行man date时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下:
代号
类型
1
用户在 shell 环境中可以操作的指令或者可执行文件
5
配置文件
8
系统管理员可以使用的管理指令
3. infoinfo 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以进行跳转。
4. doc/usr/share/doc 存放着软件的一整套说明文件。
关机1. who在关机前需要先使用 who 命令查看有没有其它用户在线。
2. sync为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。
3. sh ...
计算机操作系统
有关于计算机操作系统的相关知识和内容,进程、内存、死锁、磁盘、编译等
一、概述基本特征1. 并发并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
并行需要硬件支持,如多流水线或者多处理器。
操作系统通过引入进程和线程,使得程序能够并发运行。
2. 共享共享是指系统中的资源可以被多个并发进程共同使用。
有两种共享方式:互斥共享和同时共享。
互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。
3. 虚拟虚拟技术把一个物理实体转换为多个逻辑实体。
主要有两种虚拟技术:时分复用技术和空分复用技术。例如多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。
4. 异步异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。
基本功能1. 进程管理进程控制、进程同步、进程通信、死锁处理、处理机调度等。
2. 内存管理内存分配、地址映射、内存保护与共享、虚拟内存等。
3. 文件管理文件存储空间的管理、目录管理、文件读写管理和保护等。
...
I/O模型及其复用
I/O的阻塞与非阻塞、同步与异步、I/O的复用、工作模式
一、I/O 模型一个输入操作通常包括两个阶段:
等待数据准备好
从内核向进程复制数据
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
Unix 下有五种 I/O 模型:
阻塞式 I/O
非阻塞式 I/O
I/O 复用(select 和 poll)
信号驱动式 I/O(SIGIO)
异步 I/O(AIO)
阻塞式 I/O应用进程被阻塞,直到数据复制到应用进程缓冲区中才返回。
应该注意到,在阻塞的过程中,其它程序还可以执行,因此阻塞不意味着整个操作系统都被阻塞。因为其他程序还可以执行,因此不消耗 CPU 时间,这种模型的执行效率会比较高。
下图中,recvfrom 用于接收 Socket 传来的数据,并复制到应用进程的缓冲区 buf 中。这里把 recvfrom() 当成系统调用。
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, ...
Java学习-JVM虚拟机
Java虚拟机相关知识、java内存机制、GC垃圾回收机制、类加载机制
一、运行时数据区域
程序计数器记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。
Java 虚拟机栈每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息,从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小:
java -Xss=512M HackTheJava
该区域可能抛出以下异常:
当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常;
栈进行动态扩展时如果无法申请到足够内存,会抛出 OutOfMemoryError 异常。
本地方法栈本地方法不是用 Java 实现,对待这些方法需要特别处理。
与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。
本地方法一般是用其它语言(C、C++ 或汇编语言等)编写的, 并且被编译为基于本机硬件和操作系统的程序。
堆所 ...
项目构建工具
项目构建工具 maven\ant\Gradle 简介与使用
一、什么是构建工具构建工具是用于构建项目的自动化工具,主要包含以下工作:
依赖管理不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理。
运行单元测试不再需要在项目代码中添加测试代码,从而污染项目代码。
将源代码转化为可执行文件包含预处理、编译、汇编、链接等步骤。
将可执行文件进行打包不再需要使用 IDE 将应用程序打包成 Jar 包。
发布到生产服务器上不再需要通过 FTP 将 Jar 包上传到服务器上。
参考资料:
What is a build tool?
二、Java 主流构建工具主要包括 Ant、Maven 和 Gradle。
Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言(DSL)来管理构建脚本,而不再使用 XML 这种标记性语言。因为项目如果庞大的话,XML 很容易就变得臃肿。
例如要在项目中引入 Junit,Maven 的代码如下:
<?xml version="1 ...
面向对象的思想
面向对象 三大特性、关系类图、设计模式
一、三大特性封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
优点:
减少耦合:可以独立地开发、测试、优化、使用、理解和修改
减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能
提高软件的可重用性
降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的
以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。
注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时 ...
缓存技术整理
缓存技术的基本知识、LRU、CDN、缓存问题、一致性哈希
一、缓存特征命中率当某个请求能够通过访问缓存而得到响应时,称为缓存命中。
缓存命中率越高,缓存的利用率也就越高。
最大空间缓存通常位于内存中,内存的空间通常比磁盘空间小的多,因此缓存的最大空间不可能非常大。
当缓存存放的数据量超过最大空间时,就需要淘汰部分数据来存放新到达的数据。
淘汰策略
FIFO(First In First Out):先进先出策略,在实时性的场景下,需要经常访问最新的数据,那么就可以使用 FIFO,使最先进入的数据(最晚的数据)被淘汰。
LRU(Least Recently Used):最近最久未使用策略,优先淘汰最久未使用的数据,也就是上次被访问时间距离现在最远的数据。该策略可以保证内存中的数据都是热点数据,也就是经常被访问的数据,从而保证缓存命中率。
参考资料:
缓存那些事
二、LRU以下是一个基于 双向队列 + HashMap 的 LRU 算法实现,对算法的解释如下:
最基本的思路是当访问某个节点时,将其从原来的位置删除,并重新插入到链表头部,这样就能保证链表尾部存储的就是最近最久未使 ...
Radis学习-基础知识整理
Radis缓存技术知识、数据类型、使用场景、数据持久化、事务等
一、概述Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持的五种类型数据类型为:字符串、列表、集合、有序集合、散列表。
Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。
二、数据类型
数据类型
可以存储的值
操作
STRING
字符串、整数或者浮点数
对整个字符串或者字符串的其中一部分执行操作 对整数和浮点数执行自增或者自减操作
LIST
列表
从两端压入或者弹出元素 读取单个或者多个元素 进行修剪,只保留一个范围内的元素
SET
无序集合
添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集 从集合里面随机获取元素
HASH
包含键值对的无序散列表
添加、获取、移除单个键值对 获取所有键值对 检查某个键是否存在
ZSET
有序集合
添加、获取、删除元素 根据分值范围或者成员来获取元素 计算一个键的排名
What Redis ...
优秀科技博客订阅
一些优秀的IT的博客MARK
技术博客
酷壳
网站 : CoolShell.cn Rss地址 : http://coolshell.cn/feed
阮一峰的网络日志
网站 : ruanyifeng.com/blog
Rss地址 : http://www.ruanyifeng.com/blog/atom.xml
四火的唠叨
网站 : raychase.net
Rss地址 : http://www.raychase.net/feed
云风的 BLOG
网站 : blog.codingnow.com
Rss地址 : http://blog.codingnow.com/atom.xml
运维与架构
网站 : nginx.cn
Rss地址 : http://www.nginx.cn/feed
ImportNew
网站 : importnew.com
Rss地址 : http://www.importnew.com/feed
Styling Android
网站 : blog.stylingandroid.com
...
MySQL学习-03-经典例题实践
SQL方面的经典例题实践。
数据库建库语句use fuxi;
CREATE TABLE STUDENT
(
SNO VARCHAR(3) NOT NULL,
SNAME VARCHAR(4) NOT NULL,
SSEX VARCHAR(2) NOT NULL,
SBIRTHDAY DATETIME,
CLASS VARCHAR(5)
);
CREATE TABLE COURSE
(
CNO VARCHAR(5) NOT NULL,
CNAME VARCHAR(10) NOT NULL,
TNO VARCHAR(10) NOT NULL
);
CREATE TABLE SCORE
(
SNO VARCHAR(3) NOT NULL,
CNO VARCHAR(5) NOT NULL,
DEGREE NUMERIC(10, 1) NOT NULL
);
CREATE TABLE TEACHER
(
TNO VARCHAR(3) NOT NULL ...
MySQL学习-02-库表的基本操作
sql基础、库表的基本操作、连接、分组、函数、视图、触发器、权限、事务等。。。
一、基础模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。
主键的值不允许修改,也不允许复用(不能使用已经删除的主键值赋给新数据行的主键)。
SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。
SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。
SQL 支持以下三种注释:
# 注释SELECT *FROM mytable; -- 注释/* 注释1 注释2 */
数据库创建与使用:
CREATE DATABASE test;USE test;
二、创建表CREATE TABLE mytable ( id INT NOT NULL AUTO_INCREMENT, col1 INT NOT NULL DEFAULT 1, col2 VARCHAR(45) NU ...