首页编程java编程java分布式用什么技术(java分布式开发涉及到哪些技术(分布式java应用))

java分布式用什么技术(java分布式开发涉及到哪些技术(分布式java应用))

编程之家 2023-10-14 78次浏览

今天给各位分享java分布式用什么技术的知识,其中也会对java分布式开发涉及到哪些技术(分布式java应用)进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

java分布式用什么技术(java分布式开发涉及到哪些技术(分布式java应用))

分布式处理技术是什么

Java分布式处理技术

1.1 RMI的基本概念

1.1.1什么是RMI

java分布式用什么技术(java分布式开发涉及到哪些技术(分布式java应用))

RMI(Remote Method Invocation)远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。

1.1.2 RMI的用途

1、分布式体系结构

java分布式用什么技术(java分布式开发涉及到哪些技术(分布式java应用))

我们为什么要使用分布式计算呢?

Ø当我们想与多个用户或客户机共享一个中央资源(如一个数据库)时,就会使用分布式计算。

Ø分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题。

可以用多种方法配置多个计算机系统以共享处理,包括共享内存、共享磁盘或只是共享一条公共通信通道。最新的技术允许物理上相隔很远的系统能够在处理计算问题时协同工作。

关于利用计算能力这一主题,因特网及伴随的通信协议 TCP/IP的出现已使无数的计算机系统史无前例地连接起来。对一些应用程序来说,能够利用如此多的计算功能来解决问题是令人满意的。甚至更吸引人的是,大多数计算机系统都有充足的空闲时间,可以帮助解决其它问题。将来,网格计算会利用分布式计算能力进行出售,这与电力行业出售电能非常相似。

2、 Java分布式对象编程技术

RMI是 Enterprise JavaBeans的支柱,是建立分布式 Java应用程序的方便途径。只要按照 RMI规则设计程序,可以不必再过问在 RMI之下的网络细节了,如: TCP和 Socket等等。任意两台计算机之间的通讯完全由 RMI负责。调用远程计算机上的对象就像本地对象一样方便。

1.1.3 RMI应用程序分类

依据 RMI应用程序各部分职责,可对应用程序进行如下分类:

Ø服务器程序:服务器程序将创建多个远程对象,并使每个对象能够被引用。等待客户端调用创建好的远程对象上的方法。

Ø客户端程序:从服务端程序中得到一个或多个远程对象的引用。客户端能用此引用调用远程对象上的方法。

Ø对等计算程序:双方地位相等,互为对方的服务器和客户端。

1.2创建 RMI应用程序步骤

1、定义远程接口

在 Java中,远程对象是实现远程接口的类的实例,远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。远程接口具有如下特点:

Ø远程接口必须为 public属性。如果不这样,除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时,调用会得到错误结果。

Ø远程接口必须扩展接口 java.rmi.Remote。

Ø除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的 throws从句中声明 java.rmi.RemoteException。(或 RemoteException的父类)。

代码范例 1

package com.itjob;

import java.rmi.*;

public interface RmiSample extends Remote{

public int sum(int a,int b) throws RemoteException;

}

2、实现远程接口

远程对象实现类必须扩展远程对象 java.rmi.UnicastRemoteObject类,并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为基础类构造函数可能会抛出 java.rmi.RemoteException,所以即使别无它用必须抛出 java.rmi.RemoteException例外。

代码范例 2

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.server.*;

import com.itjob.RmiSample;

/**

远程接口实现类,继承了 UnicastRemoteObject并实现了 RmiSample远程接口

*/

public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample{

//覆盖默认构造函数并抛出 RemoteException

public RmiSampleImpl() throws RemoteException{

super();

}

//所有远程实现方法必须抛出 RemoteException

public int sum(int a,int b) throws RemoteException{

return a+b;

}

}

3、编写服务器类

包含 main方法的类可以是实现类自身,也可以完全是另一个类。下面通过 RmiSampleServer来创建一个远程对象的实例,并通过 java.rmi.registry.LocateRegistry类的 createRegistry方法从指定端口号启动注册服务程序,也可以通过执行 rmiregistry命令启动注册服务程序,注册服务程序的缺省运行端口为 1099。

代码范例 3

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.registry.*;

