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:
@@ -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();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user