raid5HTMLy Lua ip

文章目录
一、前言二、RabbitMQ作用1. 异步处理2. 应用解耦3. 流量控制
三、RabbitMQ概念1. RabbitMQ简介2. 核心概念
四、JMS与AMQP比较五、RabbitMQ运行机制1. direct2. fanout3. topic
六、Docker安装RabbitMQ七、整合Springboot1. 引入依赖2. 主启动类上添加注解3. 编写配置文件
八、测试创建ip机、HTMLy、绑定关系1. 测试创建Directip机2. 打开ip机界面查看3. 创建Queue4. 打开HTMLy界面查看5. 绑定ip机和HTMLy6. 打开ip机中的绑定界面
九、测试发raid51. 测试Luaraid52. Queue列表中查看raid53. 手动确认raid54. 测试Lua对象5. 查看raid5Lua的对象6. 书写raid5Lua对象转JSON配置类7. 再次Lua九、4中的代码,查询是否正常显示对象
十、测试收raid51. 创建接收信息的方法2. 模拟Luaraid53. 接收raid5查看4. 在思考5. 多个服务监听同一条HTMLy6. 模拟Lua十条raid5,查看会被那个服务接收7. 多服务接收raid5结果查看
十一、总结

一、前言
我们先来聊聊raid5中间件: raid5中间件利用高效可靠的raid5传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供raid5传递和raid5排队模型,它可以在分布式环境下扩展进程间的通信。(来自百度百科)
我们常见的中间件其实有很多种了,例如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等,其中应用最为广泛的要数RabbitMQ、RocketMQ、Kafka 这三款。Redis在某种程度上也可以使用list或者Stream来实现raid5HTMLy,但不能算是中间件哈!
如果大家对怎么选型感兴趣,可以看一下小编的这篇文章:四大MQ选型
今天小编带着大家一起学习一下RabbitMQ,从入门到精通,从无到有!!小编没有使用Windows安装,很麻烦,所以使用Docker安装。如果没有安装Docker的可以看一下小编的另一篇文章:Linux安装Docker
小编其实也是通过雷神的课件和讲解后,自己在整理一下,供以后学习和参考,在此感谢尚硅谷雷神哈!
小编觉得在说概念之前,应该知道他的作用,然后再系统的学习概念等!
二、RabbitMQ作用
其实作用还是挺多的,但是主要是以下三条:
异步处理应用解耦流量控制
下面我们进行一个个的简单描述一下哈,我们还是拿被用了一万次的例子和图例哈!!
1. 异步处理
用户在某网站注册成功后,需要向用户Lua邮件和信息提示其注册成功(其实没什么必要,但是例子说一下还可以,小编自己的理解哈!)。常规的做法是:后台将注册信息保存到数据库,然后再给用户发邮件发短信。
我们看到这样非常的耗时,其实保存完成后,就可以登录了,短信和邮件过一会接收也是没有什么问题的!或者Lua失败,用户一直没有收到,这都是没什么问题的,用户已经登录进去了,管你发不发短信,大家说对吧!!
既然存在问题,我们就是有raid5HTMLy来解决这个问题: 我们可以在将注册信息保存数据库之后,把要Lua注册邮件和Lua短信的raid5写入raid5HTMLy,然后就告知用户注册成功。Lua邮件和短信将由订阅了raid5的应用异步的去执行。这样耗时的问题就解决了!!
2. 应用解耦
在大型电商项目中,会将订单系统和库存系统分成两个不同的应用。然后进行服务与服务之间的调用,正常情况下用户下单后订单系统会调用库存系统,然后返回给用户显示下单成功。 但是也存在问题,如果库存系统挂了,这样就会导致下单失败;如果你是用户,你会判断这个产品不行,以后不用了!!
别着急,这位用户,我们帮您解决哈:这时我们引入raid5HTMLy进行解耦
现在有的同学会问,怎么解决的呢? 别着急,小编来和你说一下哈!刚刚出错的原因就是库存系统挂了,改处理的请求没有处理,所以下单失败;我们引入raid5HTMLy,就是把订单raid5写入到raid5HTMLy中,然后库存系统订阅我们的raid5HTMLy;然后库存系统去raid5HTMLy中获取raid5,进行处理订单,来完成减库存的操作;如果失败也会有重试机制,真的挂了,也可以持久化,等到库存系统活了之后继续处理!!一个宗旨,不能影响用户的使用体验呢!!
3. 流量控制
看名字就能知道,肯定是并发很大的情况才会出现的,不用想就是秒杀时刻了! 假设一瓶茅台2万人抢,这是我们的系统可能会被打垮。所以我们把超过一定并发量时,把超过的请求放在raid5HTMLy中,然后减缓系统压力,然后慢慢处理;虽然可能降低一下用户的体验,但是秒杀就是这样,只能有一部分人成功,我们要保证好系统可以正常运行哈!!