public class RmiSampleServer{

public static void main(String[] args){

/*创建和安装一个安全管理器,令其支持 RMI.作为 Java开发包的一部分

*适用于 RMI唯一一个是 RMISecurityManager.

*

if(System.getSecurityManager()== null){

System.setSecurityManager(new RMISecurityManager());

}

*/

try{

LocateRegistry.createRegistry(8808);

RmiSampleImpl server=new RmiSampleImpl();

Naming.rebind("//localhost:8808/SAMPLE-SERVER",server);

System.out.println("远程对象注册成功, RMI服务已经启动,等待客户端调用....");

}catch(java.net.MalformedURLException me){

System.out.println("Malformed URL:"+me.toString());

}catch(RemoteException re){

System.out.println("Remote exception:"+re.toString());

}catch(AlreadyBoundException abe){

System.out.println("(AlreadyBound exception:"+ abe.toString());

}

}

}

Ø代码范例 3中将将远程对象名字绑定到对远程对象的引用上:

LocateRegistry.createRegistry(8808);指定本 RMI服务程序不使用默认端口 1099,而是使用自己指定的端口 8808。

Naming.rebind("//localhost:8808/SAMPLE-SERVER", Server);将远程对象在服务器上注册并指定了将查找远程对象引用的 URL, URL格式为//host:port/name。其中 host是注册表所在的主机(远程或本地), port是注册表接受调用的端口号, name是未经注册表解释的简单字符串。 host和 port两者都是可选项。如果省略了 host,则主机默认为本地主机。如果省略了 port,则端口默认为 1099,该端口是 RMI的注册表 rmiregistry使用的“著名”端口。

代码范例 3的运行结果如图所示:

图 14.1代码范例 3运行结果

4、编写使用远程服务的客户机类

客户机类的主要功能有两个,一是通过 Naming.lookup方法来构造注册服务程序 stub程序实例,二是调用服务器远程对象上的远程方法。

代码范例 4

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.server.*;

public class RmiSampleClient{

public static void main(String[] args)

{

try{

String url="//localhost:8808/SAMPLE-SERVER";

RmiSample RmiObject=(RmiSample)Naming.lookup(url);

System.out.println(" 1+ 2="+ RmiObject.sum(1,2));

} catch(RemoteException exc){

System.out.println("Error in lookup:"+ exc.toString());

} catch(java.net.MalformedURLException exc){

System.out.println("Malformed URL:"+ exc.toString());

} catch(java.rmi.NotBoundException exc){

System.out.println("NotBound:"+ exc.toString());

}

}

}

5、为远程对象实现创建根和干

客户端是通过 Naming.lookup方法来构造注册服务程序 stub程序实例,通过该实例的引用来发起对远程对象方法调用的,所以在运行运行客户端应用前必须为远程对象实现创建根(stub)和干(Skeleton)。要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic编译器。存根( Stub)是远程对象在客户端的代理,它将 RMI调用传递给服务器端的骨架( Skeleton),后者负责将该调用传递给实际的远程方法。在命令行模块下运行 RMIC调用:

图 14. 2 RMIC命令

调用 RMIC命令运行结果如图所示:

图 14.3 RMIC运行结果

Ø我们可以看系统帮我们生成了存根(stub)RmiSampleImpl_Stub.class但系统并没有帮我们生成骨架( Skeleton) RmiSampleImpl_ Skeleton.class。这与 JDK的版本有关:

采用 JDK1.4版本运行 rmic com.itjob.rmi. RmiSampleImpl命令系统将会生成存根(stub)RmiSampleImpl_Stub.class和骨架( Skeleton) RmiSampleImpl_ Skeleton.class两个类文件;

采用 JDK1.5版本运行 rmic com.itjob.rmi. RmiSampleImpl命令系统将只会生成存根(stub)RmiSampleImpl_Stub.class,骨架( Skeleton) RmiSampleImpl_ Skeleton.class的功能将通反射技术由系统在运行时自动实现;

6、运行程序

依次做完上述步骤后,我们现在来运行一下我们的 RMI应用。先运行服务端程序,运行结果如图 14.1所示。

接下来我们运行客户端程序(代码范例 4),运行结果如图所示:

图 14.4客户端程序运行结果

看到上面结果说明我们客户端程序进行 RMI远程调用已经成功了。

1.3 RMI接口和类简介

负责指定 rmi系统远程对象行为的接口和类在 java.rmi包中定义的,接下来我们了解一下几个核心接口和类:

1、 Java.rmi.Remote接口

在 rmi中,远程接口声明了可从远程 java虚拟机中调用的方法集,远程接口必须满足下列条件:

