0%

DirectBuffer

之前我们用ByteBuffer.allocate()看一下源码:

1
2
3
4
5
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}

HeapByteBuffer是从堆上分配的内存空间创建的Buffer,实际上JDK还提供了另外一种方式ByteBuffer.allocateDirect():

1
2
3
public static ByteBuffer allocateDirect(int capacity) {
return new DirectByteBuffer(capacity);
}
阅读全文 »

Buffer

java NIO中的Buffer用于和NIO通道进行交互。数据从通道读入到缓冲区,从缓冲区写入到通道中。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

之前代码里面用到了ByteBuffer,实际上ByteBuffer不只是可以放byte在里面,也可以放别的类型数据,但是取出来的时候必须跟放进去的类型顺序也保持一致,否则会报错。(BufferUnderflowException)

put & get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class NioTest5 {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(64);

buffer.putInt(15);
buffer.putLong(50000000L);
buffer.putDouble(14.123123);
buffer.putChar('好');
buffer.putShort((short) 2);
buffer.putChar('的');

buffer.flip();

System.out.println(buffer.getInt());
System.out.println(buffer.getLong());
System.out.println(buffer.getDouble());
System.out.println(buffer.getChar());
System.out.println(buffer.getShort());
System.out.println(buffer.getChar());

}
}
阅读全文 »

Java NIO

“对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。”
――《Think in Java》

下面一起来研究一下NIO的用法,先来一段示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class NioTest1 {
public static void main(String[] args) {
IntBuffer buffer = IntBuffer.allocate(10);
for (int i = 0; i < buffer.capacity(); i++) {
int randomNumber = new SecureRandom().nextInt(20);
buffer.put(randomNumber);
}

buffer.flip();

while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
}
}
阅读全文 »

Spring Boot Admin

Kotlin版本

Java版本

简介

简单的后台开发模板框架,具备用户管理,菜单管理和角色管理3个功能,权限控制到按钮层级。

采用JWT+Spring Security进行权限验证和会话保持
项目基于Spring Boot+Mybatis+BootStrap+DataTables

前端代码不是我自己写的,后端有Kotlin和Java两个版本,Kotlin对Java生态的兼容比较好,我是先做的Java版,只花了一点时间就把Java版本’复制‘成了Kotlin版本。

阅读全文 »

gRPC

Define your service using Protocol Buffers, a powerful binary serialization toolset and language

gRPC是基于Protobuf开发的RPC框架,简化了protobuf的开发,提供了服务端和客户端网络交互这一块的代码。

Demo

照着 https://grpc.io/docs/quickstart/java.html 测试一下官方的Demo。

记得要把Update a gRPC service部分做了。

阅读全文 »

Thrift

  • Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,JavaScript,Node.js,SmallTalk and OCaml都支持。
  • Thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(Interface Description Language)
  • Thrift不支持无符号类型,因为很多变成语言不存在无符号类型,比如Java

Thrift数据类型

  • byte:有符号字节
  • i16:16位有符号整数
  • i32:32位有符号整数
  • i64:64位有符号整数
  • double:64位有符号整数
  • double:64位浮点数
  • string:字符串
阅读全文 »

Google Protobuf

https://developers.google.com/protocol-buffers/

接下来看一下Google Protobuf的使用方式。Protobuf的主要作用是用来进行RPC的传输。它跟Apache Thrift属于同一个领域的框架,都可以用来序列化和反序列化数据进行传输。

RMI介绍

目前Java中有一门比较成熟,同时也是EJB的标准的技术叫做RMI(remote method invocation)。RMI限制了只能基于Java调用。这种跨机器的调用,是客户端序列化后字节码再通过网络进行传输到服务端,服务端再反序列化数据进行代码调用。这就涉及到2个概念,

阅读全文 »

随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。

  我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。   

阅读全文 »

Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容。

为什么我们需要新的Java日期/时间API?

在开始研究Java 8日期/时间API之前,让我们先来看一下为什么我们需要这样一个新的API。在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:

  1. Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
  2. java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
  3. 对于时间、时间戳、格式化以及解析,并没有一些明确定义的类。对于格式化和解析的需求,我们有java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求。
  4. 所有的日期类都是可变的,因此他们都不是线程安全的,这是Java日期类最大的问题之一。
  5. 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
    阅读全文 »