Java—RPC:远程过程调用(1)

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();
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值