分布式系统架构之远程调用

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();
		}
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值