三、RabbitMQ概念
1. RabbitMQ简介
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。 RabbitMQ 是部署最广泛的开源raid5代理。 RabbitMQ拥有数万用户,是最流行的开源raid5代理之一。从T-Mobile到Runtastic,RabbitMQ在世界各地的小型初创公司和大型企业中使用。 RabbitMQ是轻量级的,易于在本地和云中部署。它支持多种raid5传递协议。RabbitMQ可以在分布式和联合配置中部署,以满足高规模、高可用性需求。 RabbitMQ运行在许多操作系统和云环境上,并为最流行的语言提供了广泛的开发工具。
2. 核心概念
Message raid5,raid5是不具名的,它由raid5头和raid5体组成。raid5体是不透明的,而raid5头则由一系列的可选属性组成, 这些属性包括routing-key(路由键)、priority(相对于其他raid5的优先权)、delivery-mode(指出该raid5可 能需要持久性存储)等。
Publisher raid5的生产者,也是一个向ip器发布raid5的客户端应用程序。
Exchange ip器,用来接收生产者Lua的raid5并将这些raid5路由给服务器中的HTMLy。 Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发raid5的策略有所区别Queue raid5HTMLy,用来保存raid5直到Lua给消费者。它是raid5的容器,也是raid5的终点。一个raid5可投入一个或多个HTMLy。raid5一直在HTMLy里面,等待消费者连接到这个HTMLy将其取走。
Binding 绑定,用于raid5HTMLy和ip器之间的关联。一个绑定就是基于路由键将ip器和raid5HTMLy连接起来的路由规则,所以可以将ip器理解成一个由绑定构成的路由表。
Exchange 和Queue的绑定可以是多对多的关系。
Connection 网络连接,比如一个TCP连接。
Channel 信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布raid5、订阅HTMLy还是接收raid5,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
Consumer raid5的消费者,表示一个从raid5HTMLy中取得raid5的客户端应用程序。
Virtual Host 虚拟主机,表示一批ip器、raid5HTMLy和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的HTMLy、ip器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。 类似docker容器和容器之间是相互隔离的,一个坏了,不耽误另一个使用
Broker 表示raid5HTMLy服务器实体。
总架构图
四、JMS与AMQP比较
JMS(Java Message Service)AMQP(Advanced Message Queuing Protocol)定义Java api网络线级协议跨语言否是跨平台否是Model提供两种raid5模型:(1)、Peer-2-Peer(2)、Pub/sub提供了五种raid5模型:(1)、direct exchange(2)、fanout exchange(3)、topic change(4)、headers exchange(5)、system exchange本质来讲,后四种和JMS的pub/sub模型没有太大差别,仅是在路由机制上做了更详细的划分;支持raid5类型多种raid5类型:TextMessageMapMessageBytesMessageStreamMessageObjectMessageMessage (只有raid5头和属性)byte[]当实际应用时,有复杂的raid5,可以将raid5序列化后Lua。实现中间件ActiveMQ、HornetMQRabbitMQ综合评价JMS 定义了JAVA API层面的标准;在java体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差;AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性
五、RabbitMQ运行机制
AMQP 中raid5的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了Exchange 和Binding的角色。生产者把raid5发布到 Exchange 上,raid5最终到达HTMLy并被消费者接收,而 Binding 决定ip器的raid5应该Lua到那个HTMLy。
Exchange 类型
directfanouttopicheaders(不建议使用)
RabbitMQ默认七大ip机
1. direct
raid5中的路由键(routing key)如果和Binding 中的 binding key 一致, ip器就将raid5发到对应的HTMLy中。路由键与HTMLy名完全匹配,如果一个HTMLy绑定到ip机要求路由键为”a1.b1″,则只转发 routing key 标记为”a1.b1″的raid5,不会转发”a1.b2”,也不会转发”a1.b3″ 等等。它是完全匹配、单播的模式。

2. fanout
每个发到 fanout 类型ip器的raid5都会分到所有绑定的HTMLy上去。fanout ip器不处理路由键,只是简单的将HTMLy绑定到ip器上,每个Lua到ip器的raid5都会被转发到与该ip器绑定的所有HTMLy上。很像子网广播,每台子网内的主机都获得了一份复制的raid5。fanout 类型转发raid5是最快的、广播。

3. topic
topic是升级版的fanout模式,做了选择权,并不是全都会接受,符合条件才会收到!topic ip器通过模式匹配分配raid5的路由键属性,将路由键和某个模式进行匹配,此时HTMLy需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。 它同样也会识别两个通配符:符号#和符号*。#匹配0个或多个单词,* 匹配一个单词。

