GH-750 Add support for pluggable protobufs

This initial support adds plugin extension to support CloudEvent proto as well as the example
Additional plugins could be provided in the same ay as CloudEvent plugin extension

Resolves #750
This commit is contained in:
Oleg Zhurakousky
2021-10-11 14:03:24 +02:00
parent 346ff53539
commit 7fc755e157
41 changed files with 2659 additions and 312 deletions

View File

@@ -0,0 +1,65 @@
package com.example.grpc.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.function.grpc.MessagingServiceGrpc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
import com.google.protobuf.Descriptors.FileDescriptor;
import com.google.protobuf.ProtocolStringList;
import io.cloudevents.v1.CloudEventServiceGrpc;
import io.cloudevents.v1.proto.CloudEvent;
import io.cloudevents.v1.proto.CloudEvent.CloudEventAttributeValue;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
@SpringBootApplication
public class DemoGrpcApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoGrpcApplication.class, args);
CloudEvent cloudEvent = CloudEvent.newBuilder()
.setTextData("{\"event_name\":\"SCF supports CloudEvent gRPC\"}")
.setSource("http://springsource.com")
.setId("12345")
.setSpecVersion("1.0")
.setType("org.springframework")
.putAttributes("name", CloudEventAttributeValue.newBuilder().setCeString("oleg").build())
.putAttributes("fluent_in_french", CloudEventAttributeValue.newBuilder().setCeBoolean(false).build())
.build();
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 6048)
.usePlaintext().build();
CloudEventServiceGrpc.CloudEventServiceBlockingStub stub = CloudEventServiceGrpc.newBlockingStub(channel);
CloudEvent reply = stub.requestReply(cloudEvent);
System.out.println(reply);
}
@Bean
public Function<Message<String>, Message<String>> uppercase() {
return message -> {
return MessageBuilder.withPayload(message.getPayload().toUpperCase())
.copyHeaders(message.getHeaders())
.setHeader("uppercased", "true")
.build();
};
}
}

View File

@@ -0,0 +1,49 @@
syntax = "proto3";
package io.cloudevents.v1;
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";
option go_package = "cloudevents.io/genproto/v1";
option java_package = "io.cloudevents.v1.proto";
option java_multiple_files = true;
message CloudEvent {
// -- CloudEvent Context Attributes
// Required Attributes
string id = 1;
string source = 2; // URI-reference
string spec_version = 3;
string type = 4;
// Optional & Extension Attributes
map<string, CloudEventAttributeValue> attributes = 5;
// -- CloudEvent Data (Bytes, Text, or Proto)
oneof data {
bytes binary_data = 6;
string text_data = 7;
google.protobuf.Any proto_data = 8;
}
/**
* The CloudEvent specification defines
* seven attribute value types...
*/
message CloudEventAttributeValue {
oneof attr {
bool ce_boolean = 1;
int32 ce_integer = 2;
string ce_string = 3;
bytes ce_bytes = 4;
string ce_uri = 5;
string ce_uri_ref = 6;
google.protobuf.Timestamp ce_timestamp = 7;
}
}
}

View File

@@ -0,0 +1,17 @@
syntax = "proto3";
package io.cloudevents.v1;
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";
import "CloudEvent.proto";
service CloudEventService {
rpc biStream(stream io.cloudevents.v1.CloudEvent) returns (stream io.cloudevents.v1.CloudEvent);
rpc clientStream(stream io.cloudevents.v1.CloudEvent) returns (io.cloudevents.v1.CloudEvent);
rpc serverStream(io.cloudevents.v1.CloudEvent) returns (stream io.cloudevents.v1.CloudEvent);
rpc requestReply(io.cloudevents.v1.CloudEvent) returns (io.cloudevents.v1.CloudEvent);
}

View File

@@ -0,0 +1,13 @@
package com.example.grpc.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoGrpcApplicationTests {
@Test
void contextLoads() {
}
}