从零开始学习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的计...
MySQL是怎样运行的
字符集和比较规则字符集计算机中只能存储二进制数据,那怎么存储字符呢?建立字符与二进制数据之间的映射关系就行了。 一个字符映射成一个二进制数据的过程叫做编码,反之叫做解码。 比如’a’ -> 00000001 (十六进制:0x01)这样的映射关系。人们将这样的映射关系抽象出一个字符集的概念来描述某个字符范围的编码规则。 比较规则比较两个字符的大小,容易想到的方法是比较两个字符对应的二进制数字大小,这个规则比较简单,但是不符合现实需求,比如’a’和’A’我们认为是相等的,这个时候就不适合使用这种方法了,可以先将字符全部转为大写或者小写,然后再比较。但是如果是中文字符呢?所以说,同一种字符集可以有多种不同的比较规则。 MySQL中的字符集utf8字符集表示一个字符需要使用1-4个字节,但是我们常用的一些字符使用1-3个字节就可以表示了。MySQL中utf8实际上是被阉割过的字符集utf8mb3。utf8mb4才是正宗的utf8字符集。存储一些emoji表情之类的需要4个字节的,这个时候就只能使用utf8mb4字符集。 常用字符集(MaxLen表示该字符集一个字符最多需要几个字节)...
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实现的呢,在进入主题之前,需要先...
深入理解多线程之一文读懂锁
什么是锁锁的概念源于生活,每家每户都有一把锁,只有持有钥匙才能打开锁进入房间。对于程序来说,就是防止其他线程进入,先到的线程进入房间锁上门,后到的线程看到上锁了,就在门口排队等待。 为什么需要锁多线程并发的场景下,防止多个线程同时读写某一块内存区域,造成数据的不一致性。 java中的锁首先说明:Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。 java中的锁分为内置锁(synchronized)和显式锁(ReentrantLock),其中内置锁是JVM提供的最便捷的线程同步工具,在代码块或方法声明上添加synchronized关键字即可使用内置锁。使用内置锁能够简化并发模型;随着JVM的升级,几乎不需要修改代码,就可以直接享受JVM在内置锁上的优化成果。既然内置锁已经这么好了,那为什么还需要显式锁呢? synchronized没有等待超时时间,获取不到锁会无限等待; 无法中断,如果我们想外部线程发送中断信号的方式停止当前线程获取锁,不得行; 我们想为锁维持多个等待队列,比如一个生产者队列,一个消费者队列,一边提高锁的效率。 synchronized只...
朝花夕拾之OSI七层参考模型和TCP/IP五层模型
简述OSI七层模型和TCP/IP五层模型复习这块知识的时候,总是让我回想起大学的时光,大学没有好好学习网络相关的基础知识,觉得这些知识在当时看来没有什么实际的意义,现在工作之后,又回顾这些知识,有一种豁然开朗的感觉。 不知道你们接触网络分层模型的时候,有没有这种疑惑:互联网实现为什么需要分层? 在我读书的时候,老师总是开头就把各个分层的概念给我说了,让我记住就行,考试要考这些。我是个乖宝宝,老师交代的我当然要听啊,所以就死记硬背,考试过后查完成绩,立马就给忘了。 OSI七层模型: OSI七层网络模型称为开发式系统互联网参考模型,是一个逻辑上的定义和规范; 把网络从逻辑上分为七层,每一层都有相应的物理设备 OSI七层网络模型是一种框架式的设计方法,最主要的功能就是帮助不同类型的主机实现数据传输; 最大的优点就是将服务、接口和协议三个概念明确的区分起来,随之而来的问题就是复杂且不实用; 经常使用的是TCP/IP五层模型。 TCP/IP五层模型每一层都呼叫它的下一层提供的网络来完成自己的需求。就像建筑物一样,一层一层堆积,开发者只关注上层应用层,而不用关...
SpringCloud之深入理解Feign
微服务中,不同的服务之间相互调用主要有两种方式,一种是RPC方式,另外一种是事件驱动方式,也就是发消息方式。 RPC的方式就是远程函数调用,像RESTFul,gRPC, DUBBO 都是这种方式。它一般是同步的,可以马上得到结果。在实际中,大多数应用都要求立刻得到结果,这时同步方式更有优势,代码也更简单。而feign自然也是基于这种方式来做的。 什么是Feignfeign的github上的介绍: Feign is a Java to HTTP client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign’s first goal was reducing the complexity of binding Denominator uniformly to HTTP APIs regardless of ReSTfulness. 简单的来说,Feign是由Retrofit,JAXRS-2.0和WebSocket启发的一个java的 RESTFUL api请求工具。 Feign的主要目标是将Java Htt...