Ø远程接口必须至少直接或间接的扩展 java.rmi.Remote接口。

Ø远程接口中的方法申明必须满足:远程方法申明在其 throws子句中除了要包含与应用程序有关的异常之外,还必须包括 RemoteException异常(或她的父类);在远程方法申明中,作为参数或返回值申明的远程对象必须申明为远程接口,而非该接口的实现类。

2、 Java.rmi.RemoteException类

RemoteException类是在远程方法调用期间由 RMI运行所抛出的异常,在使用了 rmi系统的应用程序中,远程接口中申明的远程方法在其 throws子句中必须指定 RemoteException或者其超类。

Ø当远程方法调用由于某种原因失败时,将抛出 RemoteException异常。

Ø RemoteException类是一个已检验的异常,而不是 RuntimeException。

3、 Java.rmi.server.RemoteObject类

Ø RMI服务器函数由 RemoteObject类及其子类 RemoteServer,UnicastRemoteObject和 Activatabble提供。

Ø RemoteObject为远程对象敏感的 Object方法,hashCode,equals和 toString方法提供实现。

Ø创建远程对象并将其导出,所需的方法由类 UnicastRemoteObject和 Activatable提供,子类可以识别远程方法。

Ø UnicastRemoteObject定义了单个调用的远程对象,其引用只有在服务器进程运行时才有效。

Ø类 Activatable是抽象类,它定义的 activatable远程对象在其远程方法被调用时开始执行,并在必要时自己关闭。

4、 Java.rmi.registry.LocateRegistry类

LocateRegistry类用于获得对特定主机的引导远程对象注册服务程序的引用(创建 stub),或者创建能在特定端口接受调用的远程对象注册服务程序,注册服务程序实现将远程对象名与远程对象引用关联的简单命名语法,服务器重新启动不会记住这些名字和远程对象之间的绑定。

LocateRegistry类中的方法:

public static Registry getRegistry() throws RemoteException

Public static Registry getRegistry(int port) throws RemoteException

Public static Registry getRegistry(String host) throws RemoteException

Public static Registry getRegistry(String host, int port) throws RemoteException

Public static Registry getRegistry(String host, int port,RMIClientSocketFactory csf) throws RemoteException

Public static Registry createRegistry(int port)throws RemoteException

Public static Registry createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException

5、 Java.rmi.Naming类

Naming类提供了存储和获得远程对象注册服务程序中的远程对象进行引用的方法

Ø Naming类中的方法以 url的形式作为其中的一个参数,//host:port/name

Ø当远程对象使用 rmi注册服务程序在本地主机上进行过注册后,远程主机上的调用程序就可以按名称查询远程对象,获得其引用,然后在对象上调用远程方法。

Public static Remote lookup(String name) throws NotBoundException, MalformedURException, RemoteException

Public static void bind(String name, Remote obj) throws AlreadyBoundException, MalforedURException, RemoteException

Public static void unbind(String name) throws RemoteException, NotBoundException,MalformedURLException

Public static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException

6、 Java.rmi.server.UnicastRemoteObject类

类 UnicastRemoteObject创建并导出远程对象,该类实现的远程服务具有以下特点:

Ø将这种对象的引用至多仅在创建该远程对象的进程生命周期内有效。

Ø通过 TCP传输与远程对象通信调用,参数和结果使用流协议在客户端和服务器之间进行通信。

7、 Stub和 skeleton

在远程对象的通信过程中, rmi使用标准机制: stub和 skeleton

图 14.5 Stub和 Skeleton

Ø Stub的功能

初始化与包含远程对象的远程机器的连接。

对远程机器参数进行编组(写入并传输)。

等待方法调用结果。

读取返回值或返回的异常。

将值返回给调用程序。

Ø Skeleton的功能

在远程机器中,每个远程对象都可以有相应的 skeleton, skeleton负责将调用分配给实际的远程对象实现,他的主要功能如下:

读取远程方法的参数。

调用实际远程对象实现上的方法。

将结果(返回值或异常)编组(写入并传输)给调用程序。

1.4 JNDI基本概念

JNDI诞生的理由似乎很简单。随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过 Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。 RMI技术, RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。 JNDI技术就应运而生。 JNDI技术产生后,就可方便的查找远程或是本地对象。

1、 JNDI是什么?

