【JAVA】gRPC使用

安装proto 3.+版本

参照http://blog.csdn.net/simonchi/article/details/76495696


写好proto文件

peroson.proto  对象定义文件

syntax="proto3";
package com.cmcc.protobuf;
option java_outer_classname="PersonProbuf";

message Person {
	string username=1;
	int32 age=2;
	string sex=3;
}

message Req {
	string username=1;
}

message Resp {
	Person person=1;
}
service.proto 服务定义文件

syntax="proto3";
package com.cmcc.protobuf;
import "person.proto";

service UserService {
	rpc query(Req) returns (Resp) {}
}
具体proto文件的语法参照官方 https://developers.google.com/protocol-buffers/docs/proto3

然后通过proto生成person和service的代码

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

然后执行mvn clean install最后会在target目录下生成服务的rpc的代码,拷贝到src目录下即可


编写服务端代码

package com.cmcc.grpc;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;

import com.cmcc.protobuf.PersonProbuf;
import com.cmcc.protobuf.PersonProbuf.Req;
import com.cmcc.protobuf.PersonProbuf.Resp;
import com.cmcc.protobuf.UserServiceGrpc;

/**
 * @Type GrpcServer.java
 * @Desc 
 * @author chiwei
 * @date 2017年8月2日 下午2:51:12
 * @version 
 */
/**
 * @author chiwei
 *
 */
public class GrpcServer {

    private int port = 50011;
    private Server server;

    private void start() throws Exception {
        server = ServerBuilder.forPort(port).addService(new UserServiceImpl()).build().start();
        System.out.println("user service start ...");
        Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                System.out.println("shutting down gRPC server since JVM is shutting down");
                GrpcServer.this.stop();
                System.out.println("server shut down");
            }

        });
    }

    private void stop() {
        if (server != null) {
            server.shutdown();
        }
    }

    private void blockUntilShutdown() throws Exception {
        if (server != null) {
            server.awaitTermination();
        }
    }

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        GrpcServer server = new GrpcServer();
        server.start();
        server.blockUntilShutdown();
    }

    private class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {

        @Override
        public void query(Req request, StreamObserver<Resp> responseObserver) {
            // TODO Auto-generated method stub
            System.out.println("service:" + request.getUsername());
            PersonProbuf.Person rp = PersonProbuf.Person.newBuilder()
                    .setUsername(request.getUsername()).setAge(100).build();
            Resp resp = Resp.newBuilder().setPerson(rp).build();
            responseObserver.onNext(resp);
            responseObserver.onCompleted();
        }

    }

}

/**
 * Revision history
 * -------------------------------------------------------------------------
 * 
 * Date Author Note
 * -------------------------------------------------------------------------
 * 2017年8月2日 chiwei create
 */

编写客户端代码

package com.cmcc.grpc;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.concurrent.TimeUnit;

import com.cmcc.protobuf.PersonProbuf.Req;
import com.cmcc.protobuf.PersonProbuf.Resp;
import com.cmcc.protobuf.UserServiceGrpc;

/**
 * @Type GrpcClient.java
 * @Desc 
 * @author chiwei
 * @date 2017年8月2日 下午3:20:09
 * @version 
 */
/**
 * @author chiwei
 *
 */
public class GrpcClient {

    private ManagedChannel channel;
    private UserServiceGrpc.UserServiceBlockingStub blockingStub;

    public GrpcClient(String host, int port) {
        channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build();
        blockingStub = UserServiceGrpc.newBlockingStub(channel);
    }

    public void shutdown() throws Exception {
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }

    public void query(String name) {
        Req req = Req.newBuilder().setUsername(name).build();
        Resp resp = blockingStub.query(req);
        System.out.println("客户端获取服务端响应信息:" + resp.getPerson());
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GrpcClient client = new GrpcClient("127.0.0.1", 50011);
        for (int i = 0; i < 5; i++) {
            client.query("chiwei" + i);
        }

    }

}

/**
 * Revision history
 * -------------------------------------------------------------------------
 * 
 * Date Author Note
 * -------------------------------------------------------------------------
 * 2017年8月2日 chiwei create
 */

执行即可。

pom文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>grpc</groupId>
	<artifactId>grpc</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>grpc</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<grpc.version>1.0.1</grpc.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-netty</artifactId>
			<version>${grpc.version}</version>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-protobuf</artifactId>
			<version>${grpc.version}</version>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-stub</artifactId>
			<version>${grpc.version}</version>
		</dependency>
		<dependency>
			<groupId>com.google.protobuf</groupId>
			<artifactId>protobuf-java</artifactId>
			<version>3.1.0</version>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-core</artifactId>
			<version>${grpc.version}</version>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-all</artifactId>
			<version>${grpc.version}</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>com.ytf.rpc.demo</finalName>
		<extensions>
			<extension>
				<groupId>kr.motd.maven</groupId>
				<artifactId>os-maven-plugin</artifactId>
				<version>1.5.0.Final</version>
			</extension>
		</extensions>
		<plugins>
			<plugin>
				<groupId>org.xolstice.maven.plugins</groupId>
				<artifactId>protobuf-maven-plugin</artifactId>
				<version>0.5.0</version>
				<configuration>
					<protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact>
					<pluginId>grpc-java</pluginId>
					<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.1:exe:${os.detected.classifier}</pluginArtifact>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal>
							<goal>compile-custom</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>





这是官网的一张图,支持多语言




猜你喜欢

转载自blog.csdn.net/chiweitree/article/details/76686209