Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment
从零开始学习springCloud
0.学习目标 了解系统架构的演变 了解RPC与Http的区别 知道什么是SpringCloud 独立搭建Eureka注册中心 独立配置Robbin负载均衡 1.系统架构演变随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到SOA,以及现在火热的微服务架构,还有在Google带领下来势汹涌的Service Mesh。我们到底是该乘坐微服务的船只驶向远方,还是偏安一隅得过且过? 其实生活不止眼前的苟且,还有诗和远方。所以我们今天就回顾历史,看一看系统架构演变的历程;把握现在,学习现在最火的技术架构;展望未来,争取成为一名优秀的Java工程师。 1.1.集中式架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。 存在的问题: 代码耦合,开发维护困难 无法针对不同模块进行针对性优化 无法水平扩展 单点容错率低,并发能力差 1.2.垂直拆分当访问量逐渐增大,单一应用无法满足需求...
视频开发中的一些基础概念
在进行视频开发之前,如果你对颜色编码格式不是很熟悉,建议先阅读一下这篇文章:yuv和rgb的相关知识。有一个大概了解之后,在看下面的视频相关的基础知识。 封装格式的辨认很简单,大多数情况下,拓展名就是封装格式的名字。比如一个文件“金刚狼.avi”,那它就是属于avi的封装格式,“钢之炼金术师.Mkv”,那它就属于mkv封装格式, “喜羊羊与灰太狼.rmvb”就是rmvb封装格式。简而言之,视频文件后缀名就是封装格式的名字。不过wmv和rmvb就比较特殊,后面编码器部分再说。封装格式就是酒瓶。酒瓶就不影响酒的口感,同样,封装格式一样不影响视频画质。它只负责把内部的视频轨和音频轨集成在一起,只起到一个文件夹(或者压缩包)的作用,并没有对视频轨和音频轨造成影响。 几种主流媒体格式 AVI(Audio Video Interactive) 比较早的AVI是Microsoft开发的。其含义是Audio Video Interactive,就是把视频和音频编码混合在一起存储。AVI也是最长寿的格式,已存在10余年了,虽然发布过改版(V2.0于1996年发布),但已显老态。AVI格式上限制比较...
烂笔头-深入理解java虚拟机
今天开始拜读《深入理解java虚拟机》,做个笔记,避免自己忘记。 java运行时数据区域分为: 程序计数器:记录下一次需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖他。java虚拟机的多线程是通过线程轮流切换分配处理器执行时间的方式实现的,在一个确切的时间点,一个处理器都只会执行一条线程中的指令,所以为了线程能够切换到正常的位置,每个线程都有独立的程序计数器,这类内存区域也叫线程私有的内存。 java虚拟机栈:也是线程私有的的。生命周期与线程相同。很多人把java内存分为堆内存和栈内存,java内存区域远比这个复杂,所指的栈就是这个,或者说是虚拟机栈中局部变量表的部分。局部变量表包括编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象的引用,和返回值类型。如果线程请求的栈深度大于虚拟机设定的允许的深度,会抛出StackOverFlowError。如果虚拟机可以动态扩展,扩展时无法申请到足够的内存,就会抛出OutMemoryError。 本地方法栈:和上面不同的地方是虚拟机...
深入理解多线程之线程同步工具
线程同步工具主要包括: 闭锁(CountDownLatch) 栅栏(CyclicBarrier) 信号量(Semaphore) 阻塞队列(BlockingQueue) FutureTask CountDownLatch可以让其他线程先执行,等执行完成之后再执行当前线程。CountDownLatch的构造方法传入了一个整数,相当于计数器,每次调用CountDownLatch的countDown()方法,计数器减一,而调用await()会阻塞当前线程,直到计数器为0后,才执行await()之后的代码。 使用场景统计报表的优化,一般统计报表都需要从多个表中将数据统一展示出来,有时候遇上数据量比较大的情况,统计指标涉及到的业务范围也比较多,这个时候接口响应速度就会很慢,然后就可以使用CountDownLatch,将每个查询任务拆分到单独的线程中去执行,执行完成后调用countDown()方法,主线程调用await()等待所有任务完成之后进行汇总,这样使得原来串行化的任务变成了并行,效率自然提高上去了。 下面的代码初始化了一个线程数为10的线程池,并且将CountDownLatch的计...
开源组件OnlyOffice搭建文档服务
我司目前使用的文档处理中心就是基于only office搭建的集群,个人觉得还是比较好用的。 1. 安装官网:https://www.onlyoffice.com/zh/download.aspx 提供了多种安装方式,为了方便直接使用docker安装。 拉取only office镜像: 1docker pull onlyoffice/documentserver 启动docker容器: 123456docker run -i -t -d -p 6831:80 --restart=always \ --name onlyoffice-document-server \ -v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \ -v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \ -v /app/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \ onlyoffice/documentser...
MySQL是怎样运行的
字符集和比较规则字符集计算机中只能存储二进制数据,那怎么存储字符呢?建立字符与二进制数据之间的映射关系就行了。 一个字符映射成一个二进制数据的过程叫做编码,反之叫做解码。 比如’a’ -> 00000001 (十六进制:0x01)这样的映射关系。人们将这样的映射关系抽象出一个字符集的概念来描述某个字符范围的编码规则。 比较规则比较两个字符的大小,容易想到的方法是比较两个字符对应的二进制数字大小,这个规则比较简单,但是不符合现实需求,比如’a’和’A’我们认为是相等的,这个时候就不适合使用这种方法了,可以先将字符全部转为大写或者小写,然后再比较。但是如果是中文字符呢?所以说,同一种字符集可以有多种不同的比较规则。 MySQL中的字符集utf8字符集表示一个字符需要使用1-4个字节,但是我们常用的一些字符使用1-3个字节就可以表示了。MySQL中utf8实际上是被阉割过的字符集utf8mb3。utf8mb4才是正宗的utf8字符集。存储一些emoji表情之类的需要4个字节的,这个时候就只能使用utf8mb4字符集。 常用字符集(MaxLen表示该字符集一个字符最多需要几个字节)...
两年后端的面试分享
从今年5月份就开始面试了,前前后后也有4个多月了吧,面试了几十家公司,其中有几十个人的小型创业公司,也有几百人的上市公司,踩了不少的坑,最后收到了宝能集团的offer,我也决定就去这家了。 看过很多别人的面试分享经验,这里我也做一些面试的分享吧。 前言首先,提前要求自带简历的一般都不太靠谱,特别是小公司要求自带简历,一般都是hr不专业,不想提前把你的简历打印出来,或者说不想为了你浪费几张A4纸,所以这种公司可以直接pass了,除非你特别缺offer,生存都成困难了。 其次,可以提前问一下hr面试流程是什么样的,现在很多公司都取消笔试了。众所周知笔试没有人监督你,所以可以掏出手机(虽然我没做过,但是面试看见其他人这样做过),所以我觉得笔试作用其实没多少。如果有公司是明确要先笔试,笔试通过再进行面试,而你面试的不是应届生岗位,就要小心了,先考虑一下那家公司过去面试距离远不远,提前去看准网看一下相关的评价,再考虑要不要去面试的事。我之前面过两家都是需要笔试的,笔试没通过是直接没有后面的面试的(有的面试题非常脑残,下面上图),来回也比较远,浪费了我一个上午的时间。 面试准备面...
SpringBoot之SpringApplication初始化
SpringApplication的初始化之前已经分析了引导类上的@SpringBootApplication注解, 接下来继续分析main方法,只调用了一句SpringApplication.run(SpringbootApplication.class, args),就启动了web容器,我们看看run方法里面做了什么 123public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args);} 可以看到,这里初始化了SpringApplication并且执行了它的run方法。 从SpringApplication的构造方法开始看,SpringApplication的构造方法主要做了四件事: 配置源 推断web应用类型 应用上下文初始器和应用事件监听 推导引用主类 源码如下: 1234567891011121314...
springboot自动装配
spring boot 自动装配Spring Boot的很多特性都是基于spring framework来实现的,例如我们熟知的特性,也是它的核心特性:组件自动装配。它能够根据依赖的jar包自动配置Spring Boot的应用,例如: 如果类路径中存在DispatcherServlet类,就会自动配置springMvc相关的Bean。 而你需要的仅仅是编写一个启动类,加上@SpringBootApplication注解,执行它的main方法,接下来的就交给Sping Boot: 123456@SpringBootApplicationpublic class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); }} 为什么说Spring Boot很多特性是基于Spring framework实现的呢,在进入主题之前,需要先...