JNDI(The Java Naming and Directory Interface, Java命名和目录接口)是一组在 Java应用中访问命名和目录服务的 API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于 JNDI提供的接口,能够通过名字定位用户、机器、网络、对象服务等。

Ø命名服务:就像 DNS一样,通过命名服务器提供服务,大部分的 J2EE服务器都含有命名服务器。

Ø目录服务:一种简化的 RDBMS系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软 ACTIVE DIRECTORY等。

2、 JNDI的好处:

Ø包含大量命名和目录服务,可以使用相同 API调用访问任何命名或目录服务。

Ø可以同时连接多个命名和目录服务。

Ø允许把名称同 JAVA对象或资源关联起来,不必知道对象或资源的物理 ID。

Ø使用通用接口访问不同种类的目录服务

Ø使得开发人员能够集中使用和实现一种类型的命名或目录服务客户 API上。

1.5 JNDI应用程序结构

JNDI的结构由一个 API和一个 SPI组成, Java应用程序实用 JNDI API访问各种各样的命名和目录服务。

图 14.6 JNDI应用程序结构

1、 JNDI上下文

前面提到命名服务是将名称与对象相关联。这种关联被称为绑定。一组这样的绑定被称为上下文, Jndi上下文可以用来查找,捆绑/解除捆绑,创建或者破坏绑定名称操作在 JNDI中,上下文是使用 javax.naming.Context接口来表示的,而这个接口也正是与命名服务进行交互的主要接口。

Context接口中的每个命名方法都有两种重载的形式:

lookup(String name):接受一个字符串名称参数,查找绑定远程对象。

lookup(javax.naming.Name):接受一个结构化的名称,查找绑定远程对象。

2、初始化上下文

InitialContext是一个实现了 Context接口的类。使用这个类作为您到命名服务的入口点。创建一个 InitialContext对象构造器需要采用一组属性,形式为 java.util.Hashtable或其子类之一,比如:

代码范例 5

Properties props= new Properties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url","localhost:1099");

InitialContext= new InitialContext(props);

要通过 JNDI进行资源访问,我们必须设置初始化上下文的参数,主要是设置 JNDI驱动的类名(java.naming.factory.initial)和提供命名服务的 URL(java.naming.provider.url)。因为 Jndi的实现产品有很多。所以 java.naming.factory.initial的值因提供 JNDI服务器的不同而不同, java.naming.provider.url的值包括提供命名服务的主机地址和端口号。

下表列出了用于所支持的服务提供程序的工厂类。

表: Context.INITIAL_CONTEXT_FACTORY的值

名称

服务提供程序工厂

文件系统

com.sun.jndi.fscontext.RefFSContextFactory

LDAP

com.sun.jndi.ldap.LdapCtxFactory

RMI

com.sun.jndi.rmi.registry. RegistryContextFactory

CORBA

com.sun.jndi.cosnaming.CNCtxFactory

DNS

com.sun.jndi.dns.DnsContextFactory

1.6 RMI与 JNDI集成

通过上面对 JNDI的了解我们可以利用 JNDI来管理 RMI远程对象的注册服务,我们将代码范例 3进行如下改写:

代码范例 6

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.registry.*;

import javax.naming.*;

public class RmiSampleServerJndi{

public static void main(String[] args) throws Exception{

LocateRegistry.createRegistry(8808);

RmiSampleImpl server=new RmiSampleImpl(); System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");

System.setProperty(Context.PROVIDER_URL,"rmi://localhost:8808");

InitialContext ctx=new InitialContext();

ctx.bind("java:comp/env/SampleDemo",server);

ctx.close();

}

}

启动服务端程序如图所示:

图 14.7 JNDI服务程序启动

表示服务端程序已经将远程对象在 JNDI是进行了注册,等待客户端进行调用。

接下来我们改写客户端程序采用 JNDI方式来调用远程对象

代码范例 7

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.server.*;

import javax.naming.*;

public class RmiSampleClientJndi{

public static void main(String[] args) throws Exception

{

System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");

System.setProperty(Context.PROVIDER_URL,"rmi://localhost:8808");

InitialContext ctx=new InitialContext();

String url="java:comp/env/SampleDemo";

RmiSample RmiObject=(RmiSample)ctx.lookup(url);

System.out.println(" 1+ 2="+ RmiObject.sum(1,2));

}

}

运行客户端程序如图所示:

图 14.8客户端 JNDI程序运行结果

表示客户端已经通过 JNDI调用服务端远程对象成功。

