Es gibt Zeiten, in denen das Neueste nicht genug auf der Welt ist. Zum Beispiel IE, IE, IE. Deshalb hoffe ich, dass es eine Referenz für diejenigen ist, die hart arbeiten müssen, um sich in einer alten Umgebung zu entwickeln. Andere haben die Erklärung von gRPC selbst ausführlich geschrieben. Bitte suchen Sie danach.
Etwa diese Umgebung. Verschiedene alte.
Unter Bezugnahme auf das Folgende. https://grpc.io/docs/tutorials/basic/java/ https://github.com/grpc/grpc-java/blob/master/examples/README.md
Wenn Sie es sich nicht leisten können, überspringen Sie bitte hier.
Lassen Sie uns mit Docker wie gewohnt schnell eine Umgebung erstellen.
$ docker run --rm -it --name grpc-java -p 50051:50051 ubuntu
root@e7b3b2c13c0b:/# apt-get update
root@e7b3b2c13c0b:/# apt-get install -y git openjdk-8-jdk maven
root@e7b3b2c13c0b:/# git clone -b v1.22.1 https://github.com/grpc/grpc-java
root@e7b3b2c13c0b:/# cd grpc-java/examples
root@e7b3b2c13c0b:/grpc-java/examples# ./gradlew installDist
Übrigens wird tools.jar
verwendet, daher können Sie jre
nicht verwenden.
Wenn Sie dies mit jre tun, tritt der folgende Fehler auf.
> Task :compileJava FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileJava'.
> Could not find tools.jar. Please check that /usr/lib/jvm/java-8-openjdk-amd64 contains a valid JDK installation.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 43s
Zu diesem Zeitpunkt ist die Umgebung bereit. Ein Beispiel für HelloWorld finden Sie unten.
/grpc-java/examples/src/main/proto/helloworld.proto /grpc-java/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java /grpc-java/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java
Lassen Sie es uns unter / grpc-java / examples
erstellen und ausführen.
root@e7b3b2c13c0b:~# cd /grpc-java/examples
root@e7b3b2c13c0b:/grpc-java/examples# mvn clean compile
root@e7b3b2c13c0b:/grpc-java/examples# mvn exec:java -Dexec.mainClass=io.grpc.examples.helloworld.HelloWorldServer &
[1] 5817
root@e7b3b2c13c0b:/grpc-java/examples#
root@e7b3b2c13c0b:/grpc-java/examples# mvn exec:java -Dexec.mainClass=io.grpc.examples.helloworld.HelloWorldClient
Wenn Sie "Gruß: Hallo Welt" sehen, sind Sie fertig.
Diesmal werden Server und Client auf demselben Terminal ausgeführt.
Wenn Sie den Server herunterfahren möchten, führen Sie die folgenden Schritte aus. (fg
-> Strg + C
)
root@e7b3b2c13c0b:/grpc-java/examples# fg
mvn exec:java -Dexec.mainClass=io.grpc.examples.helloworld.HelloWorldServer
^C*** shutting down gRPC server since JVM is shutting down
*** server shut down
root@e7b3b2c13c0b:/grpc-java/examples#
Wenn Sie die Protodatei geändert haben, führen Sie ./gradlew install Dist
aus, um den Java-Code zu generieren.
Wenn Sie die Java-Ausführungsoptionen ändern möchten, können Sie "MAVEN_OPTS" festlegen.
MAVEN_OPTS="-server -Xmx1024m -Xms1024m -Xloggc:/grpc-java/examples/GC.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xverify:none -Djava.security.egd=file:/dev/./urandom -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+PrintTenuringDistribution -XX:-Inline"
export MAVEN_OPTS
Nun, es ist endlich das Hauptthema. Es ist ein gebundenes Spiel, das die Verwendung von Docker und Gradle unter Windows verbietet. Pure gRPC ist Java 7 oder höher, aber das Beispiel verwendet Gradle und Maven 3 oder höher ist erforderlich (um das Plug-In zu verwenden).
Lassen Sie uns zunächst ein Maven-Projekt erstellen. Die diesmal erforderlichen Abhängigkeiten sind wie folgt. (Log ist Ihre Wahl)
pom.xml
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.22.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
Erstellen Sie einen Proto-Ordner direkt unter dem Projekt und erstellen Sie eine Proto-Datei.
grpc.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "org.mygrpc.helloworld";
option java_outer_classname = "GrpcProto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
Generieren Sie eine Java-Quelle aus einer Protodatei. Laden Sie die Datei für Windows unter [protobuf] herunter (https://github.com/protocolbuffers/protobuf/). https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip
Entpacken Sie es und platzieren Sie "protoc.exe" unter dem Ordner "bin" an einem Ort, der sich in Ihrem Pfad befindet. Sie können es irgendwo neu platzieren und durch den Pass führen. Wenn Sie in Zukunft mit dem vollständigen Pfad ausgeführt werden, müssen Sie den Pfad nicht separat übergeben.
Führen Sie an der Eingabeaufforderung Folgendes in dem Ordner aus, der die zuvor erstellte grpc.proto
enthält.
protoc --java_out=..\src\main\java grpc.proto
Die Quelle wurde unter "org.mygrpc.helloworld" generiert.
.
│ pom.xml
│
├─proto
│ grpc.proto
│
└─src
├─main
│ ├─java
│ │ └─org
│ │ └─mygrpc
│ │ └─helloworld
│ │ GrpcProto.java
│ │ HelloReply.java
│ │ HelloReplyOrBuilder.java
│ │ HelloRequest.java
│ │ HelloRequestOrBuilder.java
│ │
│ └─resources
│ log4j.dtd
│ log4j.xml
│
└─test
├─java
└─resources
Eigentlich reicht das nicht aus. Laden Sie das Tool herunter, um ein weiteres zu generieren. https://search.maven.org/search?q=g:io.grpc%20a:protoc-gen-grpc-java
Platzieren Sie die heruntergeladene Exe in einem beliebigen Ordner und führen Sie die folgenden Schritte aus (ändern Sie den Pfad zu dem Ordner, in dem sich die obige Exe befindet).
protoc --plugin=protoc-gen-grpc-java=C:\protoc\protoc-gen-grpc-java-1.22.1-windows-x86_64.exe --grpc-java_out=..\src\main\java grpc.proto
Ich denke, Sie haben "GreeterGrpc.java" erstellt.
Erstellen Sie die Server- und Clientprozesse anhand des Beispiels.
HelloWorldServer.java
package org.mygrpc.helloworld;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class HelloWorldServer {
/** Log. */
protected static Log log = LogFactory.getLog(HelloWorldServer.class);
private Server server;
private void start() throws IOException {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
.build()
.start();
log.info("Server started, listening on " + port);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// Use stderr here since the logger may have been reset by its JVM shutdown hook.
System.err.println("*** shutting down gRPC server since JVM is shutting down");
HelloWorldServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
/**
* Await termination on the main thread since the grpc library uses daemon threads.
*/
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
/**
* Main launches the server from the command line.
*/
public static void main(String[] args) throws IOException, InterruptedException {
final HelloWorldServer server = new HelloWorldServer();
server.start();
server.blockUntilShutdown();
}
static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
}
HelloWorldClient.java
package org.mygrpc.helloworld;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class HelloWorldClient {
/** Log. */
protected static Log log = LogFactory.getLog(HelloWorldClient.class);
public static void main(String[] args) throws Exception {
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 50051).usePlaintext().build();
GreeterGrpc.GreeterBlockingStub blockingStub = GreeterGrpc
.newBlockingStub(channel);
try {
HelloRequest request = HelloRequest.newBuilder().setName("World").build();
try {
HelloReply resp = blockingStub.sayHello(request);
log.info(resp.getMessage());
} catch (StatusRuntimeException e) {
log.warn("RPC failed: " + e.getStatus());
return;
}
} finally {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
}
}
Wenn Sie den Server bzw. den Client ausführen und "Hello World" ausgeben, ist dies in Ordnung. Jetzt können Sie sich endlich entwickeln.
Übrigens scheint es als Plug-In zum Bearbeiten von Protodateien Folgendes zu geben, aber ich habe aufgegeben, weil Version 2.3.0 oder höher Eclipse 4.6 Neon oder höher erfordert. https://github.com/google/protobuf-dt
Recommended Posts