Java—RPC:远程过程调用(1)
在我们学习RPC的过程中,首先我们先认识一下项目结构在发展中干的变化
一、项目结构变化
1、单体结构
单体结构又叫单一项目,在我们所认识的传统项目基本上都是单一项目,j可是在互联网逐步发展的过程中,逐渐的淘汰 。单一项目的架构过于简单,改一个东西都要重新的启动,重新编译。
在单体架构项目中,团队都是通过包进行区分每个模块。
优点:
部署简单、维护方便、开发成本低
缺点:
当项目规模过大,用户的访问量频率高,并发量大;数据量大,会大大的降低执行效率,甚至会出现宕机。
适用项目:
传统管理项目、小型互联网项目。
2.分布式架构
分布式架构就是将一个项目按照特定的情况和要求(或者按照模块和功能)拆分成若干个项目,把每一个项目分别的部署到不同的服务器中。
优点:
增了系统可用性、增加了重用性、增加了可扩展性、增加每个模块的负载能力。
缺点:
成本高、架构更加复杂、整体响应时间变长、吞吐量更大。吞吐量=请求数/秒
适用项目:
中、大型互联网项目。客户多、数据多、并高发、压力大,吞吐量高的项目。
通过以上的项目结构的分析,我们可以很清楚的看出每个项目结构的优缺点,在项目选择上可以更加清楚的做出选择。
通过分布式架构的简介我们可以看出的是:分布式架构中的各个模块是如何进行通信?
在现阶段中我们可以使用Http协议,也可以使用RPC协议通信,也可以使用其他的通信方式,在这里我们着重的介绍使用RPC协议,因为它比Http协议更适合内部通信。
二、RPC简介
2.1、RFC:互联网工程任务组(IEIF)发布的文件集,每一个文件集都有自己唯一的编号,其中我们所介绍的RPC就收集在rfc 1831中。 可以通过下面的网址查看:
https://datatracker.ietf.org/doc/rfc1831/
2.2、RPC:协议规定允许互联网中一台主机程序调用另一台主机程序,而程序员无需对这个交互过程进行编程。在RPC协议中强调的是:当X程序调用Y程序的 更能或方法时,X是不知道同时也不需要知道Y中方法具体的实现。
RPC是上层协议,但是它的底层是基于TCP协议,也可以基于HTTP协议。一般我们说RPC都是基于RPC的具体实现。
RPC框架一般都带有丰富事务服务治理功能,更加的适合企业内部接口调用。而HTTP协议更适合多平台之间相互调用。
在这里我们借用HttpClient来实现RPC协议。HttpClient起初是Apache Jakarta Common 的子项目。是用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持最新的HTTP版本。到2007年的时候已经成为了顶级项目。
下面我们就HttpClient来简单的实现RPC从协议:
首先第一步就是创建一个项目以便我们进行测试:
第二步导依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
第三步书写代码:
3.1:创建一个启动类:
package com.bjsxt.httpclicentserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootApplication:是一个组合注解,用于快捷配置启动类
*
* 此注解等同于@Configuration+@EnableAutoConfiguration+@ComponentScan的合集
*/
@SpringBootApplication
public class ServerApp {
public static void main(String[] args) {
SpringApplication.run(ServerApp.class,args);
}
}
/*
@SpringBootApplication:是一个组合注解,用于快捷的培训hi启动类可配置多个启动类,但启动时需要选择以那个类作为启动类来启动项目
*/
3.2:创建一个控制类:
package com.bjsxt.httpclicentserver.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@RequestMapping(value="/test" ,produces={
"application/json;charset=UTF-8"})
@ResponseBody
public String test(){
return "{\"msg\":\"处理返回\"}";
}
}
/*
@Controller注解:是Spring框架提供的注解,Controller标识类,该类代表控制器(控制层/表现层)。
@RequestMapping注解:是一个用来处理请求地址映射的注解,可以用于类或方法上。用在类上表示类中所有请求的方法都是以该地址作为父路径。
value属性:指定请求的实际地址
method属性:指定请求方式,get\post
consumes属性:指定处理请求的提交内容类型
produces属性:指定返回内容类型,可以防止中文乱码
params属性:指定request中必须包含某些参数值时,才让该方法处理
headers属性:指定request中必须包含某些指定的header值
@ResponseBody注解:就是将返回的对象通过MessageConverter处理之后,写入response的outputStream中返回。
*/
3.3:测试代码
以上的代码完成后,我们需要通过启动类进行测试返回的结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4NsmY5h-1596204049432)(D:\桌面文件\RPC\05.png)]
现在我们暂时是用浏览器进行访问,将来我们就需要用代码进行访问
3.4:创建一个客户端
httpclient_rpc_client
3.4.1:导入httpClient依赖
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
</dependencies>
在我们拥有了这个代码以后我们就可以尝试的写客户端代码了
3.4.2:GET无参数客户端代码
package com.bjsxt.httpclient;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/**
*使用Main方法,测试HttpClient技术
*/
public class TestHttpClient {
public static void main(String[] args) throws IOException {
//调用无参数GET请求
testGetNoParams();
}
/**
*在这里我们创建一个静态的没有返回值的类
* 无参数GET请求
* 在我们用HttpClient发送请求的时候我们回忆一下
* 使用浏览器访问网站的过程
* 1、打开浏览器
* 2、输入网址
* 3、访问
*