1.7学习总结

Ø RMI运行在一个 java虚拟机上的对象调用运行在另一个 java虚拟机上的对象的方法.。 RMI的用途就是为 java程序之间的远程通信提供服务。

Ø RMI的编程思想

n对客户端:需要一些特定的代码来引用远程对象,一旦客户端的代码拥有对远程对象的引用,对远程对象上的调用与对本地对象方法的调用除了速度以外没什么区别。

n对服务端:必须定义类并实例化类的远程对象,服务器的代码必须能够登记对象并向客户端导出它们的方法,这样,这些方法就能够被远程调用了。

n客户端和服务端的代码都必须定义或能够访问一个接口,该接口中申明了可以远程调用的方法,并且两者还可以设置一个安全管理器。

n当调用远程对象上的方法时,客户端可以将对象作为参数来传递,并且,远程对象上的方法可以返回对象,这些是通过序列化来实现的。

Ø JNDI为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。

Ø JNDI的结构由一个 API和一个 SPI组成, Java应用程序实用 JNDI API访问各种各样的命名和目录服务。

java分布式开发涉及到哪些技术(分布式java应用)

分布式软件系统分布式软件系统(DistributedSoftwareSystems)

是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。

分布式操作系统负责管理分布式处理系统资源和控制分布式程序运行。它和集中式操作系统的区别在于资源管理、进程通信和系统结构等方面。

分布式程序设计语言用于编写运行于分布式计算机系统上的分布式程序。一个分布式程序由若干个可以独立执行的程序模块组成,它们分布于一个分布式处理系统的多台计算机上被同时执行。它与集中式的程序设计语言相比有三个特点:分布性、通信性和稳健性。

分布式文件系统具有执行远程文件存取的能力,并以透明方式对分布在网络上的文件进行管理和存取。

分布式数据库系统由分布于多个计算机结点上的若干个数据库系统组成,它提供有效的存取手段来操纵这些结点上的子数据库。分布式数据库在使用上可视为一个完整的数据库,而实际上它是分布在地理分散的各个结点上。当然,分布在各个结点上的子数据库在逻辑上是相关的。

分布式数据库系统是由若干个站集合而成。这些站又称为节点,它们在通讯网络中联接在一起,每个节点都是一个独立的数据库系统,它们都拥有各自的数据库、中央处理机、终端,以及各自的局部数据库管理系统。因此分布式数据库系统可以看作是一系列集中式数据库系统的联合。它们在逻辑上属于同一系统,但在物理结构上是分布式的。

分布式数据库系统已经成为信息处理学科的重要领域,正在迅速发展之中,原因基于以下几点:

1、它可以解决组织机构分散而数据需要相互联系的问题。比如银行系统,总行与各分行处于不同的城市或城市中的各个地区,在业务上它们需要处理各自的数据,也需要彼此之间的交换和处理,这就需要分布式的系统。

2、如果一个组织机构需要增加新的相对自主的组织单位来扩充机构,则分布式数据库系统可以在对当前机构影响最小的情况下进行扩充。

3、均衡负载的需要。数据的分解采用使局部应用达到最大,这使得各处理机之间的相互干扰降到最低。负载在各处理机之间分担,可以避免临界瓶颈。

4、当现有机构中已存在几个数据库系统,而且实现全局应用的必要性增加时,就可以由这些数据库自下而上构成分布式数据库系统。

5、相等规模的分布式数据库系统在出现故障的几率上不会比集中式数据库系统低,但由于其故障的影响仅限于局部数据应用,因此就整个系统来讲它的可靠性是比较高的。

特点

1、在分布式数据库系统里不强调集中控制概念,它具有一个以全局数据库管理员为基础的分层控制结构,但是每个局部数据库管理员都具有高度的自主权。

2、在分布式数据库系统中数据独立性概念也同样重要,然而增加了一个新的概念,就是分布式透明性。所谓分布式透明性就是在编写程序时好像数据没有被分布一样,因此把数据进行转移不会影响程序的正确性。但程序的执行速度会有所降低。

3、集中式数据库系统不同,数据冗余在分布式系统中被看作是所需要的特性,其原因在于:首先,如果在需要的节点复制数据,则可以提高局部的应用性。其次,当某节点发生故障时,可以操作其它节点上的复制数据,因此这可以增加系统的有效性。当然,在分布式系统中对最佳冗余度的评价是很复杂的。