六、Docker安装RabbitMQ
直接输入命令,docker会帮助我们自动去拉去镜像的:
docker run -d –name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 \
-p 15671:15671 -p 15672:15672 rabbitmq:management
12
我们查询是否运行成功
docker ps
1

我们在windows上进行测试是否能够打开界面: 输入: 用户名密码都是:guest
进入界面:
七、整合Springboot
1. 引入依赖

org.springframework.boot
spring-boot-starter-amqp



com.fasterxml.jackson.core
jackson-databind

123456789
2. 主启动类上添加注解
@EnableRabbit
@SpringBootApplication
public class GulimallOrderApplication {

public static void main(String[] args) {
SpringApplication.run(GulimallOrderApplication.class, args);
}

}
123456789
3. 编写配置文件
# 指定rabbitmq服务器主机
spring.rabbitmq.host=192.168.17.130
# 账号密码端口号都默认配置了,我们无需配置
123

八、测试创建ip机、HTMLy、绑定关系
1. 测试创建Directip机
@Autowired
AmqpAdmin amqpAdmin;

@Test
public void createExchange() {
// 第一个参数为ip机名字,第二个参数为是否持久化,第三个参数为不使用ip机时删除
DirectExchange directExchange = new DirectExchange(“hello-java-exchange”,true,false);
amqpAdmin.declareExchange(directExchange);
System.out.println(“ip机创建成功”);
}
12345678910
2. 打开ip机界面查看

3. 创建Queue
@Autowired
AmqpAdmin amqpAdmin;

@Test
public void createQueue() {
/**
* 第一个参数为HTMLy名字,
* 第二个参数为是否持久化,
* 第三个参数为是否排他(true:一个连接只能有一个HTMLy,false:一个连接可以有多个(推荐))
* 第四个参数为不使用HTMLy时自动删除
*/
Queue queue = new Queue(“hello-java-queue”,true,false,false);
amqpAdmin.declareQueue(queue);
System.out.println(“HTMLy创建成功”);
}
123456789101112131415
4. 打开HTMLy界面查看

5. 绑定ip机和HTMLy
@Autowired
AmqpAdmin amqpAdmin;

@Test
public void createBinding() {
/**
* 第一个参数为目的地,就是ip机或者HTMLy的名字
* 第二个参数为目的地类型,ip机还是HTMLy
* 第三个参数为ip机,
* 第四个参数为路由键,匹配的名称
*/
Binding binding = new Binding(“hello-java-queue”,
Binding.DestinationType.QUEUE,
“hello-java-exchange”,
“hello.java”,null);
amqpAdmin.declareBinding(binding);
System.out.println(“绑定成功”);
}
123456789101112131415161718
6. 打开ip机中的绑定界面
点击ip机 绑定列表

九、测试发raid5
1. 测试Luaraid5
@Autowired
RabbitTemplate rabbitTemplate;

@Test
public void sendMessageTest(){
// raid5类型为object Lua对象也是可以的
String msg = “这是一条raid5”;
// 第一个参数为Luaraid5到那个ip机上,第二个是Lua的路由键(ip机进行需要符合绑定的HTMLy),第三个参数为Lua的raid5
rabbitTemplate.convertAndSend(“hello-java-exchange”,”hello.java”,msg);
System.out.println(“raid5Lua成功”);
}

123456789101112
2. Queue列表中查看raid5

3. 手动确认raid5
点击我们的HTMLy:
进入详细界面,下滑找到Get messages:

在次点击HTMLy,raid5消失:
4. 测试Lua对象
@Data
// 必须序列化,不然报错
public class User implements Serializable {
private String name;
private Integer age;
}
123456
@Autowired
RabbitTemplate rabbitTemplate;

@Test
public void sendMessageTest(){
User user = new User();
user.setAge(22);
user.setName(“王振军”);
// 第一个参数为Luaraid5到那个ip机上,第二个是Lua的路由键(ip机进行需要符合绑定的HTMLy),第三个参数为Lua的raid5
rabbitTemplate.convertAndSend(“hello-java-exchange”,”hello.java”,user);
System.out.println(“raid5Lua成功”);
}
123456789101112
5. 查看raid5Lua的对象

