6.1单体系统架构
项目的开发,只需要创建一个工程,将所有功能放入一个项目进行开发,管理,变异,测试,打包。
以前项目都是单体架构 :
问题:项目的后期升级维护
项目的高并发访问
6.2分布式系统架构
分布式计算:一个完整的系统的构成,是由n个服务构成(n其他的系统构成),将一个复杂的系统拆分为n个系统开发,降低每个系统的复杂度,然后将拆分开的每个系统集成到一起形成一个完整的系统。
在单体架构中,一个系统是由n个模块构成,一个模块是由n个功能构成,一个功能是由那个类(class)资源构成,一个类n个方法构成。
在分布式架构中一个系统是由n个子系统构成,由n个服务构成,更高度的抽象。
美团的支付功能:调用微信支付功能(服务:腾讯的系统)。
美团的地图导航:调用百度地图的功能(服务:百度的一个系统)
N个子系统可以独立开发,编译,测试,打包,部署,每个系统中只需要完成整个生态系统中的一部分功能。
解决相互的后期升级维护问题,高并发的访问问题。
6.3RPC实现系统之间的访问
RPC(Remote Procedure Call)—远程过程调用,RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
6.4RP实现技术
能够实现远程调用的技术:
RMI
WEBSERVICE
Httpclient
Dubbo
Springcloud
7使用RMI实现远程调用
7.1RMI介绍
RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
Servce/provider : 提供远程服务(功能)
Client/Consumer: 调用或者消费远程服务
7.2会员系统访问订单系统
使用会员系统,访问订单系统的功能。
7.2.1开发Provider(orderSys)
7.2.1.1创建Orders实体类
package com.bjsxt.pojo;
import java.io.Serializable;
/****
* 定义订单实体类,描述订单系统
* @author 毕丛明
*
*/
public class Orders implements Serializable{
private Integer id;
private String remark;
private String odate;
private Double total;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getOdate() {
return odate;
}
public void setOdate(String odate) {
this.odate = odate;
}
public Double getTotal() {
return total;
}
public void setTotal(Double total) {
this.total = total;
}
}
7.2.1.2创建OrdersService接口
package com.bjsxt.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import com.bjsxt.pojo.Orders;
/***
*
* @author 毕丛明
* 必须继承:Remote,标识接口
* 只有继承Remote接口,OrdersService接口中的方法才可以被远程调用
*/
public interface OrdersService extends Remote{
/***
* 查询某个订单的详细信息
*/
public Orders loadOrdersByIdService(Integer id) throws RemoteException;
/****
* 查询某个会员所有订单
*/
public List<Orders> loadOrdersListService(Integer vid) throws RemoteException;
}
7.2.1.3创建OrdersServiceImpl实现类
package com.bjsxt.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import com.bjsxt.pojo.Orders;
import com.bjsxt.service.OrdersService;
/***
* 暴露远程服务对应的接口的实现类继承 UnicastRemoteObject
* @author 毕丛明
*
*/
public class OrdersServiceImpl extends UnicastRemoteObject implements OrdersService {
/**
*
*/
private static final long serialVersionUID = 1L;
public OrdersServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public Orders loadOrdersByIdService(Integer id) throws RemoteException{
// TODO Auto-generated method stub
Orders orders=new Orders();
orders.setId(id);
orders.setRemark("美女配送.....");
orders.setOdate("2018-10-10");
orders.setTotal(10000.0);
return orders;
}
@Override
public List<Orders> loadOrdersListService(Integer vid) throws RemoteException{
// TODO Auto-generated method stub
List<Orders> results=new ArrayList<Orders>();
Orders orders=new Orders();
orders.setId(110);
orders.setRemark("美女配送.....");
orders.setOdate("2018-10-10");
orders.setTotal(10000.0);
Orders orders2=new Orders();
orders2.setId(120);
orders2.setRemark("帅哥配送.....");
orders2.setOdate("2018-11-10");
orders2.setTotal(20000.0);
results.add(orders);
results.add(orders2);
return results;
}
}
7.2.1.4发布服务提供者
package com.bjsxt.app;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.bjsxt.service.OrdersService;
import com.bjsxt.service.impl.OrdersServiceImpl;
public class OrdersProviderApp {
/***
* 发布订单服务
*/
public static void main(String[] args) {
/****
* http://localhost:8080
*/
try{
int port=9999;
/**指定远程服务需要访问的端口**/
LocateRegistry.createRegistry(port);
//定义访问远程的服务URL
String name="rmi://localhost:"+port+"/rmi";
//创建提供远程服务的对象
OrdersService ordersService=new OrdersServiceImpl();
//完成服务发布,给一个提供服务的对象,绑定一个远程访问URL
Naming.bind(name, ordersService);
System.out.println("===============完成服务发布===========");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
7.2.2开发Consumer(vipSys)
7.2.2.1拷贝Orders实体类
7.2.2.2拷贝OrdersService接口
7.2.2.3完成服务消费
package com.bjsxt.app;
import java.rmi.Naming;
import java.util.List;
import com.bjsxt.pojo.Orders;
import com.bjsxt.service.OrdersService;
public class VipConsumerApp {
public static void main(String[] args) {
/***
* 完成远程访服务的调用
*/
try{
//定义访问远程的服务URL
String name="rmi://localhost:9999/rmi";
//获得远程服务代理对象
OrdersService service=(OrdersService) Naming.lookup(name);
System.out.println(service.getClass().getName());
//调用远程服务
/*Orders o = service.loadOrdersByIdService(123456);
System.out.println(o.getId()+"\t"+o.getRemark()+"\t"+o.getTotal()+"\t"+o.getOdate());
*/
List<Orders> results = service.loadOrdersListService(12);
for(Orders o:results){
System.out.println(o.getId()+"\t"+o.getRemark()+"\t"+o.getTotal()+"\t"+o.getOdate());
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}