科技新闻

Reactor模型的Java NIO实现

一曲冷凌霜 提交于 2020-03-01 12:02:24
实现Reactor模型可分为以下三种: 单线程模型 单Reactor多线程模型 主从Reactor多线程模型。 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个线程上面完成,线程的职责如下: 作为NIO服务端,接收客户端的TCP连接; 作为NIO客户端,向服务端发起TCP连接; 读取通信对端的请求或者应答消息; 向通信对端发送消息请求或者应答消息。 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。 Server端 public class Reactor1 { public static void main(String[] args) throws IOException { Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

粘包的原理与解决

徘徊边缘 提交于 2020-03-01 10:45:37
粘包现象 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了       2.客户端没有粘,可能是在服务端粘了 所谓粘包问题主要还是因为接收方不知道消息之间的界限 还有系统缓存区的问题 时间差的原因,不知道一次性提取多少字节的数据所造成的。 socket收发消息的原理 什么是缓冲区 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:1024字节=1k 缓冲区的作用? 存储少量数据 如果你的网络出现短暂的异常或者波动,接收数据就会出现短暂的中断,影响你的下载或者上传的效率. 但是 凡是都是双刃剑,缓冲区解决了上传下载的传输效率的问题,带来了黏包问题. 为什么出现粘包? 第一种.连续短暂的send多次(数据量很少),你的数据会统一发送出去, (不可控) 第二种: send的数据过大,大于对方recv的上限时,对方第2次recv时,会接收上一次没有recv完的剩余的 1,接收方没有及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)** recv会产生黏包(如果recv接受的数据量(1024)小于发送的数据量,第一次只能接收规定的数据量1024,第二次接收剩余的数据量) 2,发送端需要等缓冲区满才发送出去

RabbitMQ---SpringBoot整合RabbitMQ(Fanout交换器)

旧街凉风 提交于 2020-03-01 10:12:54
Fanout交换器特点: 各个队列与Topic交换器之间没有路由键绑定配置,发送者发送一条消息给交换器, 只要与此交换器绑定的队列,都会接收到消息。 生产者module,只需要指定交换器,发送消息也只需要指定交换器即可 pom.xml导入RabbitMQ坐标 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> application.properties配置RabbitMQ信息 #RabbitMQ基本信息 spring.rabbitmq.host=182.61.40.184 spring.rabbitmq.port=5672 spring.rabbitmq.username=rabbitmq spring.rabbitmq.password=rabbitmq #自定义配置 #设置交换器名称 spring.rabbitmq.exchange.name=fanoutExchange 创建Controller,通过浏览器请求,发送消息到RabbitMQ @Controller public class RabbitMQController { @Autowired private

RabbitMQ---SpringBoot整合RabbitMQ(Topic交换器)

吃可爱长大的小学妹 提交于 2020-03-01 10:02:23
Topic交换器特点: 各个队列与Topic交换器之间的路由键配置 模糊 ,发送者发送一条消息,只要 路由键符合规则 的队列就能接收到消息。 创建消息生产者module:配置交换器名称和路由键信息。消息发送时,需要指定交换器和路由键。 pom.xml导入RabbitMQ坐标 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> application.properties配置RabbitMQ信息 #RabbitMQ基本信息 spring.rabbitmq.host=182.61.40.184 spring.rabbitmq.port=5672 spring.rabbitmq.username=rabbitmq spring.rabbitmq.password=rabbitmq #自定义配置 #设置交换器名称 spring.rabbitmq.exchange=topicExchange #设置路由键 user.log.info spring.rabbitmq.routingkey.user.info=user.log.info #设置路由键 user.log.error spring

MQ(一)消息队列的流派

ぃ、小莉子 提交于 2020-03-01 08:35:54
什么是 MQ Message Queue(MQ),消息队列中间件。 很多人都说: MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的,但是这个只是 MQ 的效果而不是目的。 MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。 一个分布式系统中两个模块之间通讯要么是 HTTP,要么是自己开发的 TCP,但是这两种协议其实都是原始的协议。 HTTP 协议很难实现两端通讯——模块 A 可以调用 B,B 也可以主动调用 A,如果要做到这个两端都要背上 WebServer,而且还不支持长连接(HTTP 2.0 的库根本找不到)。 TCP 就更加原始了,粘包、心跳、私有的协议,想一想头皮就发麻。 MQ 所要做的就是在这些协议之上构建一个简单的“协议”—— 生产者/消费者模型。 MQ 带给我的“协议”不是具体的通讯协议,而是更高层次 通讯模型 。 它定义了两个对象——发送数据的叫生产者,接收数据的叫消费者; 提供一个 SDK 让我们可以定义自己的生产者和消费者实现消息通讯而无视底层通讯协议。 分类: MQ,分为有Broker的MQ,和没有Broker的MQ。 Broker,代理,经纪人的意思。 无Broker的MQ 无 Broker 的 MQ 的代表是 ZeroMQ。 有Broker的MQ

SpringBoot国际化

扶醉桌前 提交于 2020-03-01 08:02:38
本文主要讲解国际化的实现 基于spring boot的2.1.7版本 步骤: 1)、编写国际化配置文件,抽取页面需要显示的国际化消息 2),SpringBoot自动配置好了国际化资源文件,其默认的配置文件路径是 messages.properties ;配置文件放在此路径下直接生效;但一般情况下会更改默认的配置文件路径。例如本例中的配置文件路径。 所以需要在配置文件中进行修改: spring.messages.basename=i18n.login 3)去页面获取国际化值: 使用thymeleaf语法获取 4)国际化原理 国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象); @Bean @ConditionalOnMissingBean @ConditionalOnProperty(prefix = "spring.mvc", name = "locale") public LocaleResolver localeResolver() { if (this.mvcProperties .getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) { return new FixedLocaleResolver(this.mvcProperties.getLocale()); }

Visual Paradigm 教程[UML]:如何在序列图中应用消息编号?

二次信任 提交于 2020-03-01 06:39:51
下载Visual Paradigm最新试用版 在本教程中,我们将介绍两种主要方式:基于图表和基于框架。当我们将“scope”指定为图表或框架时,基本上我们告诉Visual Paradigm它应该重新启动消息的数字序列。 1.基于图表的编号 基于图表的编号(单级) 在UML序列图中,右键单击背景并选择序列号>单级。 作为一个例子,我们可以看到,尽管使用了一个框架元素,但只要它们在同一个图表中,数字序列就会继续。 基于图表的编号(嵌套级别) 在UML序列图中,右键单击背景并选择序列号>嵌套级别。 类似地,我们可以看到,尽管使用了帧元素,但只要它们在同一个图中,数字序列就会继续。 2.基于帧的编号 基于帧的编号(单级) 在您的UML序列图中,右键单击背景并选择序列号>基于帧的单级。 作为一个例子,我们可以看到消息编号在帧中重新开始,尽管它在同一个图中。 基于帧的编号(嵌套级别) 在您的UML序列图中,右键单击背景并选择序列号>基于帧的嵌套级别。 例如,在这里我们可以看到消息编号在帧中重新开始。此外,“小数”用于反映程序调用的嵌套级别。 下载Visual Paradigm最新试用版 来源: oschina 链接: https://my.oschina.net/u/3905944/blog/3056427

Visual Paradigm 教程[UML]:如何在序列图中使用持续时间约束?

耗尽温柔 提交于 2020-03-01 06:39:37
下载Visual Paradigm最新试用版 在UML序列图中,持续时间消息用于表示消息的时间流逝。当您想要建模实时系统时,它尤其有用。在 Visual Paradigm ,您只需点击一下即可为邮件添加持续时间约束。本教程将演示 如何在序列图中定义持续时间约束 。 下载 Online Book Store.vpp 。 在 Visual Paradigm 中打开下载的.vpp文件。要打开project,请从应用程序工具栏中选择“ Project ”>“ Open ”。 我们以下面的UML序列图为例: 假设您需要指定Browse消息和Book List消息之间的时间限制,因此必须在它们之间添加持续时间约束。将鼠标移到浏览消息上,然后按Duration Constraint按钮。 将其从“Browse”消息拖到“Book List”消息,然后释放鼠标。 在标题内输入约束详细信息。例如,它应该花费超过3秒但不到5分钟。您可以输入> 3s& < 5mins。 Browse消息和Book List消息之间的持续时间约束如下所示: 另一方面,您不仅可以在两条消息之间添加持续时间约束,还可以在消息本身之间添加持续时间约束。让我们尝试在Query消息上添加持续时间约束。将鼠标移到Query消息上,然后单击Duration Constraint按钮。 假设它应该少于10秒。在标题内输入<10s。

RocketMQ学习笔记(五)

夙愿已清 提交于 2020-03-01 06:07:12
消息轨迹 1. 消息轨迹数据关键属性 Producer端 Consumer端 Broker端 生产实例信息 消费实例信息 消息的Topic 发送消息时间 投递时间,投递轮次 消息存储位置 消息是否发送成功 消息是否消费成功 消息的Key值 发送耗时 消费耗时 消息的Tag值 2. 支持消息轨迹集群部署 2.1 Broker端配置文件 这里贴出Broker端开启消息轨迹特性的properties配置文件内容: brokerClusterName=DefaultCluster brokerName=broker-a brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH storePathRootDir=/data/rocketmq/rootdir-a-m storePathCommitLog=/data/rocketmq/commitlog-a-m autoCreateSubscriptionGroup=true ## if msg tracing is open,the flag will be true traceTopicEnable=true listenPort=10911 brokerIP1=XX.XX.XX.XX1 namesrvAddr

ActiveMQ系列(三)springboot整合ActiveMQ实现消息的发布订阅

孤人 提交于 2020-03-01 06:04:46
上篇文章 《ActiveMQ系列(二)》 中实现了消息队列模式,本文开始实现主题消息的发布和订阅。 maven依赖 新建springboot的过程不再赘述,这里在pom文件中直接以用maven依赖: < dependency > < groupId > org . springframework . boot < / groupId > < artifactId > spring - boot - starter - activemq < / artifactId > < / dependency > yml配置 spring : activemq : broker - url : tcp : / / 192.168 .17 .101 : 61616 user : admin password : admin jms : pub - sub - domain : true #默认 false = Queue true = Topic #自己定义的主题名称 mytopic : boot - activemq - topic 配置bean @Component @EnableJms public class ActiveMqConfigBean { @Value ( "${mytopic}" ) private String myTopic ; @Bean public Topic