分布式系统的类型,大致可以归为三类:

1、分布式数据,但只有一个总数据库,没有局部数据库。

2、分层式处理,每一层都有自己的数据库。

3、充分分散的分布式网络,没有中央控制部分,各节点之间的联接方式又可以有多种,如松散的联接,紧密的联接,动态的联接,广播通知式联接等。

---------------------

什么是分布式智能?

NILabVIEW8的分布式智能结合了相关的技术和工具,解决了分布式系统开发会碰到的一些挑战。更重要的是,NILabVIEW8的分布式智能提供的解决方案不仅令这些挑战迎刃而解,且易于实施。LabVIEW8的分布式智能具体包括:

可对分布式系统中的所有结点编程——包括主机和终端。尤为可贵的是,您可以利用LabVIEW图形化编程方式,对大量不同类型的对象进行编程,如桌面处理器、实时系统、FPGA、PDA、嵌入式微处理器和DSP。

导航所有系统结点的查看系统——LabVIEWProjectExplorer。您可使用ProjectExplorer查看、编辑、运行和调试运行于任何对象上的结点。

经简化的数据共享编程界面——共享变量。使用共享变量,您可轻松地在系统间(甚至实时系统间)传输数据且不影响性能。无通信循环,无RTFIFO,无需低层次TCP函数。您可以利用简单的对话完成共享变量的配置,从而将数据在各系统间传输或将数据连接到不同的数据源。您还可添加记录、警报、事件等数据服务——一切仅需简单的对话即可完成。

实现了远程设备及系统内部或设备及系统之间的同步操作——定时和同步始终是定义高性能测量和控制系统的关键问题。利用基于NI技术的系统,探索设备内部并编写其内部运行机制,从而取得比传统仪器或PLC方式下更为灵活的解决方案。

--------------------

在分布式计算机操作系统支持下,互连的计算机可以互相协调工作,共同完成一项任务。

也可以这么解释:

一种计算机硬件的配置方式和相应的功能配置方式。它是一种多处理器的计算机系统,各处理器通过互连网络构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻辑结构。

java分布式架构有哪些技术

既然是分布式系统,系统间通信的技术就不可避免的要掌握。

首先,我们必须掌握一些基本知识,例如网络通信协议(例如TCP/ UDP等),网络IO(Blocking-IO,NonBlocking-IO,Asyn-IO),网卡(多队列等)。了解有关连接重用,序列化/反序列化,RPC,负载平衡等的信息。

在学习了这些基本知识之后,您基本上可以在分布式系统中编写一个简单的通信模块,但这实际上还远远不够。现在,您已经进入了分布式字段,您已经对规模有很多要求。这意味着需要一种通信程序,该程序可以支持大量连接,高并发性和低资源消耗。

大量的连接通常会有两种方式:

大量client连一个server

当前在NonBlocking-IO非常成熟的情况下,支持大量客户端的服务器并不难编写,但是在大规模且通常是长连接的情况下,有一点需要特别注意,即服务器挂起时不可能所有客户端都在某个时间点启动重新连接。那基本上是一场灾难。我见过一些没有经验的类似案例。客户端规模扩大后,服务器基本上会在重新启动后立即刷新。大量传入连接中断(当然,服务器的积压队列首先应设置为稍大一些)。可以使用的通常方法是在客户端重新连接之前睡眠一段随机的时间。另外,重连间隔采用避让算法。

一个client连大量的server

有些场景也会出现需要连大量server的现象,在这种情况下,同样要注意的也是不要并发同时去建所有的连接,而是在能力范围内分批去建。

除了建连接外,另外还要注意的地方是并发发送请求也同样,一定要做好限流,否则很容易会因为一些点慢导致内存爆掉。

这些问题在技术风险上得考虑进去,并在设计和代码实现上体现,否则一旦随着规模上去了,问题一时半会还真不太好解。

高并发这个点需要掌握CAS、常见的lock-free算法、读写锁、线程相关知识(例如线程交互、线程池)等,通信层面的高并发在NonBlocking-IO的情况下,最重要的是要注意在整体设计和代码实现上尽量减少对io线程池的时间占用。

低资源消耗这点的话NonBlocking-IO本身基本已经做到。

伸缩性

