07 2018 档案

摘要:最近把我之前学SpringCloud所涉及到的知识以及我写的博客进行了比较系统的整理,目录如下。 1. 单体架构和微服务架构的比较 2.微服务所要解决的主要问题 3.SOA和微服务的比较 初识微服务 4. 服务拆分 微服务的服务拆分 5. 数据一致性 微服务的数据一致性 6.服务间的通信—RestT 阅读全文
posted @ 2018-07-27 20:43 开拖拉机的蜡笔小新 阅读(457) 评论(0) 推荐(0) 编辑
摘要:网关服务的作用: 身份认证、路由服务、为前端服务的后端—数据聚合 身份认证 如果我们的微服务和终端通信,势必要考虑身份认证,如果我们的微服务都与每个终端用户打交道,那么这些代码就需要拷贝多份, 并且植入到每个微服务业务代码中,这就造成业务代码和身份认证代码耦合,降低代码的复用性。 路由服务 由运维人 阅读全文
posted @ 2018-07-26 22:33 开拖拉机的蜡笔小新 阅读(783) 评论(0) 推荐(0) 编辑
摘要:如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。 Java有原生的API可用于发送HTTP请求,即java.net.URL、java.net.URLConnection,这些API很好用、很常用,但不够简便; 所以,也流行有许多Java HTTP请求的fr 阅读全文
posted @ 2018-07-26 18:10 开拖拉机的蜡笔小新 阅读(3625) 评论(0) 推荐(0) 编辑
摘要:什么是RPC? 是指远程过程调用,就是两个服务A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求 阅读全文
posted @ 2018-07-26 15:24 开拖拉机的蜡笔小新 阅读(2147) 评论(1) 推荐(1) 编辑
摘要:实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ,下面讲实现其接口的写法,先看一下这个接口的三个方法. - 方法pr 阅读全文
posted @ 2018-07-25 23:26 开拖拉机的蜡笔小新 阅读(5138) 评论(0) 推荐(0) 编辑
摘要:接上篇秒杀系统优化方案(上)吐血整理 3. 深入优化设计 3.1 初始方案问题分析 在前面针对数据库的优化中,由于数据库行级锁存在竞争造成大量的串行阻塞,我们使用了存储过程(或者触发器)等技术绑定操作,整个事务在MySQL端完成,把整个热点执行放在一个过程当中一次性完成,可以屏蔽掉网络延迟时间,减少 阅读全文
posted @ 2018-07-22 21:36 开拖拉机的蜡笔小新 阅读(10337) 评论(6) 推荐(8) 编辑
摘要:前一段时间好好研究了秒杀的问题,我把里面的问题好好总结了,可以说是比较全面的了,真的是吐血整理了。 由于我先是在word中整理的,格式都整理得比较好,放到博客上格式挺难调,暂时按word的格式来吧,有时间了在好好排版下。 主要需要解决的问题有两个: 优化的思路: 1) 尽量将请求拦截在系统上游 2) 阅读全文
posted @ 2018-07-22 21:09 开拖拉机的蜡笔小新 阅读(7982) 评论(5) 推荐(7) 编辑
摘要:在分布式架构或微服务架构下,必须保证一个应用服务器上保存Session后,其它应用服务器可以同步或共享这个Session,可能会出现在A1系统登录后创建并保存Session,再次发起请求,请求被转发到A2系统上显示未登录的情况。以下是几种常见的分布式session管理方案: 1.Session复制 阅读全文
posted @ 2018-07-21 16:19 开拖拉机的蜡笔小新 阅读(490) 评论(0) 推荐(1) 编辑
摘要:缓存设计的误区 我们通常是这样设计的,应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 那试想一下,如果取出来的null,需不需要放入cache呢?答案当然是需要的。 我们试想一下如果取出为null不放入cache会有什么结果?很显然每次取cache没有走db返回nu 阅读全文
posted @ 2018-07-21 15:42 开拖拉机的蜡笔小新 阅读(745) 评论(0) 推荐(0) 编辑
摘要:在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。 25.尽量避免大事务操作,提高系统并发能力。26.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 引自:sql优化的几种方法 阅读全文
posted @ 2018-07-18 22:55 开拖拉机的蜡笔小新 阅读(256) 评论(0) 推荐(0) 编辑
摘要:List List:有序(存入和取出的顺序一致),元素都有索引值,元素可以重复。 * Set:元素不能重复,无序。 * **** List:特有的常见方法:有一个共性的特点就是可以操作角标。 *1.添加 * void add(); * * 2.删除 * Object remove(index) * 阅读全文
posted @ 2018-07-11 22:38 开拖拉机的蜡笔小新 阅读(260) 评论(0) 推荐(0) 编辑
摘要:下面是我对java并发编程与高并发解决方案的学习总结: 1、并发编程的基础 2、线程安全—可见性和有序性 3、线程安全—原子性 4、安全发布对象—单例模式 5、不可变对象 6、线程封闭 7、线程不安全类 8、同步容器 9、J.U.C之AQS 10、线程的几种创建方式 11、FutureTask、Fo 阅读全文
posted @ 2018-07-11 21:07 开拖拉机的蜡笔小新 阅读(561) 评论(0) 推荐(0) 编辑
摘要:java的基本数据类型中,boolean只有两种状态,默认值为false.取值范围是{true,false},理论上占1bit,实际上: 1.单个的boolean 类型变量在编译的时候是使用的int 类型。 boolean a=true;//这个a在JVM中占4个字节即:32位。 2.boolean 阅读全文
posted @ 2018-07-10 22:40 开拖拉机的蜡笔小新 阅读(3534) 评论(0) 推荐(0) 编辑
摘要:()、[]、{}的区别 圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理示例:1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现 方括号[]是定义 阅读全文
posted @ 2018-07-09 15:03 开拖拉机的蜡笔小新 阅读(351) 评论(0) 推荐(0) 编辑
摘要:cpu多级缓存是计算机底层的东西,面试比较少问道。 java内存模型更加重要。相当于java这门语言相对于计算机底层定义了一个上层的模型,代码执行的操作是基于这个模型。 面试时比如问你对java内存模型的理解。 线程安全性这一章考点特别多,应该足够重视。 TreadLocal常问。并发容器更加重要些 阅读全文
posted @ 2018-07-07 23:54 开拖拉机的蜡笔小新 阅读(400) 评论(0) 推荐(0) 编辑
摘要:简谈从零开始搭建一套业务相关监控报警系统 高可用原则: 阅读全文
posted @ 2018-07-07 23:27 开拖拉机的蜡笔小新 阅读(290) 评论(0) 推荐(0) 编辑
摘要:切库的基础和实际运用—读写分离: 如何方便进行读写分离,目前有两种方式: 1.动态数据源切换 它是指程序运行时,把数据源动态的织入到程序中,让指定的程序连接主库还是从库 自定义注解完成数据库切库 2.直接定义查数据源和写数据源 直接在项目里定义两个数据库连接,一个是主库连接一个是从库连接,更新数据的 阅读全文
posted @ 2018-07-07 23:16 开拖拉机的蜡笔小新 阅读(1221) 评论(0) 推荐(0) 编辑
摘要:服务降级: 服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此环节服务器的压力,以保证核心任务的进行。 同时保证部分甚至大部分任务客户能得到正确的相应。也就是当前的请求处理不了了或者出错了,给一个默认的返回。 服务熔断:在股票市场,熔断这个词大家都不陌生,是指当股指波幅达到 阅读全文
posted @ 2018-07-07 22:46 开拖拉机的蜡笔小新 阅读(18924) 评论(0) 推荐(0) 编辑
摘要:限流就是通过对并发访问/请求进行限速或一个时间窗口内的请求进行限速,从而达到保护系统的目的。一般系统可以通过压测来预估能处理的峰值,一旦达到设定的峰值阀值,则可以拒绝服务(定向错误页或告知资源没有了)、排队或等待(例如:秒杀、评论、下单)、降级(返回默认数据) 限流不能乱用,否则正常流量会出现一些奇 阅读全文
posted @ 2018-07-07 22:23 开拖拉机的蜡笔小新 阅读(1575) 评论(0) 推荐(0) 编辑
摘要:前面我们已经提到单个服务器再优化,它的处理能力都是有上限的,因此我们选择多扩容以及使用缓存和消息队列等对程序进行优化。 下面介绍另一种方法,随着项目需求完成越来越多,应用自然也会越来越大,架构师将一个应用整体拆分成多个应用。 拆分的原则: 1.业务优先,确定业务边界 2.循序渐进,边拆分边测试 3. 阅读全文
posted @ 2018-07-07 21:37 开拖拉机的蜡笔小新 阅读(1214) 评论(0) 推荐(0) 编辑
摘要:消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 消息被处理的过程相当于流程A被处理。我们这里以一个实际的模型来讨论下,比如用户下单成功时给用户发短信,如果没有这个消息队列,我们会选择同步调用发短信的接 阅读全文
posted @ 2018-07-07 20:31 开拖拉机的蜡笔小新 阅读(8147) 评论(0) 推荐(0) 编辑
摘要:应用需要支撑大量并发量,但数据库的性能有限,所以使用缓存来减少数据库压力与提高访问性能。 、 缓存的使用可以出现在1到4的各个环节中,每个环节的方案他们都各有特点。 特征 命中率 = 命中数 / (命中数 + 没有命中数) 最大空间:缓存最大空间一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过 阅读全文
posted @ 2018-07-07 16:43 开拖拉机的蜡笔小新 阅读(2341) 评论(0) 推荐(3) 编辑
摘要:什么是扩容, 什么时候要扩容? 了解Java 内存结构的伙伴应该都知道 , 每个线程都有自己的工作内存, 占用内存大小取决于工作内存里变量的多少与大小 , 单个线程占用内存通常不会很大, 但是随着并发的线程不断的增加 , 从成百上千, 甚至几十万 , 占用的内存就会越来越多.这时候可能就要考虑给系统 阅读全文
posted @ 2018-07-07 15:06 开拖拉机的蜡笔小新 阅读(1094) 评论(0) 推荐(0) 编辑
摘要:1.你了解的各种锁? 偏向锁、轻量级锁、重量级锁 简单说下先偏向锁、轻量级锁、重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区; 轻量级锁:多个线程交替进入临界区; 重量级锁:多个线程同时进入临界区。 偏向锁 在没有实际竞争的情况下,还能够针对部分场景继续优化。如果不仅仅没有实际竞争,自 阅读全文
posted @ 2018-07-07 14:34 开拖拉机的蜡笔小新 阅读(407) 评论(0) 推荐(0) 编辑
摘要:(1)HashMap的线程不安全原因一:死循环 原因在于HashMap在多线程情况下,执行resize()进行扩容时容易造成死循环。 扩容思路为它要创建一个大小为原来两倍的数组,保证新的容量仍为2的N次方,从而保证上述寻址方式仍然适用。扩容后将原来的数组从新插入到新的数组中。这个过程称为reHash 阅读全文
posted @ 2018-07-07 12:32 开拖拉机的蜡笔小新 阅读(2814) 评论(0) 推荐(1) 编辑
摘要:Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为sing 阅读全文
posted @ 2018-07-07 11:20 开拖拉机的蜡笔小新 阅读(743) 评论(0) 推荐(1) 编辑
摘要:1. 使用本地变量 应该总是使用本地变量,而不是创建一个类或实例变量,通常情况下,开发人员使用对象实例作为变量可以节省内存并可以重用,因为他们认为每次在方法中创建本地变量会消耗很多内存。 2.使用不可变类 不可变类比如String Integer等一旦创建,不再改变,不可变类可以降低代码中需要的同步 阅读全文
posted @ 2018-07-07 10:23 开拖拉机的蜡笔小新 阅读(338) 评论(0) 推荐(0) 编辑
摘要:什么是死锁? 通俗的说,死锁就是两个或者多个线程,相互占用对方需要的资源,而都不进行释放,导致彼此之间都相互等待对方释放资源,产生了无限制等待的现象。死锁一旦发生,如果没有外力介入,这种等待将永远存在,从而对程序产生严重影响。 死锁产生的必要条件 互斥条件:进程对锁分配的资源进行排他性使用 请求和保 阅读全文
posted @ 2018-07-07 10:07 开拖拉机的蜡笔小新 阅读(197) 评论(0) 推荐(0) 编辑
摘要:继承Thread的弊端 1.每次new Thread的时候都需要新建一个线程,性能差 2.线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 3.Thread类缺少更多功能,比如更多的执行、定期执行、线程中断。 线程池的好处 1.重用存在的线程,减少对象创建、 阅读全文
posted @ 2018-07-07 09:37 开拖拉机的蜡笔小新 阅读(371) 评论(0) 推荐(0) 编辑
摘要:我们之前学习创建线程有Thread和Runnable两种方式,但是两种方式都无法获得执行的结果。 而Callable和Future在任务完成后得到结果。 Future是一个接口,表示一个任务的周期,并提供了相应的方法来判断是否已经完成,以及获取任务的结果和取消任务。 FutureTask可用于异步获 阅读全文
posted @ 2018-07-06 19:47 开拖拉机的蜡笔小新 阅读(498) 评论(0) 推荐(0) 编辑
摘要:编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是,(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行 阅读全文
posted @ 2018-07-06 16:58 开拖拉机的蜡笔小新 阅读(283) 评论(0) 推荐(0) 编辑
摘要:1. 首先说一下:行锁 和 表锁 1. 首先说一下:行锁 和 表锁 1. 首先说一下:行锁 和 表锁 主要是针对锁粒度划分的。 一般分为:行锁、表锁、库锁 (1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误。 (2)表锁:访问数据库的时候,锁定整个表数据,防止并发错误。 行锁 和 表锁 的区 阅读全文
posted @ 2018-07-06 16:06 开拖拉机的蜡笔小新 阅读(332) 评论(0) 推荐(0) 编辑
摘要:AQS是J.U.C的核心 AQS(AbstractQueuedSynchronizer)队列同步器,AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。 同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待和唤醒等底层操作。 同 阅读全文
posted @ 2018-07-06 16:05 开拖拉机的蜡笔小新 阅读(368) 评论(0) 推荐(1) 编辑
摘要:同步容器 同步容器可以简单地理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行。 同步容器将它们的状态封装起来,并对每一个公有方法进行同步。主要包括: Vector Stack HashTable Collections.synchronized方 阅读全文
posted @ 2018-07-05 17:27 开拖拉机的蜡笔小新 阅读(460) 评论(0) 推荐(0) 编辑
摘要:1.StringBuilder 线程不安全,StringBuffer线程安全原因:StringBuffer几乎所有的方法都加了synchronized关键字 package com.mmall.concurrency.example.commonUnsafe; import com.mmall.co 阅读全文
posted @ 2018-07-05 16:09 开拖拉机的蜡笔小新 阅读(485) 评论(0) 推荐(0) 编辑
摘要:当我们在多线程程序中操作一个数据时,保证此数据的线程安全是必须的。一般的,我们会将与此数据相关的操作同步化,在处理此数据附近创建临界区,通过类似串行的方式让多线程按序访问保证安全。除了这种同步的方法,还有其他的方法可以保证数据的安全性。 保证数据线程安全的思路基本有以下三种,这三种中又分别有不同的做 阅读全文
posted @ 2018-07-05 15:35 开拖拉机的蜡笔小新 阅读(267) 评论(0) 推荐(0) 编辑
摘要:不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 不可变类的优点: 1.线程安全 不可变对象是 阅读全文
posted @ 2018-07-05 15:30 开拖拉机的蜡笔小新 阅读(394) 评论(0) 推荐(0) 编辑
摘要:发布对象 发布对象:使一个对象能够被当前范围之外的代码所使用 对象溢出:一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见 不正确的发布可变对象导致的两种错误: 1.发布线程意外的所有线程都可以看到被发布对象的过期的值 2.线程看到的被发布对象的引用是最新的,然而被发布对象的状态却是过 阅读全文
posted @ 2018-07-05 11:22 开拖拉机的蜡笔小新 阅读(343) 评论(0) 推荐(0) 编辑
摘要:在并发编程中,需要处理的两个关键问题:线程之间如何通信以及线程之间如何同步。 通信是指线程之间以或者机制交换信息,java的并发采用的是共享内存模型,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信。 同步是是指程序中用于控制不同线程间操作发生相对顺序的机制。 最开始首先应该知道计算 阅读全文
posted @ 2018-07-01 14:58 开拖拉机的蜡笔小新 阅读(3373) 评论(2) 推荐(1) 编辑
摘要:首先要认识并发的一些基本概念以及并发编程的利和弊 并发编程2:认识并发编程的利与弊 基础知识讲解与核心知识准备 并发及并发的线程安全处理 高并发处理的思路及手段 涉及的知识技能 并发编程基础 CPU多级缓存-缓存一致性 CPU多级缓存-乱序执行优化 JAVA内存模型 并发的优势与风险 参考:Java 阅读全文
posted @ 2018-07-01 14:55 开拖拉机的蜡笔小新 阅读(497) 评论(0) 推荐(0) 编辑
摘要:通常情况下,在Java里面,++i或者--i不是线程安全的,这里面有三个独立的操作:获得变量当前值,为该值+1/-1,然后写回新的值。在没有额外资源可以利用的情况下,只能使用加锁才能保证读-改-写这三个操作是“原子性”的。 Java 5新增了Atomic包,里面类包含方法getAndIncremen 阅读全文
posted @ 2018-07-01 10:27 开拖拉机的蜡笔小新 阅读(386) 评论(0) 推荐(0) 编辑