Notes Site.
post @ 2024-03-27

JNDI

概述

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。JNDI提供统一的客户端API,并由管理者将JNDI API映射为特定的命名服务目录服务,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。简单来说,开发人员通过合理的使用JNDI,能够让用户通过统一的方式访问获取网络上的各种资源和服务。如下图所示

image-20240320194727812

命名服务(Naming Server)

命名服务,简单来说,就是一种通过名称来查找实际对象的服务。比如我们的RMI协议,可以通过名称来查找并调用具体的远程对象。再比如我们的DNS协议,通过域名来查找具体的IP地址。这些都可以叫做命名服务。

在命名服务中,有几个重要的概念。

  • Bindings:表示一个名称和对应对象的绑定关系,比如在在 DNS 中域名绑定到对应的 IP,在RMI中远程对象绑定到对应的name,文件系统中文件名绑定到对应的文件。
  • Context:上下文,一个上下文中对应着一组名称到对象的绑定关系,我们可以在指定上下文中查找名称对应的对象。比如在文件系统中,一个目录就是一个上下文,可以在该目录中查找文件,其中子目录也可以称为子上下文 (SubContext)。
  • References:在一个实际的名称服务中,有些对象可能无法直接存储在系统内,这时它们便以引用的形式进行存储,可以理解为 C/C++ 中的指针。引用中包含了获取实际对象所需的信息,甚至对象的实际状态。比如文件系统中实际根据名称打开的文件是一个整数 fd (file descriptor),这就是一个引用,内核根据这个引用值去找到磁盘中的对应位置和读写偏移。

目录服务(Directory Service)

简单来说,目录服务是命名服务的扩展,除了名称服务中已有的名称到对象的关联信息外,还允许对象拥有属性(Attributes)信息。由此,我们不仅可以根据名称去查找(Lookup)对象(并获取其对应属性),还可以根据属性值去搜索(Search)对象。

Read More

RMI

post @ 2024-03-20

RMI

概述

RMI(Remote Method Invocation)是计算机之间通过网络实现对象调用的一种通讯机制。它允许在Java虚拟机(JVM)之间进行通信,使得在一个JVM中的对象可以调用另一个JVM中的对象的方法,就像这些对象都在同一个JVM中一样。

服务端(Server):

  • 服务端创建一个远程对象,并实现一个或多个远程接口。
  • 服务端启动 RMI 注册表,并将远程对象绑定到注册表中。

客户端(Client):

  • 客户端从 RMI 注册表中查找所需的远程对象。
  • 客户端获取远程对象的引用,并调用其方法。

测试环境:JDK8u41

RMIServer.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class RMIServer {
// 接口
public interface IRemoteObj extends Remote {
public String hello(String para) throws RemoteException;
}
public class RemoteObjImpl extends UnicastRemoteObject implements IRemoteObj {
protected RemoteObjImpl() throws RemoteException {
super();
}
public String hello(String para) throws RemoteException {
System.out.println(para);
return "over";
}
}
private void start() throws Exception {
// 实例化远程对象
RemoteObjImpl h = new RemoteObjImpl();
// 创建注册中心
LocateRegistry.createRegistry(1099);
// 绑定对象示例到注册中心
Naming.rebind("rmi://127.0.0.1:1099/Remote", h);

// Naming.rebind(静态方法) 和 registry.bind(实例方法) 都是将一个远程对象绑定到 RMI 注册表中,Naming.rebind()方法是JNDI的一部分
// RemoteObjImpl h = new RemoteObjImpl();
// Registry registry = LocateRegistry.createRegistry(1099);
// registry.bind("Remote", h);
}

public static void main(String[] args) throws Exception {
new RMIServer().start();
}
}

Read More
⬆︎TOP