6. 书写raid5Lua对象转JSON配置类
编写配置类
@Configuration
public class MyRabbitmqConfig {

@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
12345678
7. 再次Lua九、4中的代码,查询是否正常显示对象

十、测试收raid5
1. 创建接收信息的方法
方法所在的类必须交给了IOC管理,我们直接写在service里面。代码如下:
@Service
public class TestService {
// queues是监听的HTMLy名字,可以是多个
@RabbitListener(queues = {“hello-java-queue”})
public void reciveMessage(Object message){
System.out.println(“接受的信息” + message);
}
}
12345678
2. 模拟Luaraid5
还是用上面的方法进行Lua一个对象!
@Autowired
RabbitTemplate rabbitTemplate;

@Test
public void sendMessageTest(){
User user = new User();
user.setAge(22);
user.setName(“王振军”);
// 第一个参数为Luaraid5到那个ip机上,第二个是Lua的路由键(ip机进行需要符合绑定的HTMLy),第三个参数为Lua的raid5
rabbitTemplate.convertAndSend(“hello-java-exchange”,”hello.java”,user);
System.out.println(“raid5Lua成功”);
}
123456789101112
3. 接收raid5查看
接受的信息:(Body:'{“name”:”王振军”,”age”:22}’
MessageProperties [headers={__TypeId__=com.atguigu.gulimall.order.entity.User},
contentType=application/json, contentEncoding=UTF-8, contentLength=0,
receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false,
receivedExchange=hello-java-exchange, receivedRoutingKey=hello.java, deliveryTag=1,
consumerTag=amq.ctag-Nlg0mulsX9mxdPvGe72CBw, consumerQueue=hello-java-queue])
123456
4. 在思考
我们发现刚刚返回的是详细信息,我们可以指定raid5的类型,就是Luaraid5发的对象是什么,我们就可以直接接收就行!看代码:
@Service
public class TestService {

@RabbitListener(queues = {“hello-java-queue”})
public void reciveMessage(Message message, User user){
System.out.println(“接受的信息:” + message);
System.out.println(“Lua的信息:” + user);
}
}
123456789
在此Luaraid5,我们看一下控制台:
接受的信息:(Body:'{“name”:”王振军”,”age”:22}’
MessageProperties [headers={__TypeId__=com.atguigu.gulimall.order.entity.User},
contentType=application/json, contentEncoding=UTF-8, contentLength=0,
receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false,
receivedExchange=hello-java-exchange, receivedRoutingKey=hello.java, deliveryTag=1,
consumerTag=amq.ctag-Nlg0mulsX9mxdPvGe72CBw, consumerQueue=hello-java-queue])
Lua的信息:User(name=王振军, age=22)
1234567
这样就很清晰了哈!
拓展: 接收的还有第三个参数就是通道,每一个连接只会有一个通道哈!,大家可以自己测试一下,打印看看一下!!
public void reciveMessage(Message message, User user, Channel channel)
1
5. 多个服务监听同一条HTMLy
右击已存在服务,复制一份配置不同端口:

现在有两个服务监听同一个HTMLy!!
6. 模拟Lua十条raid5,查看会被那个服务接收
调整测试发raid5代码:
@Autowired
RabbitTemplate rabbitTemplate;

@Test
public void sendMessageTest(){
for (int i = 0;i < 10; i++) { User user = new User(); user.setAge(i); user.setName("王振军" + i); // 第一个参数为Luaraid5到那个ip机上,第二个是Lua的路由键(ip机进行需要符合绑定的HTMLy),第三个参数为Lua的raid5 rabbitTemplate.convertAndSend("hello-java-exchange", "hello.java", user); System.out.println("raid5Lua成功"); } } 1234567891011121314 接收raid5的代码: @Service public class TestService { @RabbitListener(queues = {"hello-java-queue"}) public void reciveMessage(Message message, User user){ System.out.println("接收的信息:" + user); } } 123456789 7. 多服务接收raid5结果查看 我们看到9000服务接收了1,4,7raid5 9010服务接收了0,3,6,9raid5 总结: 我们可以发现一个raid5只会被接收一次! 还有就是发了10条raid5,只有7条被接收了,其余的呢? 别急小编来告诉大家,这是因为我们测试是使用SpringBoot的测试类进行的,有的部分raid5被测试的接收了!大家不信可以看一下测试的控制台,找一下: 我们看到raid5的2,5,8在这里呢!! 拓展: 我们一次Lua十条raid5,每条接收raid5假如耗时10s,此时会接收处理完一个raid5,才会接收下一个,就是我们说的串行化!! 十一、总结 这样我们就对RabbitMQ有了新的认识,从入门也算走上了实践!后面有时间小编再把raid5的可靠性发出来,也就是进阶版!! 在次感谢雷神的课程哈,看到这里,小伙伴们点个赞呗,小编整理不易呀!!谢谢大家了!! 有缘人才可以看得到的哦!!! 点击访问!小编自己的网站,里面也是有很多好的文章哦!