原创
随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。 此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求,从而减少单库的访问压力,进而应用得到优化。 本次测试使用两个虚拟机: ip:192.168.2.21(主) ip:192.168.2.22(从)
阅读全文原创
我们常见的创建线程的方式有 2 种:继承 Thread 和 实现 Runnable 接口。 其实,在 JDK 中还提供了另外 2 种 API 让开发者使用。 Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式: 实现 Callable 接口。
阅读全文原创
当服务越来越多时,容量的评估,小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,提供集群利用率。其中,用于提高机器利用率的资源调度和治理中心是关键。 Dubbo 是阿里巴巴开源项目的一个分布式服务框架。其致力于提供高性能和透明化的 RPC 远程调用方案,以及 SOA 服务治理方案。
阅读全文原创
Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 可以应用在游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件、安全系统等场景。 笔者学习的目的主要是为了能在 Web 应用(Nginx、Redis)中使用到 Lua 脚本。
阅读全文原创
在消息中间件中有 2 个重要的概念:消息代理和目的地。当消息发送者发送消息后,消息就被消息代理接管,消息代理保证消息传递到指定目的地。 我们常用的消息代理有 JMS 和 AMQP 规范。对应地,它们常见的实现分别是 ActiveMQ 和 RabbitMQ。 上篇文章 《Spring Boot 入门之缓存和 NoSQL 篇(四)》 。
阅读全文原创
之前,笔者写过 《 CentOS 7.2 安装 RabbitMQ》 这篇文章,今天整理一下 RabbitMQ 相关的笔记便于以后复习。 在 RabbitMQ 官网上提供了 6 中工作模式:简单模式、工作队列模式、发布/订阅模式、路由模式、主题模式 和 RPC 模式。 本篇只对前 5 种工作方式进行介绍。
阅读全文原创
通常,一个项目在本地开发完成后,需要提交到测试环境进行测试,测试完成后最终放到生成环境运行。但是,这 3 个运行环境的配置必然有所不同。当每次提交到不同的环境都需要修改项目的配置,这些操作显得非常繁琐且容易出错。 本文将介绍使用 Maven 实现环境隔离的小技巧来避免人工修改出错,解决上述问题。 演示环境:IDEA
阅读全文原创
Lombok 是一个 Java 库,它作为插件安装至编辑器中,其作用是通过简单注解来精简代码,以此达到消除冗长代码的目的。 通过注解自动生成成员变量的 getter、setter 等方法,使代码简洁 修改类变量名时,无需关注其 getter、setter 等方法
阅读全文原创
在上篇《Java 多线程开发之 volatile(一)》文章中介绍了 volatile 的相关内容,它是一个轻量级的锁,但不支持原子操作。 本篇将介绍原子操作相关内容。 CAS (Compare-And-Swap) 是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。
阅读全文原创
Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。 我们可以将 volatile 看做一个轻量级的锁,但是又与锁有些不同: Java 内存模型规定了所有的变量(此处的变量是指成员变量和静态变量)都存储在主内存中,每条线程都有自己的工作内存。
阅读全文