写出一个Java服务利用grpc调用另一个Java服务的demo
时间: 2023-09-04 12:04:13 浏览: 160
grpc java版本demo
### 回答1:
您可以参考以下示例代码来实现:import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.HelloReply;
import io.grpc.examples.helloworld.HelloRequest;public class GrpcDemo { public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
// 创建一个gRPC客户端
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
// 创建一个HelloRequest对象
HelloRequest request = HelloRequest.newBuilder()
.setName("grpc")
.build();
// 发起调用
HelloReply response = stub.sayHello(request);
System.out.println(response.getMessage());
}
}
### 回答2:
下面是一个使用Java编写的示例代码,实现了一个Java服务利用gRPC调用另一个Java服务的演示。
在这个示例中,我们假设存在两个Java服务,一个是gRPC服务器(Server),另一个是gRPC客户端(Client)。我们将使用protobuf生成的代码来定义gRPC服务。
首先,需要创建一个proto文件来定义我们的服务。
```protobuf
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.grpcdemo";
option java_outer_classname = "GreeterProto";
package greeter;
service Greeter {
rpc SayHello(HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
```
然后,我们使用protoc编译器生成Java代码:
```
$ protoc --java_out=./src/main/java ./greeter.proto
```
Server端的示例代码如下:
```java
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import com.example.grpcdemo.GreeterProto.Greeter;
import com.example.grpcdemo.GreeterProto.HelloRequest;
import com.example.grpcdemo.GreeterProto.HelloResponse;
import java.io.IOException;
public class ServerDemo {
private Server server;
public void start() throws IOException {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
.build()
.start();
System.out.println("Server started on port " + port);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutting down server...");
ServerDemo.this.stop();
}));
}
public void stop() {
if (server != null) {
server.shutdown();
}
}
private static class GreeterImpl extends Greeter {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
String name = request.getName();
String message = "Hello, " + name + "!";
HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
public static void main(String[] args) throws IOException {
ServerDemo server = new ServerDemo();
server.start();
}
}
```
Client端的示例代码如下:
```java
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import com.example.grpcdemo.GreeterProto.Greeter;
import com.example.grpcdemo.GreeterProto.HelloRequest;
import com.example.grpcdemo.GreeterProto.HelloResponse;
public class ClientDemo {
private final ManagedChannel channel;
private final Greeter blockingStub;
public ClientDemo(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
blockingStub = Greeter.newBlockingStub(channel);
}
public void sayHello(String name) {
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
System.out.println("Greeting: " + response.getMessage());
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
ClientDemo client = new ClientDemo("localhost", 50051);
client.sayHello("World");
client.shutdown();
}
}
```
以上是一个使用Java编写的示例,展示了一个Java服务如何利用gRPC调用另一个Java服务。在这个示例中,我们定义了一个简单的gRPC服务,然后实现了一个gRPC服务器和一个gRPC客户端。服务器通过GreeterImpl类来处理客户端的请求,并返回一个简单的问候消息。客户端通过调用服务器的方法来向服务器发送请求,并输出服务器返回的响应消息。
希望这个示例能够帮助到您理解如何使用Java编写一个使用gRPC调用另一个Java服务的demo。
### 回答3:
下面是一个使用gRPC调用另一个Java服务的示例:
首先,我们需要定义一个.proto文件,来定义RPC服务和消息格式。假设我们有一个名为"UserService"的服务,它有一个"getUser"方法,用于获取用户信息。我们需要在.proto文件中定义这些内容:
```protobuf
syntax = "proto3";
package com.example;
service UserService {
rpc getUser (UserRequest) returns (UserResponse) {}
}
message UserRequest {
string userId = 1;
}
message UserResponse {
string userName = 1;
}
```
然后,我们使用gRPC的插件生成Java代码。可以使用以下命令生成代码:
```shell
$ protoc -I=/path/to/proto/files --java_out=/path/to/output/directory /path/to/proto/files/user_service.proto
```
生成的代码将包括UserServiceGrpc类和UserRequest/UserResponse类。
接下来,我们创建一个Java服务,并实现UserService中的getUser方法。例如,我们可以创建一个名为"UserServiceImpl"的类:
```java
package com.example;
import io.grpc.stub.StreamObserver;
public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
@Override
public void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {
// 在这里编写获取用户信息的逻辑
String userId = request.getUserId();
// 假设这里我们简单返回用户名为userId的用户
UserResponse response = UserResponse.newBuilder()
.setUserName(userId)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
```
最后,我们创建一个用于启动gRPC服务的类,它将监听指定的端口并提供UserService。例如,我们创建一个名为"Server"的类:
```java
package com.example;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
int port = 50051;
Server server = ServerBuilder.forPort(port)
.addService(new UserServiceImpl())
.build();
server.start();
System.out.println("Server started on port " + port);
server.awaitTermination();
}
}
```
现在,我们可以编译并运行这两个服务。首先运行Server类启动gRPC服务,然后在另一个Java服务中,我们可以使用gRPC的Stub来调用UserService中的getUser方法:
```java
package com.example;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
public class Client {
public static void main(String[] args) {
String host = "localhost";
int port = 50051;
ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
UserServiceGrpc.UserServiceBlockingStub blockingStub = UserServiceGrpc.newBlockingStub(channel);
UserRequest request = UserRequest.newBuilder()
.setUserId("123")
.build();
UserResponse response = blockingStub.getUser(request);
System.out.println("UserName: " + response.getUserName());
channel.shutdown();
}
}
```
这样,我们就完成了一个简单的Java服务利用gRPC调用另一个Java服务的示例。
阅读全文