首页 > 其他分享 >【学习】为什么许多大型APP会采用RPC而不是HTTP协议呢?

【学习】为什么许多大型APP会采用RPC而不是HTTP协议呢?

时间:2024-09-10 18:49:28浏览次数:10  
标签:HTTP 调用 Java APP RPC import 序列化

https://mp.weixin.qq.com/s/JD5qDjYFVn37pAC6W5JuDw

原创 前端欧巴

在回答这个问题之前我们有必要系统性的了解一下RPC是何方神圣。
---------------------------------------------------------------------------------------------

RPC(Remote Procedure Call,远程过程调用)是一种允许一个程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数的技术,而无需程序员显式编码这个远程调用的细节。
RPC 隐藏了底层的网络通讯细节,使得远程调用看起来就像是本地调用一样。

在 Java 环境中,有多种实现 RPC 的方式,包括但不限于以下几种:

RMI (Remote Method Invocation):
Java RMI 是 Java 原生支持的 RPC 机制。它允许 Java 虚拟机(JVM)上的对象像调用本地对象方法一样调用远程对象上的方法。RMI 使用 Java 序列化来传递参数和返回值。然而,RMI 主要设计用于 Java 到 Java 的通信,并且通常不建议用于生产环境中的跨网络 RPC,因为它存在安全性和性能上的局限性。

Web Services (SOAP, REST):

虽然 Web Services 并不是传统意义上的 RPC,但它们经常被用作跨语言和平台的远程通信方式。SOAP(Simple Object Access Protocol)和 REST(Representational State Transfer)是两种常见的 Web Services 实现方式。SOAP 是一种基于 XML 的协议,而 REST 则更多地依赖于 HTTP 协议。REST 因其简单性和灵活性而被广泛用于移动应用和 Web 应用中。

gRPC:

gRPC 是一个高性能、开源和通用的 RPC 框架,由 Google 领导开发。它支持多种语言,并且使用 Protocol Buffers 作为接口定义语言(IDL)和序列化/反序列化机制。gRPC 提供了强大的功能,如流控制、服务发现、负载均衡等,非常适合微服务架构。

Apache Thrift:

Thrift 是由 Facebook 开发的一个跨语言的 RPC 框架,它使用 Thrift IDL(接口定义语言)来定义服务和数据类型。Thrift 编译器会生成不同编程语言的代码,使得在不同语言之间调用远程服务变得简单。Thrift 也支持多种传输和序列化机制。

RPC 通信的基本步骤

定义服务接口:
使用 IDL(如 Protocol Buffers、Thrift IDL)定义服务接口和消息格式。

生成服务代码:
使用 RPC 框架提供的工具根据 IDL 文件生成服务接口和桩(stub)代码。

实现服务:
在服务端实现定义的服务接口。

部署服务:
将服务端应用部署到服务器上,并配置网络监听。

客户端调用:
客户端通过 RPC 框架提供的 API 调用远程服务,就像调用本地方法一样。

参数传递和返回:
客户端和服务端之间通过网络传递参数和返回值,这些参数和返回值会被序列化和反序列化。

结果处理:
客户端处理调用结果。

注意事项

安全性:确保 RPC 通信的安全性,包括数据传输的加密、身份验证和授权。

性能:考虑 RPC 调用的性能影响,包括网络延迟、序列化/反序列化开销等。

异常处理:妥善处理 RPC 调用过程中可能出现的异常和错误。

服务发现和注册:在微服务架构中,可能需要使用服务发现和注册机制来动态发现远程服务。

版本控制:随着服务接口的演变,需要管理不同版本的服务接口和客户端代码。

---------------------------------------------------------------------------------------------

RPC(远程过程调用)和HTTP是两种不同的通信协议,它们在设计和用途上有所不同。
以下是RPC和HTTP的一些关键对比点,通常以表格形式呈现:


RPC通常用于内部系统之间的通信,它允许客户端像调用本地函数一样调用远程服务器上的函数。
而HTTP则广泛用于Web应用和互联网服务,它通过标准的HTTP方法和状态码来实现请求和响应。

