RPC与HTTP的详细比较
RPC 示例(使用 gRPC)
在这个例子中,我们使用 gRPC(一个流行的 RPC 框架)来演示 RPC 的基本用法。我们创建一个简单的计算器服务,客户端可以调用服务器上的加法操作。
服务定义 - Calculator.proto
:
syntax = "proto3";
service Calculator {
rpc Add (AddRequest) returns (AddResponse);
}
message AddRequest {
int32 operand1 = 1;
int32 operand2 = 2;
}
message AddResponse {
int32 result = 1;
}
服务器端 - CalculatorServer.java
:
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
public class CalculatorServer {
public static void main(String[] args) throws Exception {
Server server = ServerBuilder.forPort(8080)
.addService(new CalculatorServiceImpl())
.build();
server.start();
System.out.println("Server started on port 8080");
server.awaitTermination();
}
static class CalculatorServiceImpl extends CalculatorGrpc.CalculatorImplBase {
@Override
public void add(AddRequest request, StreamObserver<AddResponse> responseObserver) {
int result = request.getOperand1() + request.getOperand2();
AddResponse response = AddResponse.newBuilder().setResult(result).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
}
客户端 - CalculatorClient.java
:
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
public class CalculatorClient {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
.usePlaintext()
.build();
CalculatorGrpc.CalculatorBlockingStub stub = CalculatorGrpc.newBlockingStub(channel);
AddRequest request = AddRequest.newBuilder()
.setOperand1(5)
.setOperand2(3)
.build();
AddResponse response = stub.add(request);
System.out.println("Result: " + response.getResult());
channel.shutdown();
}
}
在这个例子中,我们使用 Protocol Buffers 定义了一个简单的 RPC 服务,该服务包含一个加法操作。服务器和客户端使用 gRPC 框架进行通信。
HTTP 示例
在这个例子中,我们使用 Java 中的 Spring Boot 框架演示了一个简单的 HTTP 服务器和客户端。我们创建一个简单的 Web 服务,客户端通过 HTTP 请求获取服务器上的文本内容。
服务器端 - HttpServer.java
:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class HttpServer {
public static void main(String[] args) {
SpringApplication.run(HttpServer.class, args);
}
@RestController
public static class MyController {
@GetMapping("/example")
public String getExample() {
return "<html><body><h1>Hello, World!</h1></body></html>";
}
}
}
客户端 - HttpClient.java
:
import org.springframework.web.client.RestTemplate;
public class HttpClient {
public static void main(String[] args) {
String url = "http://localhost:8080/example";
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
System.out.println("Response: " + response);
}
}
在这个例子中,我们使用 Spring Boot 创建了一个简单的 HTTP 服务器,并使用 RestTemplate 发送 HTTP GET 请求。客户端通过 HTTP 获取服务器上的 HTML 内容