注:本文篇幅非常长
有将近10万字~,所以建议各位下载源码学习。(如需要请收藏!转载请声明来源,谢谢!)
继续上文 :spring整合各种RPC框架(netty、dubbo、dubbox、RPC、Motan)-续netty
gRPC
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
使用场景
跨语言;
低延迟,高可用分布式;
下载gRp
https://github.com/grpc/grpc-java.git
idea先安装 protobuf 参考:https://blog.csdn.net/qq_39940205/article/details/80095302
java实现gRPC
项目结构
└─src
├─main
│ ├─com
│ │ └─hong
│ │ └─spring
│ │ ├─java-grpc
│ │ │ └─com
│ │ │ └─hong
│ │ │ └─spring
│ │ │ └─service
│ │ └─java-proto
│ │ └─com
│ │ └─hong
│ │ └─spring
│ │ └─service
│ ├─java
│ │ └─com
│ │ └─hong
│ │ └─spring
│ │ └─grpc
│ ├─proto
│ └─resources
└─test
└─java
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring_rpc</artifactId>
<groupId>com.hong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.spring</groupId>
<artifactId>spring_grpc_server</artifactId>
<properties>
<!-- Message源文件输出目录 -->
<javaOutputDirectory>${project.basedir}/src/main/java/proto</javaOutputDirectory>
<!-- gRPC源文件输出目录 -->
<protocPluginOutputDirectory>${project.basedir}/src/main/java/grpc</protocPluginOutputDirectory>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.21.0</version>
</dependency>
</dependencies>
<build>
<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.1</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:1.21.0:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
spring_rpc/spring_grpc_server/src/main/proto/hello_world.proto
syntax = "proto3";
option java_package = "com.hong.spring";
option java_multiple_files = true;
option java_outer_classname = "HelloWorldProto";
message Greeting {
string name = 1;
}
message HelloResp {
string reply = 1;
}
service HelloWorld {
rpc sayHello (Greeting) returns (HelloResp);
}
开始生成,查看idea 项目maven的plugins->protobuf
注意以下生成后需要手动移到com.hong.spring中否则路劲不一致会报错!(因为这个生成会覆盖所以不能放到一个目录中)
运行以上两个,生成如下:
编写调用服务接口
com.hong.spring.grpc.HelloWorldRpcService
package com.hong.spring.grpc;
import com.hong.spring.Greeting;
import com.hong.spring.HelloResp;
import com.hong.spring.HelloWorldGrpc;
import io.grpc.stub.StreamObserver;
/**
*
* 功能描述: 响应接口
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
public class HelloWorldRpcService extends HelloWorldGrpc.HelloWorldImplBase {
@Override
public void sayHello(Greeting request, StreamObserver<HelloResp> responseObserver) {
String name = request.getName();
HelloResp resp = HelloResp.newBuilder()
.setReply("Hello " + name + "!")
.build();
responseObserver.onNext(resp);
responseObserver.onCompleted();
}
}
com.hong.spring.grpc.GrpcServer
package com.hong.spring.grpc;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;
/**
*
* 功能描述: 服务端
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
public class GrpcServer {
private Server server;
public GrpcServer(int port) {
server = ServerBuilder.forPort(port)
// 将具体实现的服务添加到gRPC服务中
.addService(new HelloWorldRpcService())
.build();
}
public void start() throws IOException {
server.start();
}
public void shutdown() {
server.shutdown();
}
}
com.hong.spring.grpc.HelloWorldClient
package com.hong.spring.grpc;
import com.hong.spring.Greeting;
import com.hong.spring.HelloResp;
import com.hong.spring.HelloWorldGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
/**
*
* 功能描述: 客户端
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
public class HelloWorldClient {
private final HelloWorldGrpc.HelloWorldBlockingStub blockingStub;
/**
* @param host gRPC服务的主机名
* @param port gRPC服务的端口
*/
public HelloWorldClient(String host, int port) {
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port)
// 使用非安全机制传输
.usePlaintext()
.build();
blockingStub = HelloWorldGrpc.newBlockingStub(managedChannel);
}
public String sayHello(String name) {
Greeting greeting = Greeting.newBuilder()
.setName(name)
.build();
HelloResp resp = blockingStub.sayHello(greeting);
return resp.getReply();
}
}
com.hong.spring.grpc.HelloWorldApp
package com.hong.spring.grpc;
public class HelloWorldApp {
public static void main(String[] args) throws Exception {
//服务端
int port = 8080;
GrpcServer server = new GrpcServer(port);
server.start();
//客户端
HelloWorldClient client = new HelloWorldClient("localhost", port);
String reply = client.sayHello("hi hong");
System.out.println(reply);
//关闭服务
server.shutdown();
}
}
启动 HelloWorldApp 结果如下:
Hello hi hong!
发现这个grpc还真的挺简单的,基本都要吧靠生成,hh,当然个性化逻辑也是需要手写的...
参考:
https://www.zhyui.com/articles/2019062801.html
https://cloud.tencent.com/document/product/1165/46155
spring mvc整合grpc
文章开始之前,说真的不好整,整个网络找不着任何先例~
spring_grpc_api 主要用于相关公共的api
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring_rpc</artifactId>
<groupId>com.hong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.spring</groupId>
<artifactId>spring_grpc_api</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.hong</groupId>
<artifactId>spring_dubbo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.21.0</version>
</dependency>
</dependencies>
</project>
com.hong.spring.Greeting
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.spring;
/**
* Protobuf type {@code Greeting}
*/
public final class Greeting extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:Greeting)
GreetingOrBuilder {
private static final long serialVersionUID = 0L;
// Use Greeting.newBuilder() to construct.
private Greeting(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private Greeting() {
name_ = "";
}
@Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private Greeting(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new NullPointerException();
}
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 10: {
String s = input.readStringRequireUtf8();
name_ = s;
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_Greeting_fieldAccessorTable
.ensureFieldAccessorsInitialized(
Greeting.class, Builder.class);
}
public static final int NAME_FIELD_NUMBER = 1;
private volatile Object name_;
/**
* <code>string name = 1;</code>
*/
public String getName() {
Object ref = name_;
if (ref instanceof String) {
return (String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
name_ = s;
return s;
}
}
/**
* <code>string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
Object ref = name_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
name_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private byte memoizedIsInitialized = -1;
@Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (!getNameBytes().isEmpty()) {
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
}
unknownFields.writeTo(output);
}
@Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (!getNameBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Greeting)) {
return super.equals(obj);
}
Greeting other = (Greeting) obj;
if (!getName()
.equals(other.getName())) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + NAME_FIELD_NUMBER;
hash = (53 * hash) + getName().hashCode();
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static Greeting parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static Greeting parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static Greeting parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static Greeting parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static Greeting parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static Greeting parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(Greeting prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code Greeting}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:Greeting)
GreetingOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_Greeting_fieldAccessorTable
.ensureFieldAccessorsInitialized(
Greeting.class, Builder.class);
}
// Construct using Greeting.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@Override
public Builder clear() {
super.clear();
name_ = "";
return this;
}
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
public Greeting getDefaultInstanceForType() {
return Greeting.getDefaultInstance();
}
@Override
public Greeting build() {
Greeting result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@Override
public Greeting buildPartial() {
Greeting result = new Greeting(this);
result.name_ = name_;
onBuilt();
return result;
}
@Override
public Builder clone() {
return super.clone();
}
@Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.setField(field, value);
}
@Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, Object value) {
return super.setRepeatedField(field, index, value);
}
@Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.addRepeatedField(field, value);
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof Greeting) {
return mergeFrom((Greeting)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(Greeting other) {
if (other == Greeting.getDefaultInstance()) return this;
if (!other.getName().isEmpty()) {
name_ = other.name_;
onChanged();
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@Override
public final boolean isInitialized() {
return true;
}
@Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
Greeting parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (Greeting) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private Object name_ = "";
/**
* <code>string name = 1;</code>
*/
public String getName() {
Object ref = name_;
if (!(ref instanceof String)) {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
name_ = s;
return s;
} else {
return (String) ref;
}
}
/**
* <code>string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
Object ref = name_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
name_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>string name = 1;</code>
*/
public Builder setName(
String value) {
if (value == null) {
throw new NullPointerException();
}
name_ = value;
onChanged();
return this;
}
/**
* <code>string name = 1;</code>
*/
public Builder clearName() {
name_ = getDefaultInstance().getName();
onChanged();
return this;
}
/**
* <code>string name = 1;</code>
*/
public Builder setNameBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
name_ = value;
onChanged();
return this;
}
@Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:Greeting)
}
// @@protoc_insertion_point(class_scope:Greeting)
private static final Greeting DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new Greeting();
}
public static Greeting getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<Greeting>
PARSER = new com.google.protobuf.AbstractParser<Greeting>() {
@Override
public Greeting parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new Greeting(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<Greeting> parser() {
return PARSER;
}
@Override
public com.google.protobuf.Parser<Greeting> getParserForType() {
return PARSER;
}
@Override
public Greeting getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
com.hong.spring.GreetingOrBuilder
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.spring;
public interface GreetingOrBuilder extends
// @@protoc_insertion_point(interface_extends:Greeting)
com.google.protobuf.MessageOrBuilder {
/**
* <code>string name = 1;</code>
*/
String getName();
/**
* <code>string name = 1;</code>
*/
com.google.protobuf.ByteString
getNameBytes();
}
com.hong.spring.HelloResp
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.spring;
/**
* Protobuf type {@code HelloResp}
*/
public final class HelloResp extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:HelloResp)
HelloRespOrBuilder {
private static final long serialVersionUID = 0L;
// Use HelloResp.newBuilder() to construct.
private HelloResp(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private HelloResp() {
reply_ = "";
}
@Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private HelloResp(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new NullPointerException();
}
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 10: {
String s = input.readStringRequireUtf8();
reply_ = s;
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_HelloResp_fieldAccessorTable
.ensureFieldAccessorsInitialized(
HelloResp.class, Builder.class);
}
public static final int REPLY_FIELD_NUMBER = 1;
private volatile Object reply_;
/**
* <code>string reply = 1;</code>
*/
public String getReply() {
Object ref = reply_;
if (ref instanceof String) {
return (String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
reply_ = s;
return s;
}
}
/**
* <code>string reply = 1;</code>
*/
public com.google.protobuf.ByteString
getReplyBytes() {
Object ref = reply_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
reply_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private byte memoizedIsInitialized = -1;
@Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (!getReplyBytes().isEmpty()) {
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, reply_);
}
unknownFields.writeTo(output);
}
@Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (!getReplyBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, reply_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof HelloResp)) {
return super.equals(obj);
}
HelloResp other = (HelloResp) obj;
if (!getReply()
.equals(other.getReply())) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + REPLY_FIELD_NUMBER;
hash = (53 * hash) + getReply().hashCode();
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static HelloResp parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static HelloResp parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static HelloResp parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static HelloResp parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static HelloResp parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static HelloResp parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(HelloResp prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code HelloResp}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:HelloResp)
HelloRespOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_HelloResp_fieldAccessorTable
.ensureFieldAccessorsInitialized(
HelloResp.class, Builder.class);
}
// Construct using HelloResp.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@Override
public Builder clear() {
super.clear();
reply_ = "";
return this;
}
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
public HelloResp getDefaultInstanceForType() {
return HelloResp.getDefaultInstance();
}
@Override
public HelloResp build() {
HelloResp result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@Override
public HelloResp buildPartial() {
HelloResp result = new HelloResp(this);
result.reply_ = reply_;
onBuilt();
return result;
}
@Override
public Builder clone() {
return super.clone();
}
@Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.setField(field, value);
}
@Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, Object value) {
return super.setRepeatedField(field, index, value);
}
@Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.addRepeatedField(field, value);
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof HelloResp) {
return mergeFrom((HelloResp)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(HelloResp other) {
if (other == HelloResp.getDefaultInstance()) return this;
if (!other.getReply().isEmpty()) {
reply_ = other.reply_;
onChanged();
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@Override
public final boolean isInitialized() {
return true;
}
@Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
HelloResp parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (HelloResp) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private Object reply_ = "";
/**
* <code>string reply = 1;</code>
*/
public String getReply() {
Object ref = reply_;
if (!(ref instanceof String)) {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
reply_ = s;
return s;
} else {
return (String) ref;
}
}
/**
* <code>string reply = 1;</code>
*/
public com.google.protobuf.ByteString
getReplyBytes() {
Object ref = reply_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
reply_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>string reply = 1;</code>
*/
public Builder setReply(
String value) {
if (value == null) {
throw new NullPointerException();
}
reply_ = value;
onChanged();
return this;
}
/**
* <code>string reply = 1;</code>
*/
public Builder clearReply() {
reply_ = getDefaultInstance().getReply();
onChanged();
return this;
}
/**
* <code>string reply = 1;</code>
*/
public Builder setReplyBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
reply_ = value;
onChanged();
return this;
}
@Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:HelloResp)
}
// @@protoc_insertion_point(class_scope:HelloResp)
private static final HelloResp DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new HelloResp();
}
public static HelloResp getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<HelloResp>
PARSER = new com.google.protobuf.AbstractParser<HelloResp>() {
@Override
public HelloResp parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new HelloResp(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<HelloResp> parser() {
return PARSER;
}
@Override
public com.google.protobuf.Parser<HelloResp> getParserForType() {
return PARSER;
}
@Override
public HelloResp getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
com.hong.spring.HelloRespOrBuilder
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.spring;
public interface HelloRespOrBuilder extends
// @@protoc_insertion_point(interface_extends:HelloResp)
com.google.protobuf.MessageOrBuilder {
/**
* <code>string reply = 1;</code>
*/
String getReply();
/**
* <code>string reply = 1;</code>
*/
com.google.protobuf.ByteString
getReplyBytes();
}
com.hong.spring.HelloWorldGrpc
package com.hong.spring;
import io.grpc.stub.ClientCalls;
import static io.grpc.MethodDescriptor.generateFullMethodName;
import static io.grpc.stub.ClientCalls.blockingUnaryCall;
import static io.grpc.stub.ClientCalls.futureUnaryCall;
import static io.grpc.stub.ServerCalls.asyncUnaryCall;
import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
/**
*/
@javax.annotation.Generated(
value = "by gRPC proto compiler (version 1.21.0)",
comments = "Source: hello_world.proto")
public final class HelloWorldGrpc {
private HelloWorldGrpc() {}
public static final String SERVICE_NAME = "HelloWorld";
// Static method descriptors that strictly reflect the proto.
private static volatile io.grpc.MethodDescriptor<com.hong.spring.Greeting,
com.hong.spring.HelloResp> getSayHelloMethod;
@io.grpc.stub.annotations.RpcMethod(
fullMethodName = SERVICE_NAME + '/' + "sayHello",
requestType = com.hong.spring.Greeting.class,
responseType = com.hong.spring.HelloResp.class,
methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
public static io.grpc.MethodDescriptor<com.hong.spring.Greeting,
com.hong.spring.HelloResp> getSayHelloMethod() {
io.grpc.MethodDescriptor<com.hong.spring.Greeting, com.hong.spring.HelloResp> getSayHelloMethod;
if ((getSayHelloMethod = HelloWorldGrpc.getSayHelloMethod) == null) {
synchronized (HelloWorldGrpc.class) {
if ((getSayHelloMethod = HelloWorldGrpc.getSayHelloMethod) == null) {
HelloWorldGrpc.getSayHelloMethod = getSayHelloMethod =
io.grpc.MethodDescriptor.<com.hong.spring.Greeting, com.hong.spring.HelloResp>newBuilder()
.setType(io.grpc.MethodDescriptor.MethodType.UNARY)
.setFullMethodName(generateFullMethodName(
"HelloWorld", "sayHello"))
.setSampledToLocalTracing(true)
.setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
com.hong.spring.Greeting.getDefaultInstance()))
.setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
com.hong.spring.HelloResp.getDefaultInstance()))
.setSchemaDescriptor(new HelloWorldMethodDescriptorSupplier("sayHello"))
.build();
}
}
}
return getSayHelloMethod;
}
/**
* Creates a new async stub that supports all call types for the service
*/
public static HelloWorldStub newStub(io.grpc.Channel channel) {
return new HelloWorldStub(channel);
}
/**
* Creates a new blocking-style stub that supports unary and streaming output calls on the service
*/
public static HelloWorldBlockingStub newBlockingStub(
io.grpc.Channel channel) {
return new HelloWorldBlockingStub(channel);
}
/**
* Creates a new ListenableFuture-style stub that supports unary calls on the service
*/
public static HelloWorldFutureStub newFutureStub(
io.grpc.Channel channel) {
return new HelloWorldFutureStub(channel);
}
/**
*/
public static abstract class HelloWorldImplBase implements io.grpc.BindableService {
/**
*/
public void sayHello(com.hong.spring.Greeting request,
io.grpc.stub.StreamObserver<com.hong.spring.HelloResp> responseObserver) {
asyncUnimplementedUnaryCall(getSayHelloMethod(), responseObserver);
}
@Override public final io.grpc.ServerServiceDefinition bindService() {
return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
.addMethod(
getSayHelloMethod(),
asyncUnaryCall(
new MethodHandlers<
com.hong.spring.Greeting,
com.hong.spring.HelloResp>(
this, METHODID_SAY_HELLO)))
.build();
}
}
/**
*/
public static final class HelloWorldStub extends io.grpc.stub.AbstractStub<HelloWorldStub> {
private HelloWorldStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldStub(channel, callOptions);
}
/**
*/
public void sayHello(com.hong.spring.Greeting request,
io.grpc.stub.StreamObserver<com.hong.spring.HelloResp> responseObserver) {
ClientCalls.asyncUnaryCall(
getChannel().newCall(getSayHelloMethod(), getCallOptions()), request, responseObserver);
}
}
/**
*/
public static final class HelloWorldBlockingStub extends io.grpc.stub.AbstractStub<HelloWorldBlockingStub> {
private HelloWorldBlockingStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldBlockingStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldBlockingStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldBlockingStub(channel, callOptions);
}
/**
*/
public com.hong.spring.HelloResp sayHello(com.hong.spring.Greeting request) {
return blockingUnaryCall(
getChannel(), getSayHelloMethod(), getCallOptions(), request);
}
}
/**
*/
public static final class HelloWorldFutureStub extends io.grpc.stub.AbstractStub<HelloWorldFutureStub> {
private HelloWorldFutureStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldFutureStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldFutureStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldFutureStub(channel, callOptions);
}
/**
*/
public com.google.common.util.concurrent.ListenableFuture<com.hong.spring.HelloResp> sayHello(
com.hong.spring.Greeting request) {
return futureUnaryCall(
getChannel().newCall(getSayHelloMethod(), getCallOptions()), request);
}
}
private static final int METHODID_SAY_HELLO = 0;
private static final class MethodHandlers<Req, Resp> implements
io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
private final HelloWorldImplBase serviceImpl;
private final int methodId;
MethodHandlers(HelloWorldImplBase serviceImpl, int methodId) {
this.serviceImpl = serviceImpl;
this.methodId = methodId;
}
@Override
@SuppressWarnings("unchecked")
public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
switch (methodId) {
case METHODID_SAY_HELLO:
serviceImpl.sayHello((com.hong.spring.Greeting) request,
(io.grpc.stub.StreamObserver<com.hong.spring.HelloResp>) responseObserver);
break;
default:
throw new AssertionError();
}
}
@Override
@SuppressWarnings("unchecked")
public io.grpc.stub.StreamObserver<Req> invoke(
io.grpc.stub.StreamObserver<Resp> responseObserver) {
switch (methodId) {
default:
throw new AssertionError();
}
}
}
private static abstract class HelloWorldBaseDescriptorSupplier
implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
HelloWorldBaseDescriptorSupplier() {}
@Override
public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
return com.hong.spring.HelloWorldProto.getDescriptor();
}
@Override
public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
return getFileDescriptor().findServiceByName("HelloWorld");
}
}
private static final class HelloWorldFileDescriptorSupplier
extends HelloWorldBaseDescriptorSupplier {
HelloWorldFileDescriptorSupplier() {}
}
private static final class HelloWorldMethodDescriptorSupplier
extends HelloWorldBaseDescriptorSupplier
implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
private final String methodName;
HelloWorldMethodDescriptorSupplier(String methodName) {
this.methodName = methodName;
}
@Override
public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
return getServiceDescriptor().findMethodByName(methodName);
}
}
private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
public static io.grpc.ServiceDescriptor getServiceDescriptor() {
io.grpc.ServiceDescriptor result = serviceDescriptor;
if (result == null) {
synchronized (HelloWorldGrpc.class) {
result = serviceDescriptor;
if (result == null) {
serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
.setSchemaDescriptor(new HelloWorldFileDescriptorSupplier())
.addMethod(getSayHelloMethod())
.build();
}
}
}
return result;
}
}
com.hong.spring.HelloWorldProto
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.spring;
public final class HelloWorldProto {
private HelloWorldProto() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
static final com.google.protobuf.Descriptors.Descriptor
internal_static_Greeting_descriptor;
static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_Greeting_fieldAccessorTable;
static final com.google.protobuf.Descriptors.Descriptor
internal_static_HelloResp_descriptor;
static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_HelloResp_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
String[] descriptorData = {
"\n\021hello_world.proto\"\030\n\010Greeting\022\014\n\004name\030" +
"\001 \001(\t\"\032\n\tHelloResp\022\r\n\005reply\030\001 \001(\t2/\n\nHel" +
"loWorld\022!\n\010sayHello\022\t.Greeting\032\n.HelloRe" +
"spB$\n\017com.hong.springB\017HelloWorldProtoP\001" +
"b\006proto3"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
}, assigner);
internal_static_Greeting_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_Greeting_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_Greeting_descriptor,
new String[] { "Name", });
internal_static_HelloResp_descriptor =
getDescriptor().getMessageTypes().get(1);
internal_static_HelloResp_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_HelloResp_descriptor,
new String[] { "Reply", });
}
// @@protoc_insertion_point(outer_class_scope)
}
spring_grpc_client grpc的客户端
com.hong.spring.contoller.UserController
package com.hong.spring.contoller;
import com.hong.spring.grpc.HelloWorldClient;
import com.hong.spring.utils.DataResponse;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: csh
* @Date: 2020/8/18 16:11
* @Description:
*/
@RestController
@RequestMapping("/")
@Log4j2
public class UserController {
@Autowired
private HelloWorldClient client;
@RequestMapping(value = "allUser",method = RequestMethod.GET)
@ResponseBody
public DataResponse<Boolean> sendMsg(String msg){
try {
String reply = client.sayHello("");
return DataResponse.BuildSuccessResponse(reply);
}catch (Exception e){
log.error("发送出错!{}",e);
}
return DataResponse.BuildFailResponse("发送出错!");
}
}
com.hong.spring.grpc.HelloWorldClient
package com.hong.spring.grpc;
import com.hong.spring.Greeting;
import com.hong.spring.HelloResp;
import com.hong.spring.HelloWorldGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
/**
*
* 功能描述: 客户端
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
public class HelloWorldClient {
private final HelloWorldGrpc.HelloWorldBlockingStub blockingStub;
/**
* @param host gRPC服务的主机名
* @param port gRPC服务的端口
*/
public HelloWorldClient(String host, int port) {
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port)
// 使用非安全机制传输
.usePlaintext()
.build();
blockingStub = HelloWorldGrpc.newBlockingStub(managedChannel);
}
public String sayHello(String name) {
Greeting greeting = Greeting.newBuilder()
.setName(name)
.build();
HelloResp resp = blockingStub.sayHello(greeting);
return resp.getReply();
}
}
相关配置
application.properties
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
applicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.hong.spring"></context:component-scan>
<!--加载配置文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name="locations">
<list>
<value>classpath:grpc.properties</value>
</list>
</property>
</bean>
<!-- 开启注解 -->
<context:annotation-config />
<mvc:default-servlet-handler />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/pages/" />
<!-- 后缀 -->
<property name="suffix" value=".html" />
<property name="contentType" value="text/html"/>
</bean>
<!--开启mvc注解事务-->
<!-- 定义注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 设置支持中文 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="client" class="com.hong.spring.grpc.HelloWorldClient" >
<constructor-arg name="host" value="${grpc.host}"/>
<constructor-arg name="port" value="${grpc.port}"/>
</bean>
</beans>
grpc.properties
#grpc服务端端口号
grpc.port=8081
#grpc的访问地址
grpc.host=localhost
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="5 MB"/>
</RollingFile>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
</root>
</loggers>
</configuration>
logging.properties
org.apache.catalina.core.ContainerBase.[Catalina].level=INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers=java.util.logging.ConsoleHandler
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ../logs
org.apache.juli.FileHandler.prefix = error-debug.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>spring_grpc_client</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>spring_grpc_client</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
tomcat配置
spring_grpc_server grpc的服务端
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring_rpc</artifactId>
<groupId>com.hong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.spring</groupId>
<artifactId>spring_grpc_server</artifactId>
<properties>
<!-- Message源文件输出目录 -->
<javaOutputDirectory>${project.basedir}/src/main/java/proto</javaOutputDirectory>
<!-- gRPC源文件输出目录 -->
<protocPluginOutputDirectory>${project.basedir}/src/main/java/grpc</protocPluginOutputDirectory>
<grpc.version>1.21.0</grpc.version>
</properties>
<dependencies>
<dependency>
<groupId>com.hong.spring</groupId>
<artifactId>spring_grpc_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<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.1</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:1.21.0:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>grpc_server</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-mybatis.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>grpc_server</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
相关配置
application.properties
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
applicationContext-mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.hong.spring"></context:component-scan>
<!--加载配置文件-->
<context:property-placeholder location="classpath:jdbc.properties,classpath:grpc.properties"/>
<!-- 开启注解 -->
<context:annotation-config />
<!--开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--放行静态资源-->
<mvc:default-servlet-handler />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/pages/" />
<!-- 后缀 -->
<property name="suffix" value=".html" />
<property name="contentType" value="text/html"/>
</bean>
<!--开启mvc注解事务-->
<!-- 定义注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 设置支持中文 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 基础配置 -->
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<!-- 关键配置 -->
<!-- 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 -->
<property name="initialSize" value="3" />
<!-- 最小连接池数量 -->
<property name="minIdle" value="2" />
<!-- 最大连接池数量 -->
<property name="maxActive" value="15" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="10000" />
<!-- 性能配置 -->
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 其他配置 -->
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,
执行validationQuery检测连接是否有效。-->
<property name="testWhileIdle" value="true" />
<!-- 这里建议配置为TRUE,防止取到的连接不可用 ,申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。-->
<property name="testOnBorrow" value="true" />
<!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 -->
<property name="testOnReturn" value="false" />
</bean>
<!--事务管理器-->
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载 MyBatis 的配置文件 -->
<property name="configLocation" value="classpath:mybatis.xml"/>
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 所有配置的mapper文件 -->
<property name="mapperLocations" value="classpath*:com/hong/spring/mapper/*.xml" />
</bean>
<!-- Mapper 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描 包下的组件 -->
<property name="basePackage" value="com.hong.spring.dao" />
<!-- 关联mapper扫描器 与 sqlsession管理器 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!--事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="SpringConfigTool" class="com.hong.spring.common.SpringContextUtils"/>
<bean id="grpcServer" class="com.hong.spring.grpc.GrpcServer" init-method="start" destroy-method="shutdown" >
<constructor-arg value="${grpc.port}"/>
</bean>
</beans>
grpc.properties
grpc.port=8081
jdbc.properties
config.properties:
#数据库驱动
jdbc.driver=com.mysql.jdbc.Driver
#数据库连接url
jdbc.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8
#数据库用户名
jdbc.user=root
#数据库密码
jdbc.password=123456
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="5 MB"/>
</RollingFile>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
</root>
</loggers>
</configuration>
logging.properties
org.apache.catalina.core.ContainerBase.[Catalina].level=INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers=java.util.logging.ConsoleHandler
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ../logs
org.apache.juli.FileHandler.prefix = error-debug.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- settings -->
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载(即按需加载) -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 打开全局缓存开关(二级缓存)默认值就是 true -->
<setting name="cacheEnabled" value="true"/>
<!-- 开启驼峰命名转换 Table(create_time) -> Entity(createtime) -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 使用列别名代替列名 默认:true seslect name as title from table -->
<setting name="useColumnLabel" value="true"/>
<!--使用jdbc的getGeneratedKeys获取数据库自增主键值-->
<setting name="useGeneratedKeys" value="true"/>
</settings>
<!-- 别名定义 -->
<typeAliases>
<package name="com.hong.spring.entity"/>
</typeAliases>
</configuration>
实现代码
com.hong.spring.common.GrpcService
package com.hong.spring.common;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
/**
*
* 功能描述: 自定义注解,用于获取Spring扫描到的类
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 17:36
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface GrpcService {
}
com.hong.spring.common.SpringContextUtils
package com.hong.spring.common;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext){
SpringContextUtils.applicationContext = applicationContext;
}
/**
* 获得spring上下文
* @return ApplicationContext spring上下文
*/
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
public static <T> T getBean(Class <T> requiredType) throws BeansException {
return applicationContext.getBean(requiredType);
}
}
com.hong.spring.dao.UserMapper
package com.hong.spring.dao;
import com.hong.spring.entity.User;
import com.hong.spring.entity.ao.UserAO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Auther: csh
* @Date: 2020/8/18 15:04
* @Description:用户dao层
*/
public interface UserMapper {
/**
*
* 功能描述:查询总条数
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/18 15:31
*/
List<User> findAllUserList();
/**
*
* 功能描述:获取总数
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/18 15:30
*/
int findAllTotal();
/**
*
* 功能描述:更新
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/18 15:30
*/
int update(User user);
/**
*
* 功能描述:添加
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/19 18:39
*/
int save(User user);
/**
*
* 功能描述:批量添加
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/21 15:46
*/
int insertBatch(@Param("list") List <User> list);
/**
*
* 功能描述:通过id查询
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/19 18:39
*/
User findById(int id);
/**
*
* 功能描述:通过分页查询
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/21 16:05
*/
List<User> findByPage(UserAO ao);
}
com.hong.spring.grpc.GrpcServer
package com.hong.spring.grpc;
import com.hong.spring.common.GrpcService;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import lombok.extern.log4j.Log4j2;
import java.io.IOException;
/**
*
* 功能描述: 服务端
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
@Log4j2
@GrpcService
public class GrpcServer {
private Server server;
private int port;
public GrpcServer(int port) {
this.port = port;
}
public void start() throws IOException, InterruptedException {
new Thread(()->{
//启动服务端
try {
ServerBuilder.forPort(port)
// 将具体实现的服务添加到gRPC服务中
.addService(new HelloWorldRpcService())
.build().start();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 添加服务端关闭的逻辑
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
log.info("Shutting down gRPC server.");
this.shutdown();
log.info("gRPC server shut down successfully.");
}));
//this.block();
}
public void shutdown() {
if (server != null) {
server.shutdown();
}
}
public void block() throws InterruptedException {
if (server != null) {
// 服务端启动后直到应用关闭都处于阻塞状态,方便接收请求
server.awaitTermination();
}
}
}
com.hong.spring.grpc.HelloWorldRpcService
package com.hong.spring.grpc;
import com.alibaba.fastjson.JSONObject;
import com.hong.spring.Greeting;
import com.hong.spring.HelloResp;
import com.hong.spring.HelloWorldGrpc;
import com.hong.spring.api.IUserService;
import com.hong.spring.common.SpringContextUtils;
import com.hong.spring.entity.User;
import com.hong.spring.utils.DataResponse;
import io.grpc.stub.StreamObserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
* 功能描述: 响应接口
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
@Service
public class HelloWorldRpcService extends HelloWorldGrpc.HelloWorldImplBase {
@Autowired
private IUserService userService;
@Override
public void sayHello(Greeting request, StreamObserver<HelloResp> responseObserver) {
IUserService bean = SpringContextUtils.getBean(IUserService.class);
DataResponse <List <User>> byAll = bean.findByAll();
HelloResp resp = HelloResp.newBuilder()
.setReply(JSONObject.toJSONString(byAll))
.build();
responseObserver.onNext(resp);
responseObserver.onCompleted();
}
}
com/hong/spring/mapper/UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hong.spring.dao.UserMapper">
<resultMap type="com.hong.spring.entity.User" id="user">
<id column="id" property="id" />
<result column="user_name" property="username" />
<result column="age" property="age" />
</resultMap>
<select id="findById" resultType="com.hong.spring.entity.User">
SELECT * FROM user WHERE id = #{id,jdbcType=INTEGER}
</select>
<select id="findByPage" resultMap="user" parameterType="com.hong.spring.entity.ao.UserAO">
select * from user where 1=1 limit #{page},#{pageSize}
</select>
<select id="findAllUserList" resultMap="user">
SELECT * FROM user
</select>
<select id="findAllTotal" resultType="int">
SELECT count(*) FROM user
</select>
<insert id="save" >
INSERT INTO user ( user_name, age)
VALUES (#{username,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER})
</insert>
<insert id="insertBatch">
insert into user
( user_name, age)
values
<foreach collection="list" item="user" index="index"
separator=",">
(#{user.username,jdbcType=VARCHAR},#{user.age,jdbcType=INTEGER})
</foreach>
</insert>
<update id="update" >
update user
<set>
<if test="username !=null">
user_name=#{username,jdbcType=VARCHAR},
</if>
<if test="age !=null">
age =#{age,jdbcType=INTEGER}
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
com.hong.spring.provider.UserServiceImpl
package com.hong.spring.provider;
import com.hong.spring.api.IUserService;
import com.hong.spring.common.GrpcService;
import com.hong.spring.dao.UserMapper;
import com.hong.spring.entity.User;
import com.hong.spring.entity.ao.UserAO;
import com.hong.spring.utils.DataResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @Auther: csh
* @Date: 2020/8/18 15:16
* @Description:用户实现
*/
@Service("userService")
@GrpcService
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userDao;
@Override
public DataResponse<List<User>> findByAll() {
List <User> allUserList = userDao.findAllUserList();
int allTotal = userDao.findAllTotal();
return DataResponse.BuildSuccessResponse(allUserList,allTotal);
}
@Override
@Transactional
public DataResponse <Boolean> save(User user) {
if(null==user){
return DataResponse.BuildFailResponse("必传参数不能为空!");
}
int save = userDao.save(user);
return DataResponse.BuildSuccessResponse(save>0?true:false);
}
@Override
public DataResponse <Boolean> insertBatch(List <User> list) {
if(null==list){
return DataResponse.BuildFailResponse("参数不能为空!");
}
int batchSave = userDao.insertBatch(list);
return DataResponse.BuildSuccessResponse(batchSave>0?true:false);
}
@Override
@Transactional
public DataResponse <Boolean> update(User user) {
if(null==user || user.getId()==null){
return DataResponse.BuildFailResponse("必传参数不能为空!");
}
int update = userDao.update(user);
return DataResponse.BuildSuccessResponse(update>0?true:false);
}
@Override
public DataResponse <User> findById(int i) {
User byId = userDao.findById(i);
return DataResponse.BuildSuccessResponse(byId);
}
@Override
public DataResponse <List <User>> findByPage(UserAO ao) {
if(ao==null){
ao.setPage(0);
ao.setPageSize(10);
}else{
ao.setPage(ao.getPageSize() * ao.getPage());
}
int allTotal = userDao.findAllTotal();
List <User> byPage = userDao.findByPage(ao);
return DataResponse.BuildSuccessResponse(byPage,allTotal);
}
}
运行服务端
16:34:19.153 [Thread-11] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled
16:34:19.153 [Thread-11] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0
16:34:19.154 [Thread-11] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384
一月 28, 2021 4:34:19 下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache
信息: Looking for @ControllerAdvice: WebApplicationContext for namespace 'grpc_server-servlet': startup date [Thu Jan 28 16:34:14 CST 2021]; root of context hierarchy
一月 28, 2021 4:34:20 下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache
信息: Looking for @ControllerAdvice: WebApplicationContext for namespace 'grpc_server-servlet': startup date [Thu Jan 28 16:34:14 CST 2021]; root of context hierarchy
一月 28, 2021 4:34:20 下午 org.springframework.web.servlet.DispatcherServlet initServletBean
信息: FrameworkServlet 'grpc_server': initialization completed in 5750 ms
[2021-01-28 04:34:20,357] Artifact spring_grpc_server:war exploded: Artifact is deployed successfully
[2021-01-28 04:34:20,357] Artifact spring_grpc_server:war exploded: Deploy took 13,154 milliseconds
28-Jan-2021 16:34:35.600 警告 [main] org.apache.catalina.core.StandardServer.await StandardServer.await: Invalid command '' received
运行客户端
unavailable prior to Java9
16:34:54.921 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.<init>(long, int): available
16:34:54.921 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available
16:34:54.922 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: D:\tools\apache-tomcat-8.5.33\temp (java.io.tmpdir)
16:34:54.922 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
16:34:54.928 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: 3793747968 bytes
16:34:54.929 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1
16:34:54.935 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.CleanerJava6 - java.nio.ByteBuffer.cleaner(): available
16:34:54.936 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
16:34:55.139 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 16
16:34:55.250 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
16:34:55.250 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
16:34:55.303 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available
一月 28, 2021 4:34:56 下午 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping registerHandler
信息: Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0'
一月 28, 2021 4:34:56 下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register
信息: Mapped "{[/allUser],methods=[GET]}" onto public com.hong.spring.utils.DataResponse<java.lang.Boolean> com.hong.spring.contoller.UserController.sendMsg(java.lang.String)
一月 28, 2021 4:34:57 下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache
信息: Looking for @ControllerAdvice: WebApplicationContext for namespace 'spring_grpc_client-servlet': startup date [Thu Jan 28 16:34:51 CST 2021]; root of context hierarchy
一月 28, 2021 4:34:57 下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache
信息: Looking for @ControllerAdvice: WebApplicationContext for namespace 'spring_grpc_client-servlet': startup date [Thu Jan 28 16:34:51 CST 2021]; root of context hierarchy
一月 28, 2021 4:34:57 下午 org.springframework.web.servlet.DispatcherServlet initServletBean
信息: FrameworkServlet 'spring_grpc_client': initialization completed in 6163 ms
[2021-01-28 04:34:57,929] Artifact spring_grpc_client:war exploded: Artifact is deployed successfully
[2021-01-28 04:34:57,929] Artifact spring_grpc_client:war exploded: Deploy took 14,582 milliseconds
请求:http://localhost:8082/allUser
结果
服务端
16:35:33.231 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllUserList - ==> Preparing: SELECT * FROM user
16:35:33.271 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllUserList - ==> Parameters:
16:35:33.304 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllUserList - <== Total: 45
16:35:33.310 [grpc-default-executor-0] DEBUG com.alibaba.druid.pool.PreparedStatementPool - stmt enter cache
16:35:33.311 [grpc-default-executor-0] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a43532]
16:35:33.313 [grpc-default-executor-0] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
16:35:33.313 [grpc-default-executor-0] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@413566bb] was not registered for synchronization because synchronization is not active
16:35:33.314 [grpc-default-executor-0] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@a0f3f55] will not be managed by Spring
16:35:33.314 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllTotal - ==> Preparing: SELECT count(*) FROM user
16:35:33.314 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllTotal - ==> Parameters:
16:35:33.315 [grpc-default-executor-0] DEBUG com.hong.spring.dao.UserMapper.findAllTotal - <== Total: 1
16:35:33.315 [grpc-default-executor-0] DEBUG com.alibaba.druid.pool.PreparedStatementPool - stmt enter cache
16:35:33.316 [grpc-default-executor-0] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@413566bb]
16:35:33.401 [grpc-nio-worker-ELG-3-1] DEBUG io.grpc.netty.NettyServerHandler - [id: 0xea14efee, L:/127.0.0.1:8081 - R:/127.0.0.1:65244] OUTBOUND HEADERS: streamId=3 headers=GrpcHttp2OutboundHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
16:35:33.493 [grpc-nio-worker-ELG-3-1] DEBUG io.grpc.netty.NettyServerHandler - [id: 0xea14efee, L:/127.0.0.1:8081 - R:/127.0.0.1:65244] OUTBOUND DATA: streamId=3 padding=0 endStream=false length=1964 bytes=00000007a70aa40f7b22636f6465223a302c2264617461223a5b7b22616765223a3130302c226964223a312c22757365726e616d65223a22333333227d2c7b22...
16:35:33.494 [grpc-nio-worker-ELG-3-1] DEBUG io.grpc.netty.NettyServerHandler - [id: 0xea14efee, L:/127.0.0.1:8081 - R:/127.0.0.1:65244] OUTBOUND HEADERS: streamId=3 headers=GrpcHttp2OutboundHeaders[grpc-status: 0] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
以上实现了客户端(spring整合grpc)去调用服务端(grpc调用spring)的bean获取数据然后通过grpc返回给客户端,再返回到http接口。目前了解没有相关的springmvc去整合grpc,这算是先例吧~~~
springboot实现gRPC
springboot_grpc_api 共用api
结构
│ pom.xml
│ springboot_grpc_api.iml
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─hong
│ │ └─springboot
│ │ ├─api
│ │ │ IUserService.java
│ │ │
│ │ ├─entity
│ │ │ │ User.java
│ │ │ │
│ │ │ └─ao
│ │ │ UserAO.java
│ │ │
│ │ ├─grpc
│ │ │ Greeting.java
│ │ │ GreetingOrBuilder.java
│ │ │ HelloResp.java
│ │ │ HelloRespOrBuilder.java
│ │ │ HelloWorldGrpc.java
│ │ │ HelloWorldProto.java
│ │ │
│ │ └─utils
│ │ DataResponse.java
│ │
│ └─resources
└─test
└─java
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>springboot_all</artifactId>
<groupId>com.hong.springboot</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_grpc_api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.10.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
com.hong.springboot.entity.ao.UserAO
package com.hong.springboot.entity.ao;
import java.io.Serializable;
/**
* @Auther: csh
* @Date: 2020/8/21 16:01
* @Description:用户分页参数
*/
public class UserAO implements Serializable {
/**
* 页码
*/
private Integer page;
/**
* 页条数
*/
private Integer pageSize;
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
com.hong.springboot.api.IUserService
package com.hong.springboot.api;
import com.hong.springboot.entity.User;
import com.hong.springboot.utils.DataResponse;
import java.util.List;
/**
* @author: csh
* @Date: 2021/1/5 16:32
* @Description:用户接口
*/
public interface IUserService {
/**
* 功能描述:查询全部
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/18 15:26
*/
DataResponse <List <User>> findByAll();
}
com.hong.springboot.grpc.HelloWorldProto
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.springboot.grpc;
public final class HelloWorldProto {
private HelloWorldProto() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
static final com.google.protobuf.Descriptors.Descriptor
internal_static_Greeting_descriptor;
static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_Greeting_fieldAccessorTable;
static final com.google.protobuf.Descriptors.Descriptor
internal_static_HelloResp_descriptor;
static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_HelloResp_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
String[] descriptorData = {
"\n\021hello_world.proto\"\030\n\010Greeting\022\014\n\004name\030" +
"\001 \001(\t\"\032\n\tHelloResp\022\r\n\005reply\030\001 \001(\t2/\n\nHel" +
"loWorld\022!\n\010sayHello\022\t.Greeting\032\n.HelloRe" +
"spB$\n\017com.hong.springB\017HelloWorldProtoP\001" +
"b\006proto3"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
}, assigner);
internal_static_Greeting_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_Greeting_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_Greeting_descriptor,
new String[] { "Name", });
internal_static_HelloResp_descriptor =
getDescriptor().getMessageTypes().get(1);
internal_static_HelloResp_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_HelloResp_descriptor,
new String[] { "Reply", });
}
// @@protoc_insertion_point(outer_class_scope)
}
com.hong.springboot.grpc.HelloResp
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.springboot.grpc;
/**
* Protobuf type {@code HelloResp}
*/
public final class HelloResp extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:HelloResp)
HelloRespOrBuilder {
private static final long serialVersionUID = 0L;
// Use HelloResp.newBuilder() to construct.
private HelloResp(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private HelloResp() {
reply_ = "";
}
@Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private HelloResp(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new NullPointerException();
}
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 10: {
String s = input.readStringRequireUtf8();
reply_ = s;
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_HelloResp_fieldAccessorTable
.ensureFieldAccessorsInitialized(
HelloResp.class, Builder.class);
}
public static final int REPLY_FIELD_NUMBER = 1;
private volatile Object reply_;
/**
* <code>string reply = 1;</code>
*/
public String getReply() {
Object ref = reply_;
if (ref instanceof String) {
return (String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
reply_ = s;
return s;
}
}
/**
* <code>string reply = 1;</code>
*/
public com.google.protobuf.ByteString
getReplyBytes() {
Object ref = reply_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
reply_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private byte memoizedIsInitialized = -1;
@Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (!getReplyBytes().isEmpty()) {
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, reply_);
}
unknownFields.writeTo(output);
}
@Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (!getReplyBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, reply_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof HelloResp)) {
return super.equals(obj);
}
HelloResp other = (HelloResp) obj;
if (!getReply()
.equals(other.getReply())) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + REPLY_FIELD_NUMBER;
hash = (53 * hash) + getReply().hashCode();
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static HelloResp parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static HelloResp parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static HelloResp parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static HelloResp parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static HelloResp parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static HelloResp parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static HelloResp parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static HelloResp parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(HelloResp prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@Override
protected Builder newBuilderForType(
BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code HelloResp}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:HelloResp)
HelloRespOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_HelloResp_fieldAccessorTable
.ensureFieldAccessorsInitialized(
HelloResp.class, Builder.class);
}
// Construct using HelloResp.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@Override
public Builder clear() {
super.clear();
reply_ = "";
return this;
}
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return HelloWorldProto.internal_static_HelloResp_descriptor;
}
@Override
public HelloResp getDefaultInstanceForType() {
return HelloResp.getDefaultInstance();
}
@Override
public HelloResp build() {
HelloResp result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@Override
public HelloResp buildPartial() {
HelloResp result = new HelloResp(this);
result.reply_ = reply_;
onBuilt();
return result;
}
@Override
public Builder clone() {
return super.clone();
}
@Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.setField(field, value);
}
@Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, Object value) {
return super.setRepeatedField(field, index, value);
}
@Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.addRepeatedField(field, value);
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof HelloResp) {
return mergeFrom((HelloResp)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(HelloResp other) {
if (other == HelloResp.getDefaultInstance()) return this;
if (!other.getReply().isEmpty()) {
reply_ = other.reply_;
onChanged();
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@Override
public final boolean isInitialized() {
return true;
}
@Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
HelloResp parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (HelloResp) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private Object reply_ = "";
/**
* <code>string reply = 1;</code>
*/
public String getReply() {
Object ref = reply_;
if (!(ref instanceof String)) {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
reply_ = s;
return s;
} else {
return (String) ref;
}
}
/**
* <code>string reply = 1;</code>
*/
public com.google.protobuf.ByteString
getReplyBytes() {
Object ref = reply_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
reply_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>string reply = 1;</code>
*/
public Builder setReply(
String value) {
if (value == null) {
throw new NullPointerException();
}
reply_ = value;
onChanged();
return this;
}
/**
* <code>string reply = 1;</code>
*/
public Builder clearReply() {
reply_ = getDefaultInstance().getReply();
onChanged();
return this;
}
/**
* <code>string reply = 1;</code>
*/
public Builder setReplyBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
reply_ = value;
onChanged();
return this;
}
@Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:HelloResp)
}
// @@protoc_insertion_point(class_scope:HelloResp)
private static final HelloResp DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new HelloResp();
}
public static HelloResp getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<HelloResp>
PARSER = new com.google.protobuf.AbstractParser<HelloResp>() {
@Override
public HelloResp parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new HelloResp(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<HelloResp> parser() {
return PARSER;
}
@Override
public com.google.protobuf.Parser<HelloResp> getParserForType() {
return PARSER;
}
@Override
public HelloResp getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
com.hong.springboot.utils.DataResponse
package com.hong.springboot.utils;
import java.io.Serializable;
/**
* 功能描述:返回工具类
*
* @param:
* @return:
* @auther: csh
* @date: 2020/8/18 15:15
*/
public class DataResponse<T> implements Serializable {
/**
* 默认为0
*/
public static final Integer SUCCESS = 0;
/**
* 错误标识
*/
public static final Integer FAIL = 1;
/**
* 编码
*/
private int code;
/**
* 返回消息
*/
private String msg;
/**
* 数据
*/
private T data;
/**
* 总条数
*/
private int total;
public DataResponse() {
this.code = SUCCESS;
}
public DataResponse(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public DataResponse(Integer code, String msg, Boolean isNeedTry) {
this.code = code;
this.msg = msg;
}
public DataResponse(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public DataResponse(Integer code, String msg, T data, Boolean isNeedTry) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static DataResponse BuildFailResponse() {
return BuildFailResponse((String) null);
}
public static DataResponse BuildFailResponse(String msg) {
return BuildFailResponse(msg, (Object) null);
}
public static <T> DataResponse BuildFailResponse(String msg, T data) {
DataResponse rtv = new DataResponse();
rtv.setCode(FAIL);
rtv.setMsg(msg);
rtv.setData(data);
return rtv;
}
public static DataResponse BuildSuccessResponse() {
return BuildSuccessResponse((Object) null);
}
public static <T> DataResponse BuildSuccessResponse(T data) {
DataResponse rtv = new DataResponse();
rtv.setCode(SUCCESS);
rtv.setData(data);
return rtv;
}
public static <T> DataResponse BuildSuccessResponse(T data, int total) {
DataResponse rtv = new DataResponse();
rtv.setCode(SUCCESS);
rtv.setTotal(total);
rtv.setData(data);
return rtv;
}
public Integer getCode() {
return this.code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getData() {
return this.data;
}
public void setData(T data) {
this.data = data;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public void setTotal(int total) {
this.total = total;
}
public int getTotal() {
return total;
}
}
com.hong.springboot.grpc.GreetingOrBuilder
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.springboot.grpc;
public interface GreetingOrBuilder extends
// @@protoc_insertion_point(interface_extends:Greeting)
com.google.protobuf.MessageOrBuilder {
/**
* <code>string name = 1;</code>
*/
String getName();
/**
* <code>string name = 1;</code>
*/
com.google.protobuf.ByteString
getNameBytes();
}
com.hong.springboot.grpc.Greeting
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.springboot.grpc;
/**
* Protobuf type {@code Greeting}
*/
public final class Greeting extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:Greeting)
GreetingOrBuilder {
private static final long serialVersionUID = 0L;
// Use Greeting.newBuilder() to construct.
private Greeting(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private Greeting() {
name_ = "";
}
@Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private Greeting(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new NullPointerException();
}
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 10: {
String s = input.readStringRequireUtf8();
name_ = s;
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_Greeting_fieldAccessorTable
.ensureFieldAccessorsInitialized(
Greeting.class, Builder.class);
}
public static final int NAME_FIELD_NUMBER = 1;
private volatile Object name_;
/**
* <code>string name = 1;</code>
*/
public String getName() {
Object ref = name_;
if (ref instanceof String) {
return (String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
name_ = s;
return s;
}
}
/**
* <code>string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
Object ref = name_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
name_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private byte memoizedIsInitialized = -1;
@Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (!getNameBytes().isEmpty()) {
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
}
unknownFields.writeTo(output);
}
@Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (!getNameBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Greeting)) {
return super.equals(obj);
}
Greeting other = (Greeting) obj;
if (!getName()
.equals(other.getName())) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + NAME_FIELD_NUMBER;
hash = (53 * hash) + getName().hashCode();
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static Greeting parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static Greeting parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static Greeting parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static Greeting parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static Greeting parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static Greeting parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static Greeting parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static Greeting parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(Greeting prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@Override
protected Builder newBuilderForType(
BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code Greeting}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:Greeting)
GreetingOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
return HelloWorldProto.internal_static_Greeting_fieldAccessorTable
.ensureFieldAccessorsInitialized(
Greeting.class, Builder.class);
}
// Construct using Greeting.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@Override
public Builder clear() {
super.clear();
name_ = "";
return this;
}
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return HelloWorldProto.internal_static_Greeting_descriptor;
}
@Override
public Greeting getDefaultInstanceForType() {
return Greeting.getDefaultInstance();
}
@Override
public Greeting build() {
Greeting result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@Override
public Greeting buildPartial() {
Greeting result = new Greeting(this);
result.name_ = name_;
onBuilt();
return result;
}
@Override
public Builder clone() {
return super.clone();
}
@Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.setField(field, value);
}
@Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, Object value) {
return super.setRepeatedField(field, index, value);
}
@Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
Object value) {
return super.addRepeatedField(field, value);
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof Greeting) {
return mergeFrom((Greeting)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(Greeting other) {
if (other == Greeting.getDefaultInstance()) return this;
if (!other.getName().isEmpty()) {
name_ = other.name_;
onChanged();
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@Override
public final boolean isInitialized() {
return true;
}
@Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
Greeting parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (Greeting) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private Object name_ = "";
/**
* <code>string name = 1;</code>
*/
public String getName() {
Object ref = name_;
if (!(ref instanceof String)) {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
name_ = s;
return s;
} else {
return (String) ref;
}
}
/**
* <code>string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
Object ref = name_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(String) ref);
name_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>string name = 1;</code>
*/
public Builder setName(
String value) {
if (value == null) {
throw new NullPointerException();
}
name_ = value;
onChanged();
return this;
}
/**
* <code>string name = 1;</code>
*/
public Builder clearName() {
name_ = getDefaultInstance().getName();
onChanged();
return this;
}
/**
* <code>string name = 1;</code>
*/
public Builder setNameBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
name_ = value;
onChanged();
return this;
}
@Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:Greeting)
}
// @@protoc_insertion_point(class_scope:Greeting)
private static final Greeting DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new Greeting();
}
public static Greeting getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<Greeting>
PARSER = new com.google.protobuf.AbstractParser<Greeting>() {
@Override
public Greeting parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new Greeting(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<Greeting> parser() {
return PARSER;
}
@Override
public com.google.protobuf.Parser<Greeting> getParserForType() {
return PARSER;
}
@Override
public Greeting getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
com.hong.springboot.grpc.HelloRespOrBuilder
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello_world.proto
package com.hong.springboot.grpc;
public interface HelloRespOrBuilder extends
// @@protoc_insertion_point(interface_extends:HelloResp)
com.google.protobuf.MessageOrBuilder {
/**
* <code>string reply = 1;</code>
*/
String getReply();
/**
* <code>string reply = 1;</code>
*/
com.google.protobuf.ByteString
getReplyBytes();
}
com.hong.springboot.entity.User
package com.hong.springboot.entity;
import java.io.Serializable;
/**
* @Auther: csh
* @Date: 2020/8/3 18:12
* @Description:用户实体
*/
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
com.hong.springboot.grpc.HelloWorldGrpc
package com.hong.springboot.grpc;
import io.grpc.stub.ClientCalls;
import static io.grpc.MethodDescriptor.generateFullMethodName;
import static io.grpc.stub.ClientCalls.blockingUnaryCall;
import static io.grpc.stub.ClientCalls.futureUnaryCall;
import static io.grpc.stub.ServerCalls.asyncUnaryCall;
import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
/**
*/
@javax.annotation.Generated(
value = "by gRPC proto compiler (version 1.21.0)",
comments = "Source: hello_world.proto")
public final class HelloWorldGrpc {
private HelloWorldGrpc() {}
public static final String SERVICE_NAME = "HelloWorld";
// Static method descriptors that strictly reflect the proto.
private static volatile io.grpc.MethodDescriptor<Greeting, HelloResp> getSayHelloMethod;
@io.grpc.stub.annotations.RpcMethod(
fullMethodName = SERVICE_NAME + '/' + "sayHello",
requestType = Greeting.class,
responseType = HelloResp.class,
methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
public static io.grpc.MethodDescriptor<Greeting,
HelloResp> getSayHelloMethod() {
io.grpc.MethodDescriptor<Greeting, HelloResp> getSayHelloMethod;
if ((getSayHelloMethod = HelloWorldGrpc.getSayHelloMethod) == null) {
synchronized (HelloWorldGrpc.class) {
if ((getSayHelloMethod = HelloWorldGrpc.getSayHelloMethod) == null) {
HelloWorldGrpc.getSayHelloMethod = getSayHelloMethod =
io.grpc.MethodDescriptor.<Greeting, HelloResp>newBuilder()
.setType(io.grpc.MethodDescriptor.MethodType.UNARY)
.setFullMethodName(generateFullMethodName(
"HelloWorld", "sayHello"))
.setSampledToLocalTracing(true)
.setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
Greeting.getDefaultInstance()))
.setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
HelloResp.getDefaultInstance()))
.setSchemaDescriptor(new HelloWorldMethodDescriptorSupplier("sayHello"))
.build();
}
}
}
return getSayHelloMethod;
}
/**
* Creates a new async stub that supports all call types for the service
*/
public static HelloWorldStub newStub(io.grpc.Channel channel) {
return new HelloWorldStub(channel);
}
/**
* Creates a new blocking-style stub that supports unary and streaming output calls on the service
*/
public static HelloWorldBlockingStub newBlockingStub(
io.grpc.Channel channel) {
return new HelloWorldBlockingStub(channel);
}
/**
* Creates a new ListenableFuture-style stub that supports unary calls on the service
*/
public static HelloWorldFutureStub newFutureStub(
io.grpc.Channel channel) {
return new HelloWorldFutureStub(channel);
}
/**
*/
public static abstract class HelloWorldImplBase implements io.grpc.BindableService {
/**
*/
public void sayHello(Greeting request,
io.grpc.stub.StreamObserver<HelloResp> responseObserver) {
asyncUnimplementedUnaryCall(getSayHelloMethod(), responseObserver);
}
@Override public final io.grpc.ServerServiceDefinition bindService() {
return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
.addMethod(
getSayHelloMethod(),
asyncUnaryCall(
new MethodHandlers<
Greeting,
HelloResp>(
this, METHODID_SAY_HELLO)))
.build();
}
}
/**
*/
public static final class HelloWorldStub extends io.grpc.stub.AbstractStub<HelloWorldStub> {
private HelloWorldStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldStub(channel, callOptions);
}
/**
*/
public void sayHello(Greeting request,
io.grpc.stub.StreamObserver<HelloResp> responseObserver) {
ClientCalls.asyncUnaryCall(
getChannel().newCall(getSayHelloMethod(), getCallOptions()), request, responseObserver);
}
}
/**
*/
public static final class HelloWorldBlockingStub extends io.grpc.stub.AbstractStub<HelloWorldBlockingStub> {
private HelloWorldBlockingStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldBlockingStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldBlockingStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldBlockingStub(channel, callOptions);
}
/**
*/
public HelloResp sayHello(Greeting request) {
return blockingUnaryCall(
getChannel(), getSayHelloMethod(), getCallOptions(), request);
}
}
/**
*/
public static final class HelloWorldFutureStub extends io.grpc.stub.AbstractStub<HelloWorldFutureStub> {
private HelloWorldFutureStub(io.grpc.Channel channel) {
super(channel);
}
private HelloWorldFutureStub(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldFutureStub build(io.grpc.Channel channel,
io.grpc.CallOptions callOptions) {
return new HelloWorldFutureStub(channel, callOptions);
}
/**
*/
public com.google.common.util.concurrent.ListenableFuture<HelloResp> sayHello(
Greeting request) {
return futureUnaryCall(
getChannel().newCall(getSayHelloMethod(), getCallOptions()), request);
}
}
private static final int METHODID_SAY_HELLO = 0;
private static final class MethodHandlers<Req, Resp> implements
io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
private final HelloWorldImplBase serviceImpl;
private final int methodId;
MethodHandlers(HelloWorldImplBase serviceImpl, int methodId) {
this.serviceImpl = serviceImpl;
this.methodId = methodId;
}
@Override
@SuppressWarnings("unchecked")
public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
switch (methodId) {
case METHODID_SAY_HELLO:
serviceImpl.sayHello((Greeting) request,
(io.grpc.stub.StreamObserver<HelloResp>) responseObserver);
break;
default:
throw new AssertionError();
}
}
@Override
@SuppressWarnings("unchecked")
public io.grpc.stub.StreamObserver<Req> invoke(
io.grpc.stub.StreamObserver<Resp> responseObserver) {
switch (methodId) {
default:
throw new AssertionError();
}
}
}
private static abstract class HelloWorldBaseDescriptorSupplier
implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
HelloWorldBaseDescriptorSupplier() {}
@Override
public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
return HelloWorldProto.getDescriptor();
}
@Override
public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
return getFileDescriptor().findServiceByName("HelloWorld");
}
}
private static final class HelloWorldFileDescriptorSupplier
extends HelloWorldBaseDescriptorSupplier {
HelloWorldFileDescriptorSupplier() {}
}
private static final class HelloWorldMethodDescriptorSupplier
extends HelloWorldBaseDescriptorSupplier
implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
private final String methodName;
HelloWorldMethodDescriptorSupplier(String methodName) {
this.methodName = methodName;
}
@Override
public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
return getServiceDescriptor().findMethodByName(methodName);
}
}
private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
public static io.grpc.ServiceDescriptor getServiceDescriptor() {
io.grpc.ServiceDescriptor result = serviceDescriptor;
if (result == null) {
synchronized (HelloWorldGrpc.class) {
result = serviceDescriptor;
if (result == null) {
serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
.setSchemaDescriptor(new HelloWorldFileDescriptorSupplier())
.addMethod(getSayHelloMethod())
.build();
}
}
}
return result;
}
}
springboot_grpc_client 用户端
结构
│ pom.xml
│
└─src
└─main
├─java
│ └─com
│ └─hong
│ └─springboot
│ │ Application.java
│ │
│ ├─common
│ │ GrpcClientUtils.java
│ │ HelloWorldClient.java
│ │
│ └─controller
│ UserController.java
│
└─resources
application.properties
com.hong.springboot.common.HelloWorldClient
package com.hong.springboot.common;
import com.hong.springboot.grpc.Greeting;
import com.hong.springboot.grpc.HelloResp;
import com.hong.springboot.grpc.HelloWorldGrpc;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;
/**
*
* 功能描述: 客户端
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
@Service
public class HelloWorldClient {
@GrpcClient("hong-grpc-client")
private HelloWorldGrpc.HelloWorldBlockingStub blockingStub;
public String sayHello(String name) {
Greeting greeting = Greeting.newBuilder()
.setName(name)
.build();
HelloResp resp = blockingStub.sayHello(greeting);
return resp.getReply();
}
}
com.hong.springboot.controller.UserController
package com.hong.springboot.controller;
import com.hong.springboot.common.HelloWorldClient;
import com.hong.springboot.utils.DataResponse;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: csh
* @Date: 2020/8/18 16:11
* @Description:
*/
@RestController
@RequestMapping("/")
@Log4j2
public class UserController {
@Autowired
private HelloWorldClient helloWorldClient;
@RequestMapping(value = "", method = RequestMethod.GET)
@ResponseBody
public DataResponse <Boolean> sendMsg(String msg) {
try {
log.info("请求进来了{}", msg);
String test= helloWorldClient.sayHello("测试");
return DataResponse.BuildSuccessResponse(test);
} catch (Exception e) {
log.error("发送出错!{}", e);
}
return DataResponse.BuildFailResponse("发送出错!");
}
}
com.hong.springboot.Application
package com.hong.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author: csh
* @Date: 2020/11/21 11:37
* @Description:springboot
*/
@SpringBootApplication(scanBasePackages = "com.hong.springboot")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
application.properties
#避免端口冲突
server.port=8087
#注意这个hong-grpc-client就是下面配置的名称!!!
spring.application.name=hong-grpc-client
#禁用传输层安全(https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/client/security.html)
grpc.client.hong-grpc-client.negotiationType=PLAINTEXT
#grpc服务地址配置(https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/client/configuration.html#configuration-via-properties)
grpc.client.hong-grpc-client.address=static://localhost:9090
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_all</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_grpc_client</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.api.grpc</groupId>
<artifactId>proto-google-common-protos</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_grpc_api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>2.10.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--静态资源导出问题-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
springboot_grpc_service 服务端
项目结构
│ pom.xml
│
└─src
└─main
├─java
│ └─com
│ └─hong
│ └─springboot
│ │ Application.java
│ │
│ ├─config
│ │ DruidConfig.java
│ │
│ ├─dao
│ │ UserMapper.java
│ │
│ ├─grpc
│ │ GrpcConfig.java
│ │ HelloWorldRpcService.java
│ │
│ └─provider
│ UserServiceImpl.java
│
├─proto
│ hello_world.proto
│
└─resources
application.properties
com.hong.springboot.config.DruidConfig
/**
* @author: csh
* @Date: 2021/1/8 18:08
* @Description:数据源配置
*/
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
}
com.hong.springboot.dao.UserMapper
package com.hong.springboot.dao;
import com.hong.springboot.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @Auther: csh
* @Date: 2020/8/18 15:04
* @Description:用户dao层
*/
public interface UserMapper {
@Select("select id,user_name,age from user")
List <User> findAllUser();
}
com.hong.springboot.grpc.GrpcConfig
package com.hong.springboot.grpc;
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
import net.devh.boot.grpc.server.serverfactory.GrpcServerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
* @author: csh
* @Date: 2021/1/28 17:14
* @Description:grcp配置
*/
@Configuration
public class GrpcConfig {
@Bean
public GrpcServerConfigurer keepAliveServerConfigurer() {
return serverBuilder -> {
if (serverBuilder instanceof NettyServerBuilder) {
((NettyServerBuilder) serverBuilder)
.keepAliveTime(30, TimeUnit.SECONDS)
.keepAliveTimeout(5, TimeUnit.SECONDS)
.permitKeepAliveWithoutCalls(true);
}
};
}
}
com.hong.springboot.grpc.HelloWorldRpcService
package com.hong.springboot.grpc;
import com.alibaba.fastjson.JSONObject;
import com.hong.springboot.api.IUserService;
import com.hong.springboot.entity.User;
import com.hong.springboot.utils.DataResponse;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
*
* 功能描述: 响应接口
*
* @param:
* @return:
* @auther: csh
* @date: 2021/1/27 11:45
*/
@GrpcService
public class HelloWorldRpcService extends HelloWorldGrpc.HelloWorldImplBase {
@Autowired
private IUserService userService;
@Override
public void sayHello(Greeting request, StreamObserver<HelloResp> responseObserver) {
DataResponse<List <User>> byAll = userService.findByAll();
HelloResp resp = HelloResp.newBuilder()
.setReply(JSONObject.toJSONString(byAll))
.build();
responseObserver.onNext(resp);
responseObserver.onCompleted();
}
}
com.hong.springboot.provider.UserServiceImpl
package com.hong.springboot.provider;
import com.hong.springboot.api.IUserService;
import com.hong.springboot.dao.UserMapper;
import com.hong.springboot.entity.User;
import com.hong.springboot.utils.DataResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Auther: csh
* @Date: 2020/8/18 15:16
* @Description:用户实现
*/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userDao;
@Override
public DataResponse <List <User>> findByAll() {
List <User> allUserList = userDao.findAllUser();
return DataResponse.BuildSuccessResponse(allUserList, allUserList.size());
}
}
com.hong.springboot.Application
package com.hong.springboot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author: csh
* @Date: 2020/11/21 11:37
* @Description:
*/
@SpringBootApplication(scanBasePackages = "com.hong.springboot")
@MapperScan("com.hong.springboot.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
application.properties
#避免端口冲突
server.port=8085
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
#mybatis配置
mybatis.typeAliasesPackage=com.hong.springboot.entity
#grpc端口配
grpc.server.port=9090
spring.application.name=hong-grpc-server
grpc.server.hong-grpc-server.negotiationType=TLS
grpc.client.hong-grpc-client.negotiationType=PLAINTEXT
springboot_all/springboot_grpc_service/src/main/proto/hello_world.proto
syntax = "proto3";
option java_package = "com.hong.spring";
option java_multiple_files = true;
option java_outer_classname = "HelloWorldProto";
message Greeting {
string name = 1;
}
message HelloResp {
string reply = 1;
}
service HelloWorld {
rpc sayHello (Greeting) returns (HelloResp);
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_all</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_grpc_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.hong.springboot</groupId>
<artifactId>springboot_grpc_api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--静态资源导出问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
先启动服务端再启动客户端请求:http://localhost:8087/
结果如下
参考文章:
http://www.hushowly.com/articles/1565
总结:关于springmvc的整合整个互联网基本没有先例,而springboot整合gRPC国内很多文章真的坑好大,乱写乱来的,导致各种坑,所以希望各位一定报着负责的态度~~以后有写文章以定有头有尾~~最少tm也得跑得起来吧~
最后
gRPC在国内各大平台用得不多,寻问了各大厂或其他中小厂朋友了解所知好多都是为了与另外的语言交互而使用,这可能也是这个神器一大特性。还有gRPC基于HTTP2,不是1.2合是2,很大区别。
当然了这个虽然说是rpc但其实没有注册中心,只是实现了跨平台多语言服务之间的调用,但可能也是因为这种比较直接调用所以性能非常高。当然本文只是使用,更我还是需要根据实际场景选择合适RPC。
建议还是看官网:https://grpc.io/
本人工作之余,长期在线答疑解惑(仅针对新手,高手请略过...)