RPC可以基于不同的传输协议,如TCP或UDP,而HTTP则是建立在TCP/IP协议之上的。
RPC的接口定义通常使用IDL,而HTTP则使用标准的HTTP方法。在编码方面,RPC允许自定义序列化和反序列化机制,而HTTP通常使用JSON或XML。

RPC可以是同步或异步的,而HTTP主要是同步的。
在连接方面,RPC可以是长连接也可以是短连接,而HTTP通常是无状态的,尽管可以通过Cookie和Session来实现状态管理。

在性能方面,RPC通常更高,因为它可以针对特定的应用场景进行优化。
安全性方面,RPC可以自定义安全机制,而HTTP则通过HTTPS、OAuth等标准实现安全。

最后,RPC和HTTP都支持跨语言和跨平台,但它们的用途有所不同,RPC更适合内部系统间的调用,而HTTP更适合Web应用和互联网服务。

---------------------------------------------------------------------------------------------

在Android应用中调用后端Java RPC服务,通常不会直接使用传统的RPC框架(如Java RMI,因为它主要设计用于Java到Java的通信,并且不适合跨网络使用),而是会采用更通用的网络通信技术,如HTTP REST API或gRPC(如果确实需要RPC风格的通信)。

然而,为了保持示例的简洁性和可访问性,我将展示如何使用HTTP REST API来模拟RPC调用的效果,因为HTTP是移动应用与后端服务通信的常用方式。

Java后端 (Spring Boot)

首先,我们创建一个简单的Spring Boot REST API。

pom.xml

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
    <!-- 其他依赖项 -->  
</dependencies>

GreetingController.java

import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class GreetingController {  
  
    @GetMapping("/greeting")  
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {  
        return "Hello, " + name + "!";  
    }  
}

Application.java

import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@SpringBootApplication  
public class GreetingApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(GreetingApplication.class, args);  
    }  
}

确保Spring Boot应用正在运行,并且可以通过http://localhost:8080/greeting?name=Android访问。

Android客户端

在Android端,我们将使用OkHttp库来发送HTTP GET请求到Spring Boot后端。

首先,在build.gradle文件中添加OkHttp的依赖项:

dependencies {  
    // 其他依赖项  
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'  
}

然后,创建一个Activity来发送请求并处理响应:

MainActivity.java

import android.os.Bundle;  
import android.widget.TextView;  
import androidx.appcompat.app.AppCompatActivity;  
import okhttp3.Call;  
import okhttp3.Callback;  
import okhttp3.OkHttpClient;  
import okhttp3.Request;  
import okhttp3.Response;  
  
public class MainActivity extends AppCompatActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        TextView textView = findViewById(R.id.greetingTextView);  
  
        OkHttpClient client = new OkHttpClient();  
  
        Request request = new Request.Builder()  
                .url("http://10.0.2.2:8080/greeting?name=Android") // 注意:在Android模拟器中使用10.0.2.2代替localhost  
                .build();  
  
        client.newCall(request).enqueue(new Callback() {  
            @Override  
            public void onFailure(Call call, IOException e) {  
                e.printStackTrace();  
                runOnUiThread(() -> textView.setText("Failed to retrieve greeting"));  
            }  
  
            @Override  
            public void onResponse(Call call, Response response) throws IOException {  
                if (response.isSuccessful()) {  
                    final String greeting = response.body().string();  
                    runOnUiThread(() -> textView.setText(greeting));  
                } else {  
                    runOnUiThread(() -> textView.setText("Error: " + response.code()));  
                }  
            }  
        });  
    }  
}

注意:在Android模拟器中,localhost不会指向你的开发机器(即运行Android Studio的机器)。

相反,你应该使用10.0.2.2这个特殊IP地址来访问开发机器上的服务。

此外,请确保你的Android应用有权限访问互联网(通常默认就有,但如果你修改了AndroidManifest.xml,请检查这一点)。

这个示例展示了如何在Android应用中发送HTTP GET请求到Spring Boot后端,并处理返回的文本数据。
虽然这不是传统意义上的RPC调用,但它模拟了RPC调用的效果,即远程过程调用并返回结果。
如果你确实需要更高级的RPC功能,可以考虑使用gRPC,但这将需要更多的设置和配置工作。

标签:HTTP,调用,Java,APP,RPC,import,序列化
From: https://www.cnblogs.com/o-O-oO/p/18406686

