什么是分布式?
1. 任务分解
2. 节点通信
分布式和集群的关系?
电商平台: 用户、 商品、订单、 交易
分布式: 一个业务拆分成多个子系统,部署在不同的服务器上
集群: 同一个业务,部署在多个服务器上
什么是大型网站?
1. 访问量(tps、qps)
2. 数据量(存储数据量)
什么是RPC ?
RPC
(
Remote Procedure Call Protocol
)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC
协议假定某些传输协议的存在,如
TCP
或
UDP
,为通信程序之间携带信息数据。在
OSI
网络通信模型中,
RPC
跨越了传输层和应用层。
RPC
使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC
采用客户机
/
服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC协议其实是一个规范。Dubbo、Thrif、RMI、Webservice、Hessain
底层的都是通过socket通信
RMI
RMI(remote method invocation) , 可以认为是RPC的java版本
RMI使用的是JRMP(Java Remote Messageing Protocol), JRMP是专门为java定制的通信协议,所以踏实纯java的分布式解决方案
来一个简单的demo
定义一个接口public interface ISayHello extends Remote { //一定要继承Remote
public String sayHello(String name) throws RemoteException;
}
实现这个接口
public class SayHelloImpl extends UnicastRemoteObject implements ISayHello{ //继承UnicastRemoteObject
public SayHelloImpl() throws RemoteException {
}
public String sayHello(String name) throws RemoteException {
return "hello " + name;
}
}
把这个接口发布
public class HelloServer {
public static void main(String[] args){
try {
ISayHello hello =new SayHelloImpl();
LocateRegistry.createRegistry(8888); //注册服务
Naming.bind("rmi://localhost:8888/sayHello",hello);
System.out.println("server start ...");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
客户端调用
public class HelloClient {
public static void main(String[] args){
try {
ISayHello hello =(ISayHello)Naming.lookup("rmi://localhost:8888/sayHello"); //代理对象
System.out.println(hello);
System.out.println(hello.sayHello(" xinye"));
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
webService
协议层:tcp/ip
应用层: http协议
SOAP: http+xml
什么是webservice
webservice也可以叫xml web service webservice, 轻量级的独立的通讯技术
1. 基于web的服务:服务端提供的服务接口让客户端访问
2. 跨平台、跨语言的整合方案
为什么要使用webservice
跨语言调用的解决方案
什么时候要去使用webservice
电商平台,订单的物流状态。
.net实现的webservice服务接口
webservice中的一些概念
WSDL(web service definition language webservice 定义语言)
webservice服务需要通过wsdl文件来说明自己有什么服务可以对外调用。并且有哪些方法、方法里面有哪些参数
wsdl基于XML(可扩展标记语言)去定义的
1. 对应一个.wsdl的文件类型
2. 定义了webservice的服务器端和客户端应用进行交互的传递数据和响应数据格式和方式
3. 一个webservice对应唯一一个wsdl文档
SOAP(simple object access protocal简单对象访问协议)
http+xml
webservice通过http协议发送和接收请求时, 发送的内容(请求报文)和接收的内容(响应报文)都是采用xml格式进行封装
这些特定的HTTP消息头和XML内容格式就是SOAP协议
1. 一种简单、基于HTTP和XML的协议
2. soap消息:请求和响应消息
3. http+xml报文
SEI(webservice endpoint interface webservice的终端接口)
webservice服务端用来处理请求的接口,也就是发布出去的接口。
一个简单的demo
定义接口
@WebService //SE和SEI的实现类
public interface ISayHello {
@WebMethod //SEI中的方法
public String sayHello(String name);
}
实现接口
@WebService
public class SayHelloImpl implements ISayHello {
@Override
public String sayHello(String name) {
return "hello"+name;
}
}
发布服务
public class BootStrap {
public static void main(String []args){
Endpoint.publish("http://localhost:8889/hello",new SayHelloImpl());
System.out.println("publish success ...");
}
}
服务说明文档
创建一个新的工程作为客户端
在当前工程文件路径打开命令终端
在此文件夹窗口内空白区域右键单击(需要同时按住Shift),从菜单中选择"在此处打开命令行窗口"的项;
用jdk提供的命令wsimport 生成客户端代码
删除不需要的文件
public class ClientMian {
public static void main(String[] args){
SayHelloImplService service =new SayHelloImplService();
SayHelloImpl hello=service.getSayHelloImplPort();
System.out.println(hello.sayHello(" xinyeshuaiqi"));
}
}