Nginx的异步非阻塞 1. 同步与异步同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。异步调用,要想获得结果,一般有两种方式:主动轮询异步调用的结果;被调用方通过callback来通知调用方调用结果。阻塞和非阻塞阻塞与非阻塞的重点在于进/线...
Resilience4j 基本用法详解 和传统架构相比,微服务有一个非常严重的问题常常被人诟病。什么问题呢?就是故障率。在传统架构中,我们可以将故障率降到很低,但是在微服务中,这一点却不太容易做到,因为单个微服务的故障率即使降低了,但假如有1000台机器,那么整个系统正常运行的概率就是 (1-故障率)^1000 ,经过这样一个幂运算之后,你会发现系统正常运行的概率低得吓人,而且如果处理不好的话还会发生服务雪崩(故障蔓延),什么是服务雪...
Feign 中的继承、日志与数据压缩 上篇文章和大家分享了声明式微服务调用组件 Feign 的基本用法,相信大家已经了解到使用 Feign 的好处了,使用 Feign 有效地解决了使用 RestTemplate 时的代码模板化的问题,使服务之间的调用更加简单方便,同时也不易出错。不过,细心的读者可能也发现,上篇文章中我们学的 Feign 还是有一些明显的缺陷,例如,当我们在 provider 中定义接口时,可能是下面这样:@Rest...
声明式服务调用 Feign 在前面几篇文章中,主要和大家介绍了服务的注册与消费。在介绍过程中,我们从最最原始的手动利用 DiscoveryClient 发现服务开始,手动实现负载均衡,再到最后的自动化配置。相信经过前面几篇文章的学习,大家对微服务之间的调用应该有了一个基本的认知。但是我们前面的所有服务调用都是手动写 RestTemplate 来实现的,大家可能已经发现这样写有点麻烦,每次都要写请求 Url 、配置响应数据类型...
服务请求负载均衡 通过前面文章的学习,大家已经了解到如何搭建服务注册中心,如何将一个 provider 注册到服务注册中心, consumer 又如何从服务注册中心获取到 provider 的地址,在 consumer 获取 provider 地址时,我们一直采用了 DiscoveryClient 来手动获取,这样出现了大量冗余代码,而且负载均衡功能也没能实现。因此,本文我将和大家分享在微服务中如何实现负载均衡,以...
RestTemplate 用法详解 上篇文章带大家学习了一下基本的微服务环境搭建,由 provider 提供服务, consumer 通过 DiscoveryClient 先去 eureka 上获取 provider 的服务的地址,获取到地址之后再去调用相关的服务。在服务的调用过程中,使用到了一个工具,叫做 RestTemplate,RestTemplate 是由 Spring 提供的一个 HTTP 请求工具。在上文的案例中,开发者...
服务注册与消费 前面几篇文章向读者介绍了 Eureka 和 Consul 的基本用法,并对原理做了细致地分析。对于服务注册与调用,在前面的文章中也有涉及,但是没有细说,本文我们就来看看微服务中的服务注册与消费。系统架构其实,在微服务出现之前,跨服务调用的需求就有了,只不过以前大多数人可能会采用直连的方式去调用另一个服务。例如有 Server A 和 Serve...
Eureka 缓存机制详细配置 Eureka Server 内部有二层缓存机制,那这些机制是如何工作的,以及 Eureka Server 是如何存储服务的注册信息,本节会给大家揭晓。Eureka 在使用过程中有一些非常重要的配置项,本节也会整理出来,方便大家以后在生产环境根据项目场景来调整。Eureka Server 数据存储我们知道 Eureka Server 在运行期间就是一个普通的 Java 项目,并没有使用数据库...
Eureka 工作原理 Eureka 作为 Spring Cloud 体系中最核心、默认的注册中心组件,研究它的运行机制,有助于我们在工作中更好地使用它。Eureka 核心概念回到服务注册调用示意图,服务提供者和服务的消费者,本质上也是 Eureka Client 角色。整体上可以分为两个主体:Eureka Server 和 Eureka Client。Eureka Server:注册中心服务端注册中心服务端主...
spring、spring-boot和-spring-cloud的关系 想要了解 Spring Cloud 和 Spring Boot 是如何配合使用的,就必须先要了解 Spring Boot 的 Starter 机制。Spring Boot StarterSpring Boot Starter 是 Spirng Boot 约定优于配置理念的最佳实现。Spring Boot Starter 有两个核心组件:自动配置代码和提供自动配置模块及其它有用的依赖。也就意味着...
【RabbitMQ】一文带你搞定RabbitMQ死信队列 一、说明RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我现在所在公司【手动滑稽】)。为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中。但由于对死信队列的概念及配置不熟悉,导致曾一度陷入百度的汪洋大海,无法自拔,很多文章都看起来可...
RabbitMQ入门 RabbitMQ 简介RabbitMQ是一个在AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。AMQPAMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标...
Spring BeanFactory实例化Bean的详细过程 Spring中Bean的实例化是Bean生命周期的一个重要环节,通常Bean初始化后将不再改变。那么Spring实例Bean的过程到底是怎么样的呢?!要想获取到一个bean对象,得先通过BeanFactory的getBean()方法获取,期间会经过一系列步骤来实例化这个bean对象:第一步:调用Bean的默认构造方法(当然也可以是指定的其它构造方法),生成bean实例:bean1。第二步:...
volatile 与处理器的嗅探技术 在《java并发编程的艺术》这本书中,关于volatile的内存原理本质的描述如下:有volatile变量修饰共享变量在编译器编译后,后多出一个“lock” 来(lock前缀指令相当于一个内存屏障,会强制将对缓存的修改操作写入主内存),该字符在多核处理器下回引发两个事件:1.将当前处理器缓存行的数据写回系统内存;2.这个写会内存的操作会使得其他处理器里缓存的该内存地址的数据无效。在该书籍第...
CPU缓存一致性协议MESI CPU缓存一致性协议MESICPU高速缓存(Cache Memory)CPU为何要有高速缓存CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。在CP...
HTTP和HTTPS 前言近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代,在浏览器、搜索引擎、CA机构、大型互联网企业的共同促进下,互联网迎来了“HTTPS加密时代”,HTTPS将在未来的几年内全面取代HTTP成为传输协议的主流。读完本文,希望你能明白:HTTP通信存在什么问题HTTPS如何改进HTTP存在那些问题HTTPS工作原理是什么想阅读更...
HTTP各版本区别 HTTP协议全称HyperText Transfer Protocol,中文名超文本传输协议。是互联网上应用最为广泛的一种网络协议。HTTP是基于TCP/IP协议的应用层协议,不涉及数据包的传输,主要是规定了客户端和服务器之间的通信格式。默认使用80端口。HTTP 0.9版本HTTP 0.9是最早发现的一个版本。它只允许客户端发送一种GET请求,并且不支持请求头,因为没有协议头的原因,HTTP...
双重检查单例为什么要加volatile 双重检测锁实例:public class Single { private Factory factory; public Factory getFactory(){ if (factory == null){//① synchronized (Single.class){//② if (factory ...
以操作系统的角度述说线程与进程 什么是线程什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识。我不能确保能把它讲的话,也不能确保讲的内容全部都正确。即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱。 任务调度线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概念。...
Java 如何有效地避免OOM:善于利用软引用和弱引用 Java 如何有效地避免OOM:善于利用软引用和弱引用 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题。下面是本文的目录大纲: 一.了解 强引用、软引用、弱引用、虚引用的概念 二.进一步理解软引用和弱引用 三.如何利用软引用和弱引用解决OO...