相关文章

  • 台球助教小程序开发/APP源码部署
    开发一个美女台球助教微信小程序,需要综合考虑技术实现、用户体验、内容合规性以及市场推广等多个方面。下面是一个大致的开发流程和关键要点:1.市场调研与需求分析目标用户定位:明确你的小程序主要服务于哪些人群,比如台球爱好者、初学者、专业球员等。功能需求分析:确定小程序......
  • P10408 「SMOI-R1」Apple
    据说是个典,记录一下吧。题意给你\(\{a_{2^n}\}\)和\(q\)次操作,下标从0开始。操作如下:1x,表示查询\(\sum_{y\operatorname{or}x=x}a_y\)的值。2xv,表示\(a_x\leftarrowv\)\(n\le20,q\le3\times10^5\)。分析令\(y\)为\(x\)的子集当且仅当\(y\operatorna......
  • websocket协议与http协议
    WebSocket协议和HTTP协议都是用于网络通信的协议,但它们在设计目标、通信方式和应用场景上有一些关键的区别。以下是它们的主要区别:1.设计目标HTTP:设计目标:HTTP旨在为万维网提供一种标准化的请求/响应机制,允许客户端和服务器之间进行数据交换。它是无状态的,每个请求都......
  • java+vue计算机毕设宠物医院App【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人们对宠物情感依赖的增强,宠物已成为许多家庭不可或缺的一员。然而,传统的宠物医疗服务模式往往存在信息不对称、预约难、服......
  • 苹果应用商店有哪些App Store付费软件应用?
    考虑到阅读场景的不同,本文特别优化了暗夜模式的阅读体验。为防止大家购买的ipad,最终单纯沦为爱奇艺点播器与泡面搭档,本文将不断扩充进行优化。希望读者能从中收获灵感,以期在使用方式上,形成自己的逻辑闭环。(如果有帮到你,请给我点个赞,蟹蟹辣!)引言:∵⃝⍤⃝⍥⃝⍨⃝ᗦ↞◃......
  • 828华为云征文|华为云Flexus X搭建借贷管理系统、二次开发借贷小程序 前端源码uniapp
    在华为云828B2B企业节的盛宴中,FlexusX实例以其卓越的算力性能和灵活的资源配置脱颖而出。对于追求极致性能、渴望在借贷管理、电商交易等场景中脱颖而出的您来说,FlexusX无疑是最佳拍档。搭载创新加速引擎,让您的自建MySQL、Redis、Nginx如虎添翼,轻松应对高并发挑战,确保业......
  • uniapp开发H5手机内置浏览器列表页面上滑地址栏隐藏导致页面底部出现空白的解决方法
    前言:使用滚动组件一般都需要设置一个固定高度,但有些浏览器上滑会隐藏地址栏,然后窗口的windowHeight变大,滚动组件底部就出现了空白,如下图:处理这个问题,就需要再窗口尺寸变化的时候重新设置滚动组件的高度了。解决方案:使用uniapp的OnReSize生命周期中对滚动组件高度进行重新赋......
  • 2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正
    2024-09-04:用go语言,给定一个长度为n的数组happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。在筛选过程中,每轮选择一个孩子时,所有尚未选中的孩子的幸福值都会减少1。需要注意的是,幸福值不能降低到负数,只有在其为正数时才能减少。我们的目标是尽可......
  • docker Get "https://registry-1.docker.io/v2/": x509: certificate is valid for
    前言docker在进行build时,报错:Get"https://registry-1.docker.io/v2/":x509:certificateisvalidfor问题原因:Docker客户端无法验证DockerHub服务器的SSL/TLS证书解决在/etc/docker/daemon.json中新增国内镜像源:"registry-mirrors":["https:/......
  • HTTPS证书如何申请?只需这五个步骤
    在当今互联网+时代,保护用户的敏感数据和隐私变得越来越重要,HTTPS证书可以加密传输数据,有效保护传输数据安全,消除浏览器不安全提示,增加网站的安全性和可信性,由此个人或企业网站都建议部署HTTPS证书。那么我们应该如何申请HTTPS证书呢?在本文中,我们将向您介绍5个简单的步骤,让您轻......