【RabbitMQ】RabbitMQ 基础

image-20210831143417355

MQ 简介

什么是 MQ

MQ (message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦 + 物理解耦” 的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务,由MQ将消息发送给下游消费者。

为什么要用 MQ

流量消峰

举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。

应用解耦

以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在 这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性。

image-20210831215725573

异步处理

有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完。

以前一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api,B 执行完之后调用 api 通知 A 服务。这两种方式都不是很优雅。

使用消息总线,可以很方便解决这个问题, A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供 callback api。同样 B 服务也不用做这些操作,A 服务还能及时的得到异步处理成功的消息。

image-20210831215804163

阅读全文

【Spring Cloud】Spring Cloud Gateway

Gateway 简介

Gateway官网

Spring Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关。但在2.x版本中,Zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,那就是Spring Cloud Gateway。—句话:Gateway是原zuul1.x版的替代。

img

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。

Spring Cloud Gateway的目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

Spring Cloud Gateway提供了统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

阅读全文

【Spring Cloud】Hystrix

Hystrix 简介

概述

分布式系统面临的问题:复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

服务雪崩:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。

对于高流量的应用来说,单一的后避依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

Hystrix 是什么

Hystrix官网:https://github.com/Netflix/Hystrix/wiki/How-To-Use

Hystrix是一个用于处理分布式系统的延迟容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

阅读全文

【Spring Cloud】OpenFeign

OpenFeign 简介

官方文档

Feign是一个声明式的HTTP客户端,它的目的就是让远程调用更简单。它是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。使用Feign调用API就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装JSON数据的繁琐。

Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。Github地址

Feign集成了Ribbon和RestTemplate。Ribbon+Eureka是面向微服务编程,而Feign是面向接口编程。

Feign 能干什么

Feign旨在使编写Java HTTP客户端变得更容易。

在使用Ribbon + RestTemplate进行服务调用时(见文章【Spring Cloud】Ribbon),利用RestTemplate对HTTP请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。

所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(类比Dao接口上面标注@Mapper注解,现在是一个微服务接口上面标注一个@FeignClient注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon时封装服务调用客户端的开发量。

Feign利用动态代理机制对Ribbon和RestTemplate进行了封装,使用接口的方式实现负载均衡和服务调用。

阅读全文

【Spring Cloud】Ribbon

Ribbon 简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具Github - Ribbon

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。

简单地说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

Ribbon = 负载均衡 + RestTemplate调用

ribbon
n. (用于捆绑或装饰的)带子;丝带;带状物;狭长的东西;绶带;勋带

阅读全文

【Spring Cloud】Eureka

Eureka 简介

服务治理

Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务治理

服务治理:在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。

服务注册与服务发现

服务注册:在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。

服务发现:另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,之后再实现本地RPC调用。

总结:

  • 服务注册:将服务信息注册进注册中心
  • 服务发现:从注册中心上获取服务信息

RPC远程调用框架核心设计思想在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)

img

Eureka包含两个组件:Eureka ServerEureka Client

  • Eureka Server:提供服务注册服务。各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
  • Eureka Client:注册到注册中心的服务。是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器(Ribbon)。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
阅读全文

【Maven】Maven

image-20210913132641433

Maven 简介

软件开发中的阶段

  • 需要分析: 分析项目具体完成的功能,有什么要求,具体怎么实现
  • 设计阶段:根据分析的结果,设计项目的使用什么技术,解决难点
  • 开发阶段:编码实现功能,编译代码,自我测试
  • 测试阶段:专业的测试人员,测整个项目的功能十分符合设计要求。出一个测试报告
  • 发布阶段: 项目的打包,给用户安装项目

什么是 Maven

maven是apache基金会的开源项目,使用java语法开发。Maven这个单词的本意是:专家,内行。maven是项目的自动化构建工具,用于管理项目的依赖。下载地址: http://maven.apache.org/

Maven 能做什么

  • 项目的自动构建,帮助开发人员做项目代码的编译,测试,打包,安装,部署等工作
  • 管理依赖(管理项目中使用的各种jar包)

依赖:项目中需要使用的其他资源,常见的是jar。比如项目要使用mysql驱动。我们就说项目依赖mysql驱动。

Maven 中的概念

  • POM
  • 约定的目录结构
  • 坐标
  • 依赖管理
  • 仓库管理
  • 生命周期
  • 插件和目标
  • 继承
  • 聚合
阅读全文

【Spring Boot】Spring Boot2 整合第三方技术

本文将介绍Spring Boot整合第三方技术的配置、原理与示例。

  • DataSourceAutoConfiguration:数据源自动配置类
  • MybatisAutoConfiguration:MyBatis 自动配置类(第三方)
  • RedisAutoConfiguration:Redis 自动配置类
  • RabbitAutoConfiguration:RabbitMQ 自动配置类
阅读全文

【ZooKeeper】Spring Boot 整合 ZooKeeper

ZooKeeper是一个分布式协调工具,可以实现注册中心功能,Spring Cloud中整合ZooKeeper时创建的服务节点是临时节点。ZooKeeper详细介绍参考文章 【ZooKeeper】ZooKeeper

本文将给出 Spring Boot 整合 ZooKeeper 的案例。

支付服务

新建名为cloud-provider-payment8004的支付服务Maven工程,占用端口8004。

引入 Maven 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- Spring Cloud整合zookeeper客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--先排除自带的zookeeper3.5.3 防止与3.4.9起冲突-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.9版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>

需要注意,spring-cloud-starter-zookeeper-discovery场景启动器自带一个ZooKeeper依赖,其版本可能与自己的ZooKeeper版本不兼容,从而无法启动Spring Boot项目,因此在pom文件中首先排除掉spring-cloud-starter-zookeeper-discovery中的ZooKeeper依赖,再自己添加符合自己版本的ZooKeeper依赖。(也可能会出现log4j依赖的冲突,解决方案相同)

阅读全文