最近一段时间对分布式很迷惑,安静下来想想,为什么程序可以再不同的机器上,无非他们之间是通过网络来通信的,那他们之间的交流主要是什么内容呢,我想无非是运行业务方法需要的一些参数罢了,而对于远程的机器怎么知道另一台机器的业务方法呢?这就出现了面向接口的编程。(以下将从RMI编程到Socket实现底层讲起)
下面就对于常用的RMI的分布式的编程步骤分析一下:
1:由于不同机器之间的通信交流,他们有一个共同的出发点就是针对处理业务而存在,而又不暴露业务方法,所以,业务方法的借口就这样被定义出来了。如定义一个RmiMonitorService.java,这里必须继承Remote类
package com.test.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 定义业务方法接口
* @author wkf45150/wujianjun
* @version [v1.0, 2011-6-21]
* @see [相关类/方法]
* @since SmartCare1.1
*/
public interface RmiMonitorService extends Remote
{
public String interactive() throws RemoteException;//必须抛出异常
}
2:编写业务层的实现类,这里必须继承UnicastRemoteObject类
如RmiMonitorServiceImpl.java
package com.test.serviceImpl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.test.service.RmiMonitorService;
/**
* 实现类
* @author wkf45150/wujianjun
* @version [v1.0, 2011-6-21]
* @see [相关类/方法]
* @since SmartCare1.1
*/
public class RmiMonitorServiceImpl extends UnicastRemoteObject implements RmiMonitorService
{
private static final long serialVersionUID = -3771656108378649574L;
static int num = 0;
/**
* 必须定义构造方法,因为要抛出RemoteException异常
*/
public RmiMonitorServiceImpl() throws RemoteException
{
super();
}
@Override
public String interactive() throws RemoteException
{
//这里面就是一些实现业务的具体方法,以下面得例子测试
System.out.println("我被人调用了第"+num+"次");
num++;
return "hello RMI,我是从服务器端返回来的";
}
}
3:实现服务器端的编程,如RmiServer.java
package com.rmi.service;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.test.service.RmiMonitorService;
import com.test.serviceImpl.RmiMonitorServiceImpl;
/**
* 服务器端
* @author wkf45150/wujianjun
* @version [v1.0, 2011-6-21]
* @see [相关类/方法]
* @since SmartCare1.1
*/
public class RmiServer
{
public static void main(String[] args)
{
int port = 8080;
String ip = "localhost";
try
{
//注册端口
LocateRegistry.createRegistry(port);
//调用业务方法
RmiMonitorService comm = new RmiMonitorServiceImpl();
//将业务方法绑定到固定的IP和端口上
Naming.bind("//" + ip + ":" + port + "/comm", comm);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
4:客户端编程(由于客户端在调用服务器端的时候对业务方法是不知情的,所以客户端和服务器端需要提供相同的接口),在这里也需要定义相同的接口,否者编译通不过,如果在同一台机器,可以共用一个接口。代码如:
package com.rmi.service;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import com.test.service.RmiMonitorService;
/**
* 客户端
* @author wkf45150/wujianjun
* @version [v1.0, 2011-6-21]
* @see [相关类/方法]
* @since SmartCare1.1
*/
public class MonitorClient
{
public static void main(String[] args)
{
int port = 8080;
//服务器端IP
String ip = "10.110.189.46";
try
{
//對綁定业务方法的IP进行调用,返回业务方法的代理,我们可以理解为建立连接
RmiMonitorService monitorService = (RmiMonitorService) Naming.lookup("rmi://" + ip + ":" + port + "/comm");
//这一步可以形象理解为服务器传值,并取回服务器返回的值
monitorService.interactive();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (RemoteException e)
{
e.printStackTrace();
}
catch (NotBoundException e)
{
e.printStackTrace();
}
}
}
在这里关于Rmi进行分布式编程的流程就说完了,以上例子经过测试时可以跑通的。以上的例子,我觉得就是一个利用接口和网络实现的代理模式,嘿嘿。。。。
======================================================================
以下从socket和流的方面分析一下分布式开发(其实模式和上面的RMI编程一样,知识所举的例子有所不一样):
1:首先定义接口Person.java
public interface Person {
public int getAge(); throws Throwable;
public String getName(); throws Throwable;
}
2:实现类(这里有两个)
A:PersonServer.java-------处理业务方法
public class PersonServer implements Person {
int age;
String name;
public PersonServer(String name, int age); {
this.age = age;
this.name = name;
}
public int getAge(); {
return age;
}
public String getName(); {
return name;
}
}
3:客户端程序,这里也实现了Person接口,通过接口调用业务方法(对客户端的调用就像在远程上对本地业务的调用一样,这一点很重要)如:PersonStub.java
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
public class Person_Stub implements Person {
Socket socket;
public Person_Stub(); throws Throwable {
// connect to skeleton
socket = new Socket("computer_name", 9000);;
}
public int getAge(); throws Throwable {
// pass method name to skeleton
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream(););;
outStream.writeObject("age");;
outStream.flush();;
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream(););;
return inStream.readInt();;
}
public String getName(); throws Throwable {
// pass method name to skeleton
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream(););;
outStream.writeObject("name");;
outStream.flush();;
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream(););;
return (String);inStream.readObject();;
}
//客户端的调用
public static void main(String [] args); {
//注意这里的调用
Person person = new Person_Stub();;
int age = person.getAge();;
String name = person.getName();;
System.out.println(name + " is " + age + " years old");;
} catch(Throwable t); {
t.printStackTrace();;
}
}
}
4:服务器端的编程(这里主要是通过和客户端的通信来调用业务方法)
如:Person_Skeleton.java
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.ServerSocket;
public class Person_Skeleton extends Thread {
PersonServer myServer;
public Person_Skeleton(PersonServer server); {
// get reference of object server
this.myServer = server;
}
public void run(); {
try {
// new socket at port 9000
ServerSocket serverSocket = new ServerSocket(9000);;
// accept stub's request
Socket socket = serverSocket.accept();;
while (socket != null); {
// get stub's request
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream(););;
String method = (String);inStream.readObject();;
// check method name
if (method.equals("age");); {
// execute object server's business method
int age = myServer.getAge();;
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream(););;
// return result to stub
outStream.writeInt(age);;
outStream.flush();;
}
if(method.equals("name");); {
// execute object server's business method
String name = myServer.getName();;
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream(););;
// return result to stub
outStream.writeObject(name);;
outStream.flush();;
}
}
} catch(Throwable t); {
t.printStackTrace();;
System.exit(0);;
}
}
public static void main(String args []); {
// new object server
PersonServer person = new PersonServer("Richard", 34);;
Person_Skeleton skel = new Person_Skeleton(person);;
skel.start();;
}
}
以上就是基于socket的远程调用,由于这上面不能画图,我在这里就描述一下,贯穿上面两个例子的思想就是:客户端对业务方法的调用时通过实现业务共同的接口,并把实际的操作权给我远程的服务器端。即:业务接口--->客户端--->远程服务器端--->业务实现类--->接口
分享到:
相关推荐
### Pb分布式开发简明教程知识点概述 #### 一、分布式开发背景与意义 - **分布式开发的目的**:解决传统客户端/服务器(C/S)架构中存在的问题,如客户端直接连接数据库导致的安全性和性能瓶颈、程序更新困难、...
分布式开发在IT行业中是一项至关重要的技术,特别是在大型系统和高并发场景下,它能有效提升系统的可扩展性和稳定性。C#作为微软开发的面向对象的编程语言,也提供了丰富的工具和框架来支持分布式开发。本资源包含...
Hadoop是一个由Apache基金会开发的开源分布式系统基础架构。它的核心由两部分组成:分布式文件系统(HDFS)和MapReduce引擎。HDFS负责提供高效稳定的分布式存储功能,特别适合存储大数据量、生命周期长、更新较少的...
分布式开发系统架构是一种现代软件开发中的重要模式,它旨在通过将应用程序的不同部分分布在多个独立的节点上,以提高系统的可扩展性、容错性和性能。在这个特定的案例中,我们看到的是一个基于Spring、SpringMVC和...
大数据时代的分布式智能取证分析技术是一门新兴的综合计算机科学领域,它涉及到信息存储、网络技术、数据挖掘等多个专业方向。在此背景下,随着电子数据的激增,取证过程变得更为复杂,传统的取证技术面临着前所未有...
.NET分布式开发框架是一种用于构建可扩展、高可用性和高性能应用程序的技术。它允许开发者将应用程序分解为多个组件,这些组件可以在不同的计算机上独立运行并互相协作,以实现分布式处理。在这个项目实战中,我们...
以下是一些关于分布式应用技术未来发展趋势的分析: #### 1. ObjectWeb 的兴起 **ObjectWeb** 是指基于对象的 Web 应用程序,它结合了 Hypertext Web 和 Interactive Web 的优点,强调“服务”而非传统的页面浏览...
Java API覆盖了数据源接入、转换操作、窗口定义、状态管理以及结果输出等各个环节,为开发分布式数据分析系统提供了坚实的基础。此外,由于Java的广泛使用和跨平台特性,基于Java的Flink应用具有高度的可移植性和可...
通过增加与异地分布式开发相关的成本驱动因子,例如地理位置分散度、通信效率、跨区域协同工作流程的成熟度等,模型能更准确地反映分布式敏捷开发项目的特性。 #### 改进的COCOMOII模型 基于对成本驱动因子的分析...
分布式实时日志分析与入侵检测系统+源码+开发文档+运行教程+结果展示,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 分布式实时日志分析与入侵检测系统+源码+...
本文围绕异地分布式敏捷开发团队的协作问题,通过合作博弈理论,提出了一个适用于异地分布式团队的适应性协作框架,并对该框架进行详细分析。 合作博弈理论是一种研究具有共同目标的参与者之间的互动关系的理论,它...
基于Flume的分布式日志采集分析系统设计与实现 Flume是一种分布式日志采集系统,可以实时地采集和处理大量日志数据。该系统基于Flume、Elasticsearch和Kibana等技术手段,能够对海量日志数据进行实时采集、处理和...
#资源达人分享计划#
分布式光伏开发模式分析.pdf
本文研究了基于ICE中间件的分布式应用开发,通过介绍中间件的特点,分析了ICE中间件的架构及主要构成,以地面测试人员获取远端被测设备的系统时间为例,介绍了一种基于ICE中间件的分布式应用程序开发过程与方法,并...
随着信息技术的不断进步和物联网的广泛应用,智能系统与分布式边缘数据分析已经成为业界研究的热点问题。分布式边缘数据分析,是指利用分布式系统中各节点的计算资源,在数据源或接近数据源的地方进行数据处理和计算...
分布式存储架构的性能分析是一个广泛的研究领域,尤其是随着云计算和大数据时代的来临,对于大规模数据处理的需求激增,传统的单机存储和处理方式已经无法满足现代互联网的需求。Hadoop作为一个代表性的开源云计算...
分布式调度系统选择分析,用亿图软件做的一个分布式调度系统的分析的脑图,包含,Time ,Spring 的@Scheduled,Quartz 分布式集群开源工具,基于Quartz自己开发 等几个分析