分布式系统基本上意味着规模不小。对于此类系统,在设计时必须考虑可伸缩性。在体系结构图上绘制的任何点,如果请求量或数据量继续增加,该怎么办?通过添加机器来解决。当然,此过程不需要考虑无限的情况。如果您有经验的建筑师,从相对较小的规模到非常大型的范围,那么优势显然并不小,而且它们也将越来越稀缺。。

横向可扩展性(Scale Out)是指通过增加服务器数量来提高群集的整体性能。垂直可伸缩性(Scale Up)是指提高每台服务器的性能以提高集群的整体性能。纵向可扩展性的上限非常明显,而分布式系统则强调水平可伸缩性。

分布式系统应用服务最好做成无状态的

应用服务的状态是指运行时程序因为处理服务请求而存在内存的数据。分布式应用服务最好是设计成无状态。因为如果应用程序是有状态的,那么一旦服务器宕机就会使得应用服务程序受影响而挂掉,那存在内存的数据也就丢失了,这显然不是高可靠的服务。把应用服务设计成无状态的,让程序把需要保存的数据都保存在专门的存储上(eg.数据库),这样应用服务程序可以任意重启而不丢失数据,方便分布式系统在服务器宕机后恢复应用服务。

伸缩性的问题围绕着以下两种场景在解决:

无状态场景

对于无状态场景,要实现随量增长而加机器支撑会比较简单,这种情况下只用解决节点发现的问题,通常只要基于负载均衡就可以搞定,硬件或软件方式都有;

无状态场景通常会把很多状态放在db,当量到一定阶段后会需要引入服务化,去缓解对db连接数太多的情况。

有状态场景

所谓状态其实就是数据,通常采用Sharding来实现伸缩性,Sharding有多种的实现方式,常见的有这么一些:

2.1规则Sharding

基于一定规则把状态数据进行Sharding,例如分库分表很多时候采用的就是这样的,这种方式支持了伸缩性,但通常也带来了很复杂的管理、状态数据搬迁,甚至业务功能很难实现的问题,例如全局join,跨表事务等。

2.2一致性Hash

一致性Hash方案会使得加机器代价更低一些,另外就是压力可以更为均衡,例如分布式cache经常采用,和规则Sharding带来的问题基本一样。

2.3 Auto Sharding

Auto Sharding的好处是基本上不用管数据搬迁,而且随着量上涨加机器就OK,但通常Auto Sharding的情况下对如何使用会有比较高的要求,而这个通常也就会造成一些限制,这种方案例如HBase。

2.4 Copy

Copy这种常见于读远多于写的情况,实现起来又会有最终一致的方案和全局一致的方案,最终一致的多数可通过消息机制等,全局一致的例如zookeeper/etcd之类的,既要全局一致又要做到很高的写支撑能力就很难实现了。

即使发展到今天,Sharding方式下的伸缩性问题仍然是很大的挑战,非常不好做。

上面所写的基本都还只是解决的方向,到细节点基本就很容易判断是一个解决过多大规模场景问题的架构师,:)

稳定性

作为分布式系统,必须要考虑清楚整个系统中任何一个点挂掉应该怎么处理(到了一定机器规模,每天挂掉一些机器很正常),同样主要还是分成了无状态和有状态:

无状态场景

对于无状态场景,通常好办,只用节点发现的机制上具备心跳等检测机制就OK,经验上来说无非就是纯粹靠4层的检测对业务不太够,通常得做成7层的,当然,做成7层的就得处理好规模大了后的问题。

有状态场景

对于有状态场景,就比较麻烦了,对数据一致性要求不高的还OK,主备类型的方案基本也可以用,当然,主备方案要做的很好也非常不容易,有各种各样的方案,对于主备方案又觉得不太爽的情况下,例如HBase这样的,就意味着挂掉一台,另外一台接管的话是需要一定时间的,这个对可用性还是有一定影响的;

全局一致类型的场景中,如果一台挂了,就通常意味着得有选举机制来决定其他机器哪台成为主,常见的例如基于paxos的实现。

可维护性

维护性是很容易被遗漏的部分,但对分布式系统来说其实是很重要的部分,例如整个系统环境应该怎么搭建,部署,配套的维护工具、监控点、报警点、问题定位、问题处理策略等等。

OK,关于java分布式用什么技术和java分布式开发涉及到哪些技术(分布式java应用)的内容到此结束了,希望对大家有所帮助。

java自己可以做什么工作?Java程序员可以从事哪些工作 陈赫结婚了(陈赫结婚了合作的第一个小品是哪年)