Moving cruftier services that are only used for tests under a test repo

This commit is contained in:
Janos Dobronszki
2020-10-15 16:54:27 +02:00
parent 7c2f9737cb
commit d86531e5e9
37 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
# Blob Store
A service which demonstrates how to read and write from the blob store

41
test/blob-store/main.go Normal file
View File

@@ -0,0 +1,41 @@
package main
import (
"bytes"
"io/ioutil"
"github.com/google/uuid"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
"github.com/micro/micro/v3/service/store"
)
func main() {
service.New(
service.Name("blob-store"),
service.Version("latest"),
)
key := uuid.New().String()
buf := bytes.NewBuffer([]byte("world"))
if err := store.DefaultBlobStore.Write(key, buf); err != nil {
logger.Fatalf("Error writing to blob store: %v", err)
} else {
logger.Infof("Write okay")
}
res, err := store.DefaultBlobStore.Read(key)
if err != nil {
logger.Fatalf("Error reading from the blog store: %v", err)
}
bytes, err := ioutil.ReadAll(res)
if err != nil {
logger.Fatalf("Error reading result: %v", err)
}
logger.Infof("Read from blob store: %v", string(bytes))
if err := store.DefaultBlobStore.Delete(key); err != nil {
logger.Fatalf("Error deleting from blob store: %v", err)
}
}

3
test/conf/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Conf
A service which demonstrates how to read and write config

59
test/conf/main.go Normal file
View File

@@ -0,0 +1,59 @@
package main
import (
"fmt"
"time"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/config"
)
type keyConfig struct {
Subkey string `json:"subkey"`
Subkey1 int `json:"subkey1"`
Subkey2 string `json:"subkey2"`
}
type conf struct {
Key keyConfig `json:"key"`
}
func main() {
// get a value
go func() {
for {
time.Sleep(time.Second)
// Test merge
err := config.Set("key", map[string]interface{}{
"Subkey3": "Merge",
})
if err != nil {
fmt.Println("ERROR: ", err)
}
val, _ := config.Get("key.subkey3")
if val.String("") != "Merge" {
fmt.Println("ERROR: key.subkey3 should be 'Merge' but it is:", val.String(""))
}
val, err = config.Get("key.subkey")
fmt.Println("Value of key.subkey: ", val.String(""), err)
val, _ = config.Get("key", config.Secret(true))
c := conf{}
err = val.Scan(&c.Key)
fmt.Println("Value of key.subkey1: ", c.Key.Subkey1, err)
fmt.Println("Value of key.subkey2: ", c.Key.Subkey2)
val, _ = config.Get("key.subkey3")
fmt.Println("Value of key.subkey3: ", val.String(""))
// Test defaults
val, _ = config.Get("key.subkey_does_not_exist")
fmt.Println("Default", val.String("Hello"))
}
}()
// run the service
service.Run()
}

3
test/events/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Events
A service which demonstrates how to read and write events

154
test/events/main.go Normal file
View File

@@ -0,0 +1,154 @@
package main
import (
"sync"
"time"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/events"
goevents "github.com/micro/micro/v3/service/events"
"github.com/micro/micro/v3/service/logger"
)
type testPayload struct {
Message string
}
var (
payload = testPayload{Message: "HelloWorld"}
metadata = map[string]string{"foo": "bar"}
)
func main() {
srv := service.New()
srv.Init()
go func() { // test 1, ordinary sub with autoack
evChan, err := events.Subscribe("test1")
if err != nil {
logger.Fatalf("Error creating subscriber: %v", err)
}
// Is there a race condition here with publish coming straight after subscribe? Seems to be according to this
// test so sleep for a bit to wait for nats to register subscription properly
time.Sleep(2 * time.Second)
logger.Infof("TEST1: publishing event")
err = events.Publish("test1", payload, goevents.WithMetadata(metadata))
if err != nil {
logger.Errorf("TEST1: Error publishing event: %v", err)
return
}
logger.Infof("TEST1: waiting for event")
event, ok := <-evChan
if !ok {
logger.Error("TEST1: Channel closed")
return
}
if event.Topic != "test1" {
logger.Errorf("TEST1: Incorrect topic: %v", event.Topic)
return
}
if event.Metadata == nil || event.Metadata["foo"] != metadata["foo"] {
logger.Errorf("TEST1: Incorrect metadata: %v", event.Metadata)
return
}
var result testPayload
if err := event.Unmarshal(&result); err != nil {
logger.Errorf("TEST1: Error decoding result: %v. Payload was %v", err, string(event.Payload))
return
}
if result.Message != payload.Message {
logger.Errorf("TEST1: Incorrect message: %v", result.Message)
return
}
logger.Infof("TEST1: Finished ok")
}()
go func() { // test 2, sub with manual ack
evChan, err := events.Subscribe("test2", goevents.WithAutoAck(false, 5*time.Second))
if err != nil {
logger.Errorf("TEST2: Error creating subscriber: %v", err)
return
}
// Is there a race condition here with publish coming straight after subscribe? Seems to be according to this
// test so sleep for a bit to wait for nats to register subscription properly
time.Sleep(2 * time.Second)
logger.Infof("TEST2: publishing event")
err = events.Publish("test2", payload, goevents.WithMetadata(metadata))
if err != nil {
logger.Errorf("TEST2: Error publishing event: %v", err)
return
}
logger.Infof("TEST2: waiting for event")
event, ok := <-evChan
if !ok {
logger.Errorf("TEST2: Channel closed")
return
}
if event.Topic != "test2" {
logger.Errorf("TEST2: Incorrect topic: %v", event.Topic)
return
}
if event.Metadata == nil || event.Metadata["foo"] != metadata["foo"] {
logger.Errorf("TEST2: Incorrect metadata: %v", event.Metadata)
return
}
var result testPayload
if err := event.Unmarshal(&result); err != nil {
logger.Errorf("TEST2: Error decoding result: %v. Payload was %v", err, string(event.Payload))
return
}
if result.Message != payload.Message {
logger.Errorf("TEST2: Incorrect message: %v", result.Message)
return
}
id := event.ID
// nack the event to put it back on the queue
logger.Infof("TEST2: Nacking the event")
event.Nack()
logger.Infof("TEST2: waiting for event")
select {
case event := <-evChan:
if event.ID != id {
logger.Errorf("Unexpected event received, expected %s, received %s", id, event.ID)
return
}
logger.Infof("TEST2: Acking the event")
event.Ack()
case <-time.After(10 * time.Second):
logger.Errorf("Timed out waiting for event")
return
}
// we've acked so should receive nothing else
logger.Infof("TEST2: Waiting for timeout")
select {
case event := <-evChan:
logger.Errorf("Unexpected event received %s", event.ID)
return
case <-time.After(10 * time.Second):
}
logger.Infof("TEST2: Finished ok")
}()
wg := sync.WaitGroup{}
wg.Add(1)
// wait indefinitely so this only runs once
wg.Wait()
}

3
test/kv/README.md Normal file
View File

@@ -0,0 +1,3 @@
# KV
A service which demonstrates how to use the key-value store

134
test/kv/handler/handler.go Normal file
View File

@@ -0,0 +1,134 @@
package handler
import (
"context"
"fmt"
"time"
log "github.com/micro/go-micro/v3/logger"
store "github.com/micro/micro/v3/service/store"
pb "github.com/micro/services/kv/proto"
)
type Example struct{}
// TestExpiry tests writing a record with expiry
func (e *Example) TestExpiry(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
if err := writeWithExpiry("WriteExpiry", "bar", 5*time.Second); err != nil {
return err
}
recs, err := store.Read("WriteExpiry")
if err != nil {
log.Errorf("Error reading %s", err)
return fmt.Errorf("Error reading record WriteExpiry with expiry %s", err)
}
if len(recs) != 1 {
return fmt.Errorf("Error reading record WriteExpiry, expected 1 record. Received %d", len(recs))
}
if err := writeWithExpiry("Record.Expiry", "bar", 5*time.Second); err != nil {
return err
}
recs, err = store.Read("Record.Expiry")
if err != nil {
log.Errorf("Error reading %s", err)
return fmt.Errorf("Error reading record Record.Expiry with expiry %s", err)
}
if len(recs) != 1 {
return fmt.Errorf("Error reading record Record.Expiry, expected 1 record. Received %d", len(recs))
}
if err := writeWithExpiry("WriteTTL", "bar", 5*time.Second); err != nil {
return err
}
recs, err = store.Read("WriteTTL")
if err != nil {
log.Errorf("Error reading %s", err)
return fmt.Errorf("Error reading record WriteTTL with expiry %s", err)
}
if len(recs) != 1 {
return fmt.Errorf("Error reading record WriteTTL, expected 1 record. Received %d", len(recs))
}
time.Sleep(6 * time.Second)
recs, err = store.Read("Record.Expiry")
if err != store.ErrNotFound {
log.Errorf("Error reading %s", err)
return fmt.Errorf("Error reading record Record.Expiry. Expected not found. Received %s and %d records", err, len(recs))
}
rsp.Msg = "Success"
return nil
}
func writeWithExpiry(key, val string, duration time.Duration) error {
if err := store.Write(&store.Record{Key: key, Value: []byte(val), Expiry: duration}); err != nil {
log.Errorf("Error writing %s", err)
return fmt.Errorf("Error writing record %s with expiry %s", key, err)
}
return nil
}
func (e *Example) TestList(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
// Test Limit()
for i := 0; i < 3; i++ {
if err := writeWithExpiry(fmt.Sprintf("TestList%d", i), "bar", 5*time.Second); err != nil {
return err
}
}
recs, err := store.List(store.Prefix("TestList"))
if err != nil {
return fmt.Errorf("Error listing from store %s", err)
}
log.Infof("Recs %+v", recs)
if len(recs) != 3 {
return fmt.Errorf("Error listing records, expected 3, received %d", len(recs))
}
rsp.Msg = "Success"
return nil
}
func (e *Example) TestListLimit(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
for i := 0; i < 10; i++ {
if err := writeWithExpiry(fmt.Sprintf("TestLimit%d", i), "bar", 5*time.Second); err != nil {
return err
}
}
recs, err := store.List(store.Prefix("TestLimit"), store.Limit(2))
if err != nil {
return fmt.Errorf("Error listing from store %s", err)
}
log.Infof("Recs limit %+v", recs)
if len(recs) != 2 {
return fmt.Errorf("Error listing records with limit, expected 2, received %d", len(recs))
}
rsp.Msg = "Success"
return nil
}
func (e *Example) TestListOffset(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
for i := 0; i < 20; i++ {
if err := writeWithExpiry(fmt.Sprintf("TestOffset%d", i), "bar", 5*time.Second); err != nil {
return err
}
}
recs, err := store.List(store.Prefix("TestOffset"), store.Offset(5))
if err != nil {
return fmt.Errorf("Error listing from store %s", err)
}
log.Infof("Recs offset %+v", recs)
if len(recs) != 15 {
return fmt.Errorf("Error listing records with offset, expected 15, received %d", len(recs))
}
rsp.Msg = "Success"
return nil
}

15
test/kv/main.go Normal file
View File

@@ -0,0 +1,15 @@
package main
import (
"github.com/micro/services/kv/handler"
"github.com/micro/micro/v3/service"
)
func main() {
srv := service.New(service.Name("example"))
srv.Handle(new(handler.Example))
srv.Run()
}

198
test/kv/proto/example.pb.go Normal file
View File

@@ -0,0 +1,198 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/service/storeexample/proto/example.proto
package srv_test_example
import (
context "context"
fmt "fmt"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Request struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Request) Reset() { *m = Request{} }
func (m *Request) String() string { return proto.CompactTextString(m) }
func (*Request) ProtoMessage() {}
func (*Request) Descriptor() ([]byte, []int) {
return fileDescriptor_060cb6963cd2b8f6, []int{0}
}
func (m *Request) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Request.Unmarshal(m, b)
}
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Request.Marshal(b, m, deterministic)
}
func (m *Request) XXX_Merge(src proto.Message) {
xxx_messageInfo_Request.Merge(m, src)
}
func (m *Request) XXX_Size() int {
return xxx_messageInfo_Request.Size(m)
}
func (m *Request) XXX_DiscardUnknown() {
xxx_messageInfo_Request.DiscardUnknown(m)
}
var xxx_messageInfo_Request proto.InternalMessageInfo
type Response struct {
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) {
return fileDescriptor_060cb6963cd2b8f6, []int{1}
}
func (m *Response) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Response.Unmarshal(m, b)
}
func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Response.Marshal(b, m, deterministic)
}
func (m *Response) XXX_Merge(src proto.Message) {
xxx_messageInfo_Response.Merge(m, src)
}
func (m *Response) XXX_Size() int {
return xxx_messageInfo_Response.Size(m)
}
func (m *Response) XXX_DiscardUnknown() {
xxx_messageInfo_Response.DiscardUnknown(m)
}
var xxx_messageInfo_Response proto.InternalMessageInfo
func (m *Response) GetMsg() string {
if m != nil {
return m.Msg
}
return ""
}
func init() {
proto.RegisterType((*Request)(nil), "srv.test_example.Request")
proto.RegisterType((*Response)(nil), "srv.test_example.Response")
}
func init() {
proto.RegisterFile("test/service/storeexample/proto/example.proto", fileDescriptor_060cb6963cd2b8f6)
}
var fileDescriptor_060cb6963cd2b8f6 = []byte{
// 155 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2d, 0x49, 0x2d, 0x2e,
0xd1, 0x2f, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0x2e, 0xc9, 0x2f, 0x4a, 0x4d, 0xad,
0x48, 0xcc, 0x2d, 0xc8, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0xf2, 0xf4, 0xc0,
0x3c, 0x21, 0x81, 0xe2, 0xa2, 0x32, 0x3d, 0x90, 0x96, 0x78, 0xa8, 0xb8, 0x12, 0x27, 0x17, 0x7b,
0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x92, 0x0c, 0x17, 0x47, 0x50, 0x6a, 0x71, 0x41, 0x7e,
0x5e, 0x71, 0xaa, 0x90, 0x00, 0x17, 0x73, 0x6e, 0x71, 0xba, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67,
0x10, 0x88, 0x69, 0x14, 0xc0, 0xc5, 0xee, 0x0a, 0xd1, 0x23, 0xe4, 0xca, 0xc5, 0x15, 0x92, 0x5a,
0x5c, 0xe2, 0x5a, 0x51, 0x90, 0x59, 0x54, 0x29, 0x24, 0xa9, 0x87, 0x6e, 0xa8, 0x1e, 0xd4, 0x44,
0x29, 0x29, 0x6c, 0x52, 0x10, 0x1b, 0x94, 0x18, 0x92, 0xd8, 0xc0, 0x6e, 0x32, 0x06, 0x04, 0x00,
0x00, 0xff, 0xff, 0x4c, 0xad, 0xe6, 0x25, 0xc4, 0x00, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// ExampleClient is the client API for Example service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ExampleClient interface {
TestExpiry(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
}
type exampleClient struct {
cc *grpc.ClientConn
}
func NewExampleClient(cc *grpc.ClientConn) ExampleClient {
return &exampleClient{cc}
}
func (c *exampleClient) TestExpiry(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) {
out := new(Response)
err := c.cc.Invoke(ctx, "/srv.test_example.Example/TestExpiry", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// ExampleServer is the server API for Example service.
type ExampleServer interface {
TestExpiry(context.Context, *Request) (*Response, error)
}
// UnimplementedExampleServer can be embedded to have forward compatible implementations.
type UnimplementedExampleServer struct {
}
func (*UnimplementedExampleServer) TestExpiry(ctx context.Context, req *Request) (*Response, error) {
return nil, status.Errorf(codes.Unimplemented, "method TestExpiry not implemented")
}
func RegisterExampleServer(s *grpc.Server, srv ExampleServer) {
s.RegisterService(&_Example_serviceDesc, srv)
}
func _Example_TestExpiry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Request)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ExampleServer).TestExpiry(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/srv.test_example.Example/TestExpiry",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ExampleServer).TestExpiry(ctx, req.(*Request))
}
return interceptor(ctx, in, info, handler)
}
var _Example_serviceDesc = grpc.ServiceDesc{
ServiceName: "srv.test_example.Example",
HandlerType: (*ExampleServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "TestExpiry",
Handler: _Example_TestExpiry_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "test/service/storeexample/proto/example.proto",
}

View File

@@ -0,0 +1,144 @@
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: test/service/storeexample/proto/example.proto
package srv_test_example
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
import (
context "context"
api "github.com/micro/go-micro/v3/api"
client "github.com/micro/go-micro/v3/client"
server "github.com/micro/go-micro/v3/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option
// Api Endpoints for Example service
func NewExampleEndpoints() []*api.Endpoint {
return []*api.Endpoint{}
}
// Client API for Example service
type ExampleService interface {
TestExpiry(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
TestList(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
TestListLimit(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
TestListOffset(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
}
type exampleService struct {
c client.Client
name string
}
func NewExampleService(name string, c client.Client) ExampleService {
return &exampleService{
c: c,
name: name,
}
}
func (c *exampleService) TestExpiry(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Example.TestExpiry", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *exampleService) TestList(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Example.TestList", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *exampleService) TestListLimit(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Example.TestListLimit", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *exampleService) TestListOffset(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Example.TestListOffset", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Example service
type ExampleHandler interface {
TestExpiry(context.Context, *Request, *Response) error
TestList(context.Context, *Request, *Response) error
TestListLimit(context.Context, *Request, *Response) error
TestListOffset(context.Context, *Request, *Response) error
}
func RegisterExampleHandler(s server.Server, hdlr ExampleHandler, opts ...server.HandlerOption) error {
type example interface {
TestExpiry(ctx context.Context, in *Request, out *Response) error
TestList(ctx context.Context, in *Request, out *Response) error
TestListLimit(ctx context.Context, in *Request, out *Response) error
TestListOffset(ctx context.Context, in *Request, out *Response) error
}
type Example struct {
example
}
h := &exampleHandler{hdlr}
return s.Handle(s.NewHandler(&Example{h}, opts...))
}
type exampleHandler struct {
ExampleHandler
}
func (h *exampleHandler) TestExpiry(ctx context.Context, in *Request, out *Response) error {
return h.ExampleHandler.TestExpiry(ctx, in, out)
}
func (h *exampleHandler) TestList(ctx context.Context, in *Request, out *Response) error {
return h.ExampleHandler.TestList(ctx, in, out)
}
func (h *exampleHandler) TestListLimit(ctx context.Context, in *Request, out *Response) error {
return h.ExampleHandler.TestListLimit(ctx, in, out)
}
func (h *exampleHandler) TestListOffset(ctx context.Context, in *Request, out *Response) error {
return h.ExampleHandler.TestListOffset(ctx, in, out)
}

View File

@@ -0,0 +1,17 @@
syntax = "proto3";
package srv.test_example;
service Example {
rpc TestExpiry(Request) returns (Response) {}
rpc TestList(Request) returns (Response) {}
rpc TestListLimit(Request) returns (Response) {}
rpc TestListOffset(Request) returns (Response) {}
}
message Request {
}
message Response {
string msg = 1;
}

3
test/logger/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Logger
A service which demonstrates how to use the logger

19
test/logger/main.go Normal file
View File

@@ -0,0 +1,19 @@
package main
import (
"time"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
)
func main() {
go func() {
for {
logger.Infof("This is a log line %s", time.Now())
time.Sleep(1 * time.Second)
}
}()
service.Run()
}

24
test/pubsub/README.md Normal file
View File

@@ -0,0 +1,24 @@
# PubSub
A simple example of using PubSub
## Overview
This example is a simple pubsub service which subscribes to a topic and periodically publishes
to the same place. The interface for how it works may change but its simple enough.
## Usage
```
# start micro
micro server
# run pubsub
micro run pubsub
# check status
micro status
# get the logs
micro logs pubsub
```

50
test/pubsub/main.go Normal file
View File

@@ -0,0 +1,50 @@
package main
import (
"context"
"fmt"
"time"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
pb "github.com/micro/services/pubsub/proto"
)
// Pub will publish messages every second
func Pub() {
ev := service.NewEvent("messages")
for {
err := ev.Publish(context.TODO(), &pb.Message{
Id: "1",
Body: []byte(`hello`),
})
if err != nil {
logger.Error("Error Publish:", err.Error())
}
time.Sleep(time.Second)
}
}
// Sub processes messages
func Sub(ctx context.Context, msg *pb.Message) error {
fmt.Println("Received a message")
return nil
}
func main() {
service := service.New(
service.Name("pubsub"),
)
// subscribe to the "messages" topic
service.Subscribe("messages", Sub)
// publish messages
go Pub()
if err := service.Run(); err != nil {
fmt.Println(err)
}
}

View File

@@ -0,0 +1,157 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
// protoc v3.11.4
// source: github.com/micro/services/pubsub/proto/pubsub.proto
package pubsub
import (
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4
type Message struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
}
func (x *Message) Reset() {
*x = Message{}
if protoimpl.UnsafeEnabled {
mi := &file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Message) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Message) ProtoMessage() {}
func (x *Message) ProtoReflect() protoreflect.Message {
mi := &file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Message.ProtoReflect.Descriptor instead.
func (*Message) Descriptor() ([]byte, []int) {
return file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescGZIP(), []int{0}
}
func (x *Message) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *Message) GetBody() []byte {
if x != nil {
return x.Body
}
return nil
}
var File_github_com_micro_services_pubsub_proto_pubsub_proto protoreflect.FileDescriptor
var file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc = []byte{
0x0a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x63,
0x72, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x73,
0x75, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x22, 0x2d, 0x0a,
0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x62, 0x06, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x33,
}
var (
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescOnce sync.Once
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData = file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc
)
func file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescGZIP() []byte {
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescOnce.Do(func() {
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData)
})
return file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData
}
var file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes = []interface{}{
(*Message)(nil), // 0: pubsub.Message
}
var file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_github_com_micro_services_pubsub_proto_pubsub_proto_init() }
func file_github_com_micro_services_pubsub_proto_pubsub_proto_init() {
if File_github_com_micro_services_pubsub_proto_pubsub_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Message); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc,
NumEnums: 0,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes,
DependencyIndexes: file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs,
MessageInfos: file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes,
}.Build()
File_github_com_micro_services_pubsub_proto_pubsub_proto = out.File
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc = nil
file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes = nil
file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs = nil
}

View File

@@ -0,0 +1,21 @@
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: github.com/micro/services/pubsub/proto/pubsub.proto
package pubsub
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

View File

@@ -0,0 +1,8 @@
syntax = "proto3";
package pubsub;
message Message {
string id = 1;
bytes body = 2;
}

3
test/routes/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Route Guide
A route guide service ported from grpc examples

View File

@@ -0,0 +1,335 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: proto/stream.proto
package stream
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Points are represented as latitude-longitude pairs in the E7 representation
// (degrees multiplied by 10**7 and rounded to the nearest integer).
// Latitudes should be in the range +/- 90 degrees and longitude should be in
// the range +/- 180 degrees (inclusive).
type Point struct {
Latitude int32 `protobuf:"varint,1,opt,name=latitude,proto3" json:"latitude,omitempty"`
Longitude int32 `protobuf:"varint,2,opt,name=longitude,proto3" json:"longitude,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Point) Reset() { *m = Point{} }
func (m *Point) String() string { return proto.CompactTextString(m) }
func (*Point) ProtoMessage() {}
func (*Point) Descriptor() ([]byte, []int) {
return fileDescriptor_45777bc300452f06, []int{0}
}
func (m *Point) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Point.Unmarshal(m, b)
}
func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Point.Marshal(b, m, deterministic)
}
func (m *Point) XXX_Merge(src proto.Message) {
xxx_messageInfo_Point.Merge(m, src)
}
func (m *Point) XXX_Size() int {
return xxx_messageInfo_Point.Size(m)
}
func (m *Point) XXX_DiscardUnknown() {
xxx_messageInfo_Point.DiscardUnknown(m)
}
var xxx_messageInfo_Point proto.InternalMessageInfo
func (m *Point) GetLatitude() int32 {
if m != nil {
return m.Latitude
}
return 0
}
func (m *Point) GetLongitude() int32 {
if m != nil {
return m.Longitude
}
return 0
}
// A latitude-longitude rectangle, represented as two diagonally opposite
// points "lo" and "hi".
type Rectangle struct {
// One corner of the rectangle.
Lo *Point `protobuf:"bytes,1,opt,name=lo,proto3" json:"lo,omitempty"`
// The other corner of the rectangle.
Hi *Point `protobuf:"bytes,2,opt,name=hi,proto3" json:"hi,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Rectangle) Reset() { *m = Rectangle{} }
func (m *Rectangle) String() string { return proto.CompactTextString(m) }
func (*Rectangle) ProtoMessage() {}
func (*Rectangle) Descriptor() ([]byte, []int) {
return fileDescriptor_45777bc300452f06, []int{1}
}
func (m *Rectangle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Rectangle.Unmarshal(m, b)
}
func (m *Rectangle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Rectangle.Marshal(b, m, deterministic)
}
func (m *Rectangle) XXX_Merge(src proto.Message) {
xxx_messageInfo_Rectangle.Merge(m, src)
}
func (m *Rectangle) XXX_Size() int {
return xxx_messageInfo_Rectangle.Size(m)
}
func (m *Rectangle) XXX_DiscardUnknown() {
xxx_messageInfo_Rectangle.DiscardUnknown(m)
}
var xxx_messageInfo_Rectangle proto.InternalMessageInfo
func (m *Rectangle) GetLo() *Point {
if m != nil {
return m.Lo
}
return nil
}
func (m *Rectangle) GetHi() *Point {
if m != nil {
return m.Hi
}
return nil
}
// A feature names something at a given point.
// If a feature could not be named, the name is empty.
type Feature struct {
// The name of the feature.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// The point where the feature is detected.
Location *Point `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Feature) Reset() { *m = Feature{} }
func (m *Feature) String() string { return proto.CompactTextString(m) }
func (*Feature) ProtoMessage() {}
func (*Feature) Descriptor() ([]byte, []int) {
return fileDescriptor_45777bc300452f06, []int{2}
}
func (m *Feature) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Feature.Unmarshal(m, b)
}
func (m *Feature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Feature.Marshal(b, m, deterministic)
}
func (m *Feature) XXX_Merge(src proto.Message) {
xxx_messageInfo_Feature.Merge(m, src)
}
func (m *Feature) XXX_Size() int {
return xxx_messageInfo_Feature.Size(m)
}
func (m *Feature) XXX_DiscardUnknown() {
xxx_messageInfo_Feature.DiscardUnknown(m)
}
var xxx_messageInfo_Feature proto.InternalMessageInfo
func (m *Feature) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Feature) GetLocation() *Point {
if m != nil {
return m.Location
}
return nil
}
// A RouteNote is a message sent while at a given point.
type RouteNote struct {
// The location from which the message is sent.
Location *Point `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"`
// The message to be sent.
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *RouteNote) Reset() { *m = RouteNote{} }
func (m *RouteNote) String() string { return proto.CompactTextString(m) }
func (*RouteNote) ProtoMessage() {}
func (*RouteNote) Descriptor() ([]byte, []int) {
return fileDescriptor_45777bc300452f06, []int{3}
}
func (m *RouteNote) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RouteNote.Unmarshal(m, b)
}
func (m *RouteNote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RouteNote.Marshal(b, m, deterministic)
}
func (m *RouteNote) XXX_Merge(src proto.Message) {
xxx_messageInfo_RouteNote.Merge(m, src)
}
func (m *RouteNote) XXX_Size() int {
return xxx_messageInfo_RouteNote.Size(m)
}
func (m *RouteNote) XXX_DiscardUnknown() {
xxx_messageInfo_RouteNote.DiscardUnknown(m)
}
var xxx_messageInfo_RouteNote proto.InternalMessageInfo
func (m *RouteNote) GetLocation() *Point {
if m != nil {
return m.Location
}
return nil
}
func (m *RouteNote) GetMessage() string {
if m != nil {
return m.Message
}
return ""
}
// A RouteSummary is received in response to a RecordRoute rpc.
// It contains the number of individual points received, the number of
// detected features, and the total distance covered as the cumulative sum of
// the distance between each point.
type RouteSummary struct {
// The number of points received.
PointCount int32 `protobuf:"varint,1,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"`
// The number of known features passed while traversing the route.
FeatureCount int32 `protobuf:"varint,2,opt,name=feature_count,json=featureCount,proto3" json:"feature_count,omitempty"`
// The distance covered in metres.
Distance int32 `protobuf:"varint,3,opt,name=distance,proto3" json:"distance,omitempty"`
// The duration of the traversal in seconds.
ElapsedTime int32 `protobuf:"varint,4,opt,name=elapsed_time,json=elapsedTime,proto3" json:"elapsed_time,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *RouteSummary) Reset() { *m = RouteSummary{} }
func (m *RouteSummary) String() string { return proto.CompactTextString(m) }
func (*RouteSummary) ProtoMessage() {}
func (*RouteSummary) Descriptor() ([]byte, []int) {
return fileDescriptor_45777bc300452f06, []int{4}
}
func (m *RouteSummary) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RouteSummary.Unmarshal(m, b)
}
func (m *RouteSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RouteSummary.Marshal(b, m, deterministic)
}
func (m *RouteSummary) XXX_Merge(src proto.Message) {
xxx_messageInfo_RouteSummary.Merge(m, src)
}
func (m *RouteSummary) XXX_Size() int {
return xxx_messageInfo_RouteSummary.Size(m)
}
func (m *RouteSummary) XXX_DiscardUnknown() {
xxx_messageInfo_RouteSummary.DiscardUnknown(m)
}
var xxx_messageInfo_RouteSummary proto.InternalMessageInfo
func (m *RouteSummary) GetPointCount() int32 {
if m != nil {
return m.PointCount
}
return 0
}
func (m *RouteSummary) GetFeatureCount() int32 {
if m != nil {
return m.FeatureCount
}
return 0
}
func (m *RouteSummary) GetDistance() int32 {
if m != nil {
return m.Distance
}
return 0
}
func (m *RouteSummary) GetElapsedTime() int32 {
if m != nil {
return m.ElapsedTime
}
return 0
}
func init() {
proto.RegisterType((*Point)(nil), "stream.Point")
proto.RegisterType((*Rectangle)(nil), "stream.Rectangle")
proto.RegisterType((*Feature)(nil), "stream.Feature")
proto.RegisterType((*RouteNote)(nil), "stream.RouteNote")
proto.RegisterType((*RouteSummary)(nil), "stream.RouteSummary")
}
func init() {
proto.RegisterFile("proto/stream.proto", fileDescriptor_45777bc300452f06)
}
var fileDescriptor_45777bc300452f06 = []byte{
// 371 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x52, 0x4f, 0x4b, 0xfb, 0x40,
0x10, 0xed, 0xf6, 0xd7, 0x3f, 0xbf, 0x4c, 0x52, 0xc4, 0xc1, 0x43, 0x29, 0x8a, 0x1a, 0x2f, 0xf5,
0x52, 0x4b, 0x05, 0x3d, 0x4b, 0xc1, 0x2a, 0x88, 0x94, 0xe8, 0xbd, 0xac, 0xc9, 0xda, 0x2e, 0x24,
0xd9, 0x92, 0x6c, 0x0e, 0x7e, 0x0e, 0x3f, 0xa3, 0xdf, 0xc3, 0xcd, 0xee, 0x26, 0xb6, 0xb6, 0x78,
0xcb, 0xbc, 0x37, 0x6f, 0xde, 0xec, 0x9b, 0x00, 0xae, 0x33, 0x21, 0xc5, 0x55, 0x2e, 0x33, 0x46,
0x93, 0x91, 0x2e, 0xb0, 0x63, 0x2a, 0xff, 0x0e, 0xda, 0x73, 0xc1, 0x53, 0x89, 0x03, 0xf8, 0x1f,
0x53, 0xc9, 0x65, 0x11, 0xb1, 0x3e, 0x39, 0x23, 0xc3, 0x76, 0x50, 0xd7, 0x78, 0x0c, 0x4e, 0x2c,
0xd2, 0xa5, 0x21, 0x9b, 0x9a, 0xfc, 0x01, 0xfc, 0x47, 0x70, 0x02, 0x16, 0x4a, 0x9a, 0x2e, 0x63,
0x86, 0x27, 0xd0, 0x8c, 0x85, 0x1e, 0xe0, 0x4e, 0x7a, 0x23, 0x6b, 0xa9, 0x1d, 0x02, 0x45, 0x94,
0xf4, 0x8a, 0xeb, 0x11, 0xbb, 0xf4, 0x8a, 0xfb, 0x0f, 0xd0, 0xbd, 0x67, 0x54, 0x16, 0x19, 0x43,
0x84, 0x56, 0x4a, 0x13, 0xb3, 0x8b, 0x13, 0xe8, 0x6f, 0xbc, 0x54, 0x3b, 0x8a, 0x50, 0x6d, 0x25,
0xd2, 0xfd, 0x33, 0x6a, 0xda, 0x9f, 0xab, 0xa5, 0x44, 0x21, 0xd9, 0xb3, 0x90, 0xdb, 0x3a, 0xf2,
0xa7, 0x0e, 0xfb, 0xd0, 0x4d, 0x58, 0x9e, 0xd3, 0xa5, 0x79, 0xa8, 0x13, 0x54, 0xa5, 0xff, 0x49,
0xc0, 0xd3, 0x23, 0x5f, 0x8a, 0x24, 0xa1, 0xd9, 0x07, 0x9e, 0x82, 0xbb, 0x2e, 0xd5, 0x8b, 0x50,
0x14, 0xa9, 0xb4, 0xa1, 0x81, 0x86, 0xa6, 0x25, 0x82, 0x17, 0xd0, 0x7b, 0x37, 0xaf, 0xb1, 0x2d,
0x26, 0x3a, 0xcf, 0x82, 0xa6, 0x49, 0xe5, 0x1e, 0xf1, 0x5c, 0xa5, 0x17, 0xb2, 0xfe, 0x3f, 0x93,
0x7b, 0x55, 0xe3, 0x39, 0x78, 0x2c, 0xa6, 0xeb, 0x9c, 0x45, 0x0b, 0xc9, 0x55, 0x16, 0x2d, 0xcd,
0xbb, 0x16, 0x7b, 0x55, 0xd0, 0xe4, 0x8b, 0x00, 0xe8, 0xad, 0x66, 0x05, 0x57, 0x97, 0x1a, 0x01,
0xcc, 0x98, 0xac, 0x32, 0xdc, 0x7e, 0xe5, 0xe0, 0xa0, 0x2a, 0x2d, 0xef, 0x37, 0xf0, 0x06, 0xbc,
0x27, 0xe5, 0x66, 0x81, 0x1c, 0x0f, 0xab, 0x96, 0xfa, 0xa2, 0x7b, 0x54, 0x63, 0xa2, 0x74, 0xae,
0xea, 0x10, 0x59, 0xa4, 0xbd, 0x7f, 0x1b, 0x1d, 0xd5, 0x53, 0x36, 0xf2, 0xf2, 0x1b, 0x43, 0x82,
0xb7, 0xf6, 0x2c, 0xd3, 0x15, 0x95, 0x1b, 0x66, 0xd5, 0xa5, 0x06, 0xbb, 0x50, 0x29, 0x1b, 0x93,
0xb7, 0x8e, 0xfe, 0x6d, 0xaf, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x12, 0xaf, 0xc8, 0xcc,
0x02, 0x00, 0x00,
}

View File

@@ -0,0 +1,394 @@
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/stream.proto
package stream
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
import (
context "context"
api "github.com/micro/micro/v3/service/api"
client "github.com/micro/micro/v3/service/client"
server "github.com/micro/micro/v3/service/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option
// Api Endpoints for RouteGuide service
func NewRouteGuideEndpoints() []*api.Endpoint {
return []*api.Endpoint{}
}
// Client API for RouteGuide service
type RouteGuideService interface {
// Obtains the feature at a given position.
GetFeature(ctx context.Context, in *Point, opts ...client.CallOption) (*Feature, error)
// Obtains the Features available within the given Rectangle. Results are
// streamed rather than returned at once (e.g. in a response message with a
// repeated field), as the rectangle may cover a large area and contain a
// huge number of features.
ListFeatures(ctx context.Context, in *Rectangle, opts ...client.CallOption) (RouteGuide_ListFeaturesService, error)
// Accepts a stream of Points on a route being traversed, returning a
// RouteSummary when traversal is completed.
RecordRoute(ctx context.Context, opts ...client.CallOption) (RouteGuide_RecordRouteService, error)
// Accepts a stream of RouteNotes sent while a route is being traversed,
// while receiving other RouteNotes (e.g. from other users).
RouteChat(ctx context.Context, opts ...client.CallOption) (RouteGuide_RouteChatService, error)
}
type routeGuideService struct {
c client.Client
name string
}
func NewRouteGuideService(name string, c client.Client) RouteGuideService {
return &routeGuideService{
c: c,
name: name,
}
}
func (c *routeGuideService) GetFeature(ctx context.Context, in *Point, opts ...client.CallOption) (*Feature, error) {
req := c.c.NewRequest(c.name, "RouteGuide.GetFeature", in)
out := new(Feature)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *routeGuideService) ListFeatures(ctx context.Context, in *Rectangle, opts ...client.CallOption) (RouteGuide_ListFeaturesService, error) {
req := c.c.NewRequest(c.name, "RouteGuide.ListFeatures", &Rectangle{})
stream, err := c.c.Stream(ctx, req, opts...)
if err != nil {
return nil, err
}
if err := stream.Send(in); err != nil {
return nil, err
}
return &routeGuideServiceListFeatures{stream}, nil
}
type RouteGuide_ListFeaturesService interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Recv() (*Feature, error)
}
type routeGuideServiceListFeatures struct {
stream client.Stream
}
func (x *routeGuideServiceListFeatures) Close() error {
return x.stream.Close()
}
func (x *routeGuideServiceListFeatures) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideServiceListFeatures) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideServiceListFeatures) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideServiceListFeatures) Recv() (*Feature, error) {
m := new(Feature)
err := x.stream.Recv(m)
if err != nil {
return nil, err
}
return m, nil
}
func (c *routeGuideService) RecordRoute(ctx context.Context, opts ...client.CallOption) (RouteGuide_RecordRouteService, error) {
req := c.c.NewRequest(c.name, "RouteGuide.RecordRoute", &Point{})
stream, err := c.c.Stream(ctx, req, opts...)
if err != nil {
return nil, err
}
return &routeGuideServiceRecordRoute{stream}, nil
}
type RouteGuide_RecordRouteService interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
CloseAndRecv() (*RouteSummary, error)
Send(*Point) error
}
type routeGuideServiceRecordRoute struct {
stream client.Stream
}
func (x *routeGuideServiceRecordRoute) CloseAndRecv() (*RouteSummary, error) {
if err := x.stream.Close(); err != nil {
return nil, err
}
r := new(RouteSummary)
err := x.RecvMsg(r)
return r, err
}
func (x *routeGuideServiceRecordRoute) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideServiceRecordRoute) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideServiceRecordRoute) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideServiceRecordRoute) Send(m *Point) error {
return x.stream.Send(m)
}
func (c *routeGuideService) RouteChat(ctx context.Context, opts ...client.CallOption) (RouteGuide_RouteChatService, error) {
req := c.c.NewRequest(c.name, "RouteGuide.RouteChat", &RouteNote{})
stream, err := c.c.Stream(ctx, req, opts...)
if err != nil {
return nil, err
}
return &routeGuideServiceRouteChat{stream}, nil
}
type RouteGuide_RouteChatService interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*RouteNote) error
Recv() (*RouteNote, error)
}
type routeGuideServiceRouteChat struct {
stream client.Stream
}
func (x *routeGuideServiceRouteChat) Close() error {
return x.stream.Close()
}
func (x *routeGuideServiceRouteChat) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideServiceRouteChat) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideServiceRouteChat) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideServiceRouteChat) Send(m *RouteNote) error {
return x.stream.Send(m)
}
func (x *routeGuideServiceRouteChat) Recv() (*RouteNote, error) {
m := new(RouteNote)
err := x.stream.Recv(m)
if err != nil {
return nil, err
}
return m, nil
}
// Server API for RouteGuide service
type RouteGuideHandler interface {
// Obtains the feature at a given position.
GetFeature(context.Context, *Point, *Feature) error
// Obtains the Features available within the given Rectangle. Results are
// streamed rather than returned at once (e.g. in a response message with a
// repeated field), as the rectangle may cover a large area and contain a
// huge number of features.
ListFeatures(context.Context, *Rectangle, RouteGuide_ListFeaturesStream) error
// Accepts a stream of Points on a route being traversed, returning a
// RouteSummary when traversal is completed.
RecordRoute(context.Context, RouteGuide_RecordRouteStream) error
// Accepts a stream of RouteNotes sent while a route is being traversed,
// while receiving other RouteNotes (e.g. from other users).
RouteChat(context.Context, RouteGuide_RouteChatStream) error
}
func RegisterRouteGuideHandler(s server.Server, hdlr RouteGuideHandler, opts ...server.HandlerOption) error {
type routeGuide interface {
GetFeature(ctx context.Context, in *Point, out *Feature) error
ListFeatures(ctx context.Context, stream server.Stream) error
RecordRoute(ctx context.Context, stream server.Stream) error
RouteChat(ctx context.Context, stream server.Stream) error
}
type RouteGuide struct {
routeGuide
}
h := &routeGuideHandler{hdlr}
return s.Handle(s.NewHandler(&RouteGuide{h}, opts...))
}
type routeGuideHandler struct {
RouteGuideHandler
}
func (h *routeGuideHandler) GetFeature(ctx context.Context, in *Point, out *Feature) error {
return h.RouteGuideHandler.GetFeature(ctx, in, out)
}
func (h *routeGuideHandler) ListFeatures(ctx context.Context, stream server.Stream) error {
m := new(Rectangle)
if err := stream.Recv(m); err != nil {
return err
}
return h.RouteGuideHandler.ListFeatures(ctx, m, &routeGuideListFeaturesStream{stream})
}
type RouteGuide_ListFeaturesStream interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*Feature) error
}
type routeGuideListFeaturesStream struct {
stream server.Stream
}
func (x *routeGuideListFeaturesStream) Close() error {
return x.stream.Close()
}
func (x *routeGuideListFeaturesStream) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideListFeaturesStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideListFeaturesStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideListFeaturesStream) Send(m *Feature) error {
return x.stream.Send(m)
}
func (h *routeGuideHandler) RecordRoute(ctx context.Context, stream server.Stream) error {
return h.RouteGuideHandler.RecordRoute(ctx, &routeGuideRecordRouteStream{stream})
}
type RouteGuide_RecordRouteStream interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
SendAndClose(*RouteSummary) error
Recv() (*Point, error)
}
type routeGuideRecordRouteStream struct {
stream server.Stream
}
func (x *routeGuideRecordRouteStream) SendAndClose(in *RouteSummary) error {
if err := x.SendMsg(in); err != nil {
return err
}
return x.stream.Close()
}
func (x *routeGuideRecordRouteStream) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideRecordRouteStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideRecordRouteStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideRecordRouteStream) Recv() (*Point, error) {
m := new(Point)
if err := x.stream.Recv(m); err != nil {
return nil, err
}
return m, nil
}
func (h *routeGuideHandler) RouteChat(ctx context.Context, stream server.Stream) error {
return h.RouteGuideHandler.RouteChat(ctx, &routeGuideRouteChatStream{stream})
}
type RouteGuide_RouteChatStream interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*RouteNote) error
Recv() (*RouteNote, error)
}
type routeGuideRouteChatStream struct {
stream server.Stream
}
func (x *routeGuideRouteChatStream) Close() error {
return x.stream.Close()
}
func (x *routeGuideRouteChatStream) Context() context.Context {
return x.stream.Context()
}
func (x *routeGuideRouteChatStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *routeGuideRouteChatStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *routeGuideRouteChatStream) Send(m *RouteNote) error {
return x.stream.Send(m)
}
func (x *routeGuideRouteChatStream) Recv() (*RouteNote, error) {
m := new(RouteNote)
if err := x.stream.Recv(m); err != nil {
return nil, err
}
return m, nil
}

View File

@@ -0,0 +1,73 @@
syntax = "proto3";
package stream;
// this service uses the grpc example as a foundation:
// https://grpc.io/docs/languages/go/basics/
// https://github.com/grpc/grpc-go/tree/master/examples/route_guide
service RouteGuide {
// Obtains the feature at a given position.
rpc GetFeature(Point) returns (Feature) {}
// Obtains the Features available within the given Rectangle. Results are
// streamed rather than returned at once (e.g. in a response message with a
// repeated field), as the rectangle may cover a large area and contain a
// huge number of features.
rpc ListFeatures(Rectangle) returns (stream Feature) {}
// Accepts a stream of Points on a route being traversed, returning a
// RouteSummary when traversal is completed.
rpc RecordRoute(stream Point) returns (RouteSummary) {}
// Accepts a stream of RouteNotes sent while a route is being traversed,
// while receiving other RouteNotes (e.g. from other users).
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}
// Points are represented as latitude-longitude pairs in the E7 representation
// (degrees multiplied by 10**7 and rounded to the nearest integer).
// Latitudes should be in the range +/- 90 degrees and longitude should be in
// the range +/- 180 degrees (inclusive).
message Point {
int32 latitude = 1;
int32 longitude = 2;
}
// A latitude-longitude rectangle, represented as two diagonally opposite
// points "lo" and "hi".
message Rectangle {
// One corner of the rectangle.
Point lo = 1;
// The other corner of the rectangle.
Point hi = 2;
}
// A feature names something at a given point.
// If a feature could not be named, the name is empty.
message Feature {
// The name of the feature.
string name = 1;
// The point where the feature is detected.
Point location = 2;
}
// A RouteNote is a message sent while at a given point.
message RouteNote {
// The location from which the message is sent.
Point location = 1;
// The message to be sent.
string message = 2;
}
// A RouteSummary is received in response to a RecordRoute rpc.
// It contains the number of individual points received, the number of
// detected features, and the total distance covered as the cumulative sum of
// the distance between each point.
message RouteSummary {
// The number of points received.
int32 point_count = 1;
// The number of known features passed while traversing the route.
int32 feature_count = 2;
// The distance covered in metres.
int32 distance = 3;
// The duration of the traversal in seconds.
int32 elapsed_time = 4;
}

View File

@@ -0,0 +1,156 @@
package main
import (
"context"
"io"
"math/rand"
"time"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
pb "github.com/micro/services/routes/proto"
)
func main() {
srv := service.New()
cli := pb.NewRouteGuideService("rpc", srv.Client())
// Looking for a valid feature
logger.Infof("Testing Unary... Starting")
printFeature(cli, &pb.Point{Latitude: 409146138, Longitude: -746188906})
printFeature(cli, &pb.Point{Latitude: 0, Longitude: 0})
logger.Infof("Testing Unary... Done")
// Looking for features between 40, -75 and 42, -73.
logger.Infof("Testing Server Streaming... Starting")
printFeatures(cli, &pb.Rectangle{
Lo: &pb.Point{Latitude: 400000000, Longitude: -750000000},
Hi: &pb.Point{Latitude: 420000000, Longitude: -730000000},
})
logger.Infof("Testing Server Streaming... Done")
// RecordRoute
logger.Infof("Testing Client Streaming... Starting")
runRecordRoute(cli)
logger.Infof("Testing Client Streaming... Done")
// RouteChat
logger.Infof("Testing Bidirectional Streaming... Starting")
runRouteChat(cli)
logger.Infof("Testing Bidirectional Streaming... Done")
logger.Infof("Client completed ok")
// prevent the client from restarting when running using micro run
srv.Run()
}
// printFeature gets the feature for the given point.
func printFeature(client pb.RouteGuideService, point *pb.Point) {
logger.Tracef("Getting feature for point (%d, %d)", point.Latitude, point.Longitude)
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
feature, err := client.GetFeature(ctx, point)
if err != nil {
logger.Fatalf("%v.GetFeatures(_) = _, %v: ", client, err)
}
logger.Tracef("Got Features: %v", feature)
}
// printFeatures lists all the features within the given bounding Rectangle.
func printFeatures(client pb.RouteGuideService, rect *pb.Rectangle) {
logger.Tracef("Looking for features within %v", rect)
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
stream, err := client.ListFeatures(ctx, rect)
if err != nil {
logger.Fatalf("%v.ListFeatures(_) = _, %v", client, err)
}
for {
feature, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
logger.Fatalf("%v.ListFeatures(_) = _, %v", client, err)
}
logger.Tracef("Got Feature: %v", feature)
}
}
// runRecordRoute sends a sequence of points to server and expects to get a RouteSummary from server.
func runRecordRoute(client pb.RouteGuideService) {
// Create a random number of random points
r := rand.New(rand.NewSource(time.Now().UnixNano()))
pointCount := int(r.Int31n(100)) + 2 // Traverse at least two points
var points []*pb.Point
for i := 0; i < pointCount; i++ {
points = append(points, randomPoint(r))
}
logger.Tracef("Traversing %d points.", len(points))
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
stream, err := client.RecordRoute(ctx)
if err != nil {
logger.Fatalf("%v.RecordRoute(_) = _, %v", client, err)
}
for _, point := range points {
if err := stream.Send(point); err != nil {
logger.Fatalf("%v.Send(%v) = %v", stream, point, err)
}
}
summary, err := stream.CloseAndRecv()
if err != nil {
logger.Fatalf("%v.CloseAndRecv() got error %v, want %v", stream, err, nil)
}
logger.Tracef("Route summary: %v", summary)
}
// runRouteChat receives a sequence of route notes, while sending notes for various locations.
func runRouteChat(client pb.RouteGuideService) {
notes := []*pb.RouteNote{
{Location: &pb.Point{Latitude: 0, Longitude: 1}, Message: "First message"},
{Location: &pb.Point{Latitude: 0, Longitude: 2}, Message: "Second message"},
{Location: &pb.Point{Latitude: 0, Longitude: 3}, Message: "Third message"},
{Location: &pb.Point{Latitude: 0, Longitude: 1}, Message: "Fourth message"},
{Location: &pb.Point{Latitude: 0, Longitude: 2}, Message: "Fifth message"},
{Location: &pb.Point{Latitude: 0, Longitude: 3}, Message: "Sixth message"},
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
stream, err := client.RouteChat(ctx)
if err != nil {
logger.Fatalf("%v.RouteChat(_) = _, %v", client, err)
}
waitc := make(chan struct{})
go func() {
for {
in, err := stream.Recv()
if err == io.EOF {
// read done.
close(waitc)
return
}
if err != nil {
logger.Fatalf("Failed to receive a note : %v", err)
}
logger.Tracef("Got message %s at point(%d, %d)", in.Message, in.Location.Latitude, in.Location.Longitude)
}
}()
for _, note := range notes {
if err := stream.Send(note); err != nil {
logger.Fatalf("Failed to send a note: %v", err)
}
}
if err := stream.Close(); err != nil {
logger.Fatalf("%v.Close() got error: %v, want %v", stream, err, nil)
}
<-waitc
}
func randomPoint(r *rand.Rand) *pb.Point {
lat := (r.Int31n(180) - 90) * 1e7
long := (r.Int31n(360) - 180) * 1e7
return &pb.Point{Latitude: lat, Longitude: long}
}

View File

@@ -0,0 +1,113 @@
package handler
import (
"context"
"io"
"sync"
"time"
"github.com/golang/protobuf/proto"
pb "github.com/micro/services/routes/proto"
)
// RouteGuide implements the route guide handler interface
type RouteGuide struct {
Features []*pb.Feature
Notes map[string][]*pb.RouteNote
NotesLock sync.Mutex
}
// GetFeature obtains the feature at a given position.
func (r *RouteGuide) GetFeature(ctx context.Context, point *pb.Point, feature *pb.Feature) error {
for _, f := range r.Features {
if proto.Equal(f.Location, point) {
*feature = *f
return nil
}
}
// No feature was found, return an unnamed feature
feature.Location = point
return nil
}
// ListFeatures obtains the Features available within the given Rectangle. Results are
// streamed rather than returned at once (e.g. in a response message with a
// repeated field), as the rectangle may cover a large area and contain a
// huge number of features.
func (r *RouteGuide) ListFeatures(ctx context.Context, rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesStream) error {
for _, f := range r.Features {
if inRange(f.Location, rect) {
if err := stream.Send(f); err != nil {
return err
}
}
}
return nil
}
// RecordRoute accepts a stream of Points on a route being traversed, returning a
// RouteSummary when traversal is completed.
func (r *RouteGuide) RecordRoute(ctx context.Context, stream pb.RouteGuide_RecordRouteStream) error {
var pointCount, featureCount, distance int32
var lastPoint *pb.Point
startTime := time.Now()
for {
point, err := stream.Recv()
if err == io.EOF {
endTime := time.Now()
return stream.SendAndClose(&pb.RouteSummary{
PointCount: pointCount,
FeatureCount: featureCount,
Distance: distance,
ElapsedTime: int32(endTime.Sub(startTime).Seconds()),
})
}
if err != nil {
return err
}
pointCount++
for _, f := range r.Features {
if proto.Equal(f.Location, point) {
featureCount++
}
}
if lastPoint != nil {
distance += calcDistance(lastPoint, point)
}
lastPoint = point
}
}
// RouteChat accepts a stream of RouteNotes sent while a route is being traversed,
// while receiving other RouteNotes (e.g. from other users).
func (r *RouteGuide) RouteChat(ctx context.Context, stream pb.RouteGuide_RouteChatStream) error {
for {
in, err := stream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
return err
}
key := serialize(in.Location)
r.NotesLock.Lock()
r.Notes[key] = append(r.Notes[key], in)
// Note: this copy prevents blocking other clients while serving this one.
// We don't need to do a deep copy, because elements in the slice are
// insert-only and never modified.
rn := make([]*pb.RouteNote, len(r.Notes[key]))
copy(rn, r.Notes[key])
r.NotesLock.Unlock()
for _, note := range rn {
if err := stream.Send(note); err != nil {
return err
}
}
}
}

View File

@@ -0,0 +1,52 @@
package handler
import (
"fmt"
"math"
pb "github.com/micro/services/routes/proto"
)
func toRadians(num float64) float64 {
return num * math.Pi / float64(180)
}
// calcDistance calculates the distance between two points using the "haversine" formula.
// The formula is based on http://mathforum.org/library/drmath/view/51879.html.
func calcDistance(p1 *pb.Point, p2 *pb.Point) int32 {
const CordFactor float64 = 1e7
const R = float64(6371000) // earth radius in metres
lat1 := toRadians(float64(p1.Latitude) / CordFactor)
lat2 := toRadians(float64(p2.Latitude) / CordFactor)
lng1 := toRadians(float64(p1.Longitude) / CordFactor)
lng2 := toRadians(float64(p2.Longitude) / CordFactor)
dlat := lat2 - lat1
dlng := lng2 - lng1
a := math.Sin(dlat/2)*math.Sin(dlat/2) +
math.Cos(lat1)*math.Cos(lat2)*
math.Sin(dlng/2)*math.Sin(dlng/2)
c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
distance := R * c
return int32(distance)
}
func inRange(point *pb.Point, rect *pb.Rectangle) bool {
left := math.Min(float64(rect.Lo.Longitude), float64(rect.Hi.Longitude))
right := math.Max(float64(rect.Lo.Longitude), float64(rect.Hi.Longitude))
top := math.Max(float64(rect.Lo.Latitude), float64(rect.Hi.Latitude))
bottom := math.Min(float64(rect.Lo.Latitude), float64(rect.Hi.Latitude))
if float64(point.Longitude) >= left &&
float64(point.Longitude) <= right &&
float64(point.Latitude) >= bottom &&
float64(point.Latitude) <= top {
return true
}
return false
}
func serialize(point *pb.Point) string {
return fmt.Sprintf("%d %d", point.Latitude, point.Longitude)
}

View File

@@ -0,0 +1,649 @@
package main
import (
"encoding/json"
"fmt"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
pb "github.com/micro/services/routes/proto"
"github.com/micro/services/routes/routes-server/handler"
)
func main() {
// Create the service
srv := service.New(
service.Name("rpc"),
service.Version("latest"),
)
// Load the test data
features, err := loadFeatures()
if err != nil {
logger.Fatalf("Error loading features: %v", err)
}
// Register the handler
pb.RegisterRouteGuideHandler(srv.Server(), &handler.RouteGuide{
Features: features,
Notes: make(map[string][]*pb.RouteNote),
})
// Run the service
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
}
// loadFeatures loads features from the JSON file.
func loadFeatures() ([]*pb.Feature, error) {
var result []*pb.Feature
if err := json.Unmarshal(testData, &result); err != nil {
return nil, fmt.Errorf("Failed to load default features: %v", err)
}
return result, nil
}
var testData = []byte(`[{
"location": {
"latitude": 407838351,
"longitude": -746143763
},
"name": "Patriots Path, Mendham, NJ 07945, USA"
}, {
"location": {
"latitude": 408122808,
"longitude": -743999179
},
"name": "101 New Jersey 10, Whippany, NJ 07981, USA"
}, {
"location": {
"latitude": 413628156,
"longitude": -749015468
},
"name": "U.S. 6, Shohola, PA 18458, USA"
}, {
"location": {
"latitude": 419999544,
"longitude": -740371136
},
"name": "5 Conners Road, Kingston, NY 12401, USA"
}, {
"location": {
"latitude": 414008389,
"longitude": -743951297
},
"name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA"
}, {
"location": {
"latitude": 419611318,
"longitude": -746524769
},
"name": "287 Flugertown Road, Livingston Manor, NY 12758, USA"
}, {
"location": {
"latitude": 406109563,
"longitude": -742186778
},
"name": "4001 Tremley Point Road, Linden, NJ 07036, USA"
}, {
"location": {
"latitude": 416802456,
"longitude": -742370183
},
"name": "352 South Mountain Road, Wallkill, NY 12589, USA"
}, {
"location": {
"latitude": 412950425,
"longitude": -741077389
},
"name": "Bailey Turn Road, Harriman, NY 10926, USA"
}, {
"location": {
"latitude": 412144655,
"longitude": -743949739
},
"name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA"
}, {
"location": {
"latitude": 415736605,
"longitude": -742847522
},
"name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA"
}, {
"location": {
"latitude": 413843930,
"longitude": -740501726
},
"name": "162 Merrill Road, Highland Mills, NY 10930, USA"
}, {
"location": {
"latitude": 410873075,
"longitude": -744459023
},
"name": "Clinton Road, West Milford, NJ 07480, USA"
}, {
"location": {
"latitude": 412346009,
"longitude": -744026814
},
"name": "16 Old Brook Lane, Warwick, NY 10990, USA"
}, {
"location": {
"latitude": 402948455,
"longitude": -747903913
},
"name": "3 Drake Lane, Pennington, NJ 08534, USA"
}, {
"location": {
"latitude": 406337092,
"longitude": -740122226
},
"name": "6324 8th Avenue, Brooklyn, NY 11220, USA"
}, {
"location": {
"latitude": 406421967,
"longitude": -747727624
},
"name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA"
}, {
"location": {
"latitude": 416318082,
"longitude": -749677716
},
"name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA"
}, {
"location": {
"latitude": 415301720,
"longitude": -748416257
},
"name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA"
}, {
"location": {
"latitude": 402647019,
"longitude": -747071791
},
"name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA"
}, {
"location": {
"latitude": 412567807,
"longitude": -741058078
},
"name": "New York State Reference Route 987E, Southfields, NY 10975, USA"
}, {
"location": {
"latitude": 416855156,
"longitude": -744420597
},
"name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA"
}, {
"location": {
"latitude": 404663628,
"longitude": -744820157
},
"name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA"
}, {
"location": {
"latitude": 407113723,
"longitude": -749746483
},
"name": ""
}, {
"location": {
"latitude": 402133926,
"longitude": -743613249
},
"name": ""
}, {
"location": {
"latitude": 400273442,
"longitude": -741220915
},
"name": ""
}, {
"location": {
"latitude": 411236786,
"longitude": -744070769
},
"name": ""
}, {
"location": {
"latitude": 411633782,
"longitude": -746784970
},
"name": "211-225 Plains Road, Augusta, NJ 07822, USA"
}, {
"location": {
"latitude": 415830701,
"longitude": -742952812
},
"name": ""
}, {
"location": {
"latitude": 413447164,
"longitude": -748712898
},
"name": "165 Pedersen Ridge Road, Milford, PA 18337, USA"
}, {
"location": {
"latitude": 405047245,
"longitude": -749800722
},
"name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA"
}, {
"location": {
"latitude": 418858923,
"longitude": -746156790
},
"name": ""
}, {
"location": {
"latitude": 417951888,
"longitude": -748484944
},
"name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA"
}, {
"location": {
"latitude": 407033786,
"longitude": -743977337
},
"name": "26 East 3rd Street, New Providence, NJ 07974, USA"
}, {
"location": {
"latitude": 417548014,
"longitude": -740075041
},
"name": ""
}, {
"location": {
"latitude": 410395868,
"longitude": -744972325
},
"name": ""
}, {
"location": {
"latitude": 404615353,
"longitude": -745129803
},
"name": ""
}, {
"location": {
"latitude": 406589790,
"longitude": -743560121
},
"name": "611 Lawrence Avenue, Westfield, NJ 07090, USA"
}, {
"location": {
"latitude": 414653148,
"longitude": -740477477
},
"name": "18 Lannis Avenue, New Windsor, NY 12553, USA"
}, {
"location": {
"latitude": 405957808,
"longitude": -743255336
},
"name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA"
}, {
"location": {
"latitude": 411733589,
"longitude": -741648093
},
"name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA"
}, {
"location": {
"latitude": 412676291,
"longitude": -742606606
},
"name": "1270 Lakes Road, Monroe, NY 10950, USA"
}, {
"location": {
"latitude": 409224445,
"longitude": -748286738
},
"name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA"
}, {
"location": {
"latitude": 406523420,
"longitude": -742135517
},
"name": "652 Garden Street, Elizabeth, NJ 07202, USA"
}, {
"location": {
"latitude": 401827388,
"longitude": -740294537
},
"name": "349 Sea Spray Court, Neptune City, NJ 07753, USA"
}, {
"location": {
"latitude": 410564152,
"longitude": -743685054
},
"name": "13-17 Stanley Street, West Milford, NJ 07480, USA"
}, {
"location": {
"latitude": 408472324,
"longitude": -740726046
},
"name": "47 Industrial Avenue, Teterboro, NJ 07608, USA"
}, {
"location": {
"latitude": 412452168,
"longitude": -740214052
},
"name": "5 White Oak Lane, Stony Point, NY 10980, USA"
}, {
"location": {
"latitude": 409146138,
"longitude": -746188906
},
"name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA"
}, {
"location": {
"latitude": 404701380,
"longitude": -744781745
},
"name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA"
}, {
"location": {
"latitude": 409642566,
"longitude": -746017679
},
"name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA"
}, {
"location": {
"latitude": 408031728,
"longitude": -748645385
},
"name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA"
}, {
"location": {
"latitude": 413700272,
"longitude": -742135189
},
"name": "367 Prospect Road, Chester, NY 10918, USA"
}, {
"location": {
"latitude": 404310607,
"longitude": -740282632
},
"name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA"
}, {
"location": {
"latitude": 409319800,
"longitude": -746201391
},
"name": "11 Ward Street, Mount Arlington, NJ 07856, USA"
}, {
"location": {
"latitude": 406685311,
"longitude": -742108603
},
"name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA"
}, {
"location": {
"latitude": 419018117,
"longitude": -749142781
},
"name": "43 Dreher Road, Roscoe, NY 12776, USA"
}, {
"location": {
"latitude": 412856162,
"longitude": -745148837
},
"name": "Swan Street, Pine Island, NY 10969, USA"
}, {
"location": {
"latitude": 416560744,
"longitude": -746721964
},
"name": "66 Pleasantview Avenue, Monticello, NY 12701, USA"
}, {
"location": {
"latitude": 405314270,
"longitude": -749836354
},
"name": ""
}, {
"location": {
"latitude": 414219548,
"longitude": -743327440
},
"name": ""
}, {
"location": {
"latitude": 415534177,
"longitude": -742900616
},
"name": "565 Winding Hills Road, Montgomery, NY 12549, USA"
}, {
"location": {
"latitude": 406898530,
"longitude": -749127080
},
"name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA"
}, {
"location": {
"latitude": 407586880,
"longitude": -741670168
},
"name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA"
}, {
"location": {
"latitude": 400106455,
"longitude": -742870190
},
"name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA"
}, {
"location": {
"latitude": 400066188,
"longitude": -746793294
},
"name": ""
}, {
"location": {
"latitude": 418803880,
"longitude": -744102673
},
"name": "40 Mountain Road, Napanoch, NY 12458, USA"
}, {
"location": {
"latitude": 414204288,
"longitude": -747895140
},
"name": ""
}, {
"location": {
"latitude": 414777405,
"longitude": -740615601
},
"name": ""
}, {
"location": {
"latitude": 415464475,
"longitude": -747175374
},
"name": "48 North Road, Forestburgh, NY 12777, USA"
}, {
"location": {
"latitude": 404062378,
"longitude": -746376177
},
"name": ""
}, {
"location": {
"latitude": 405688272,
"longitude": -749285130
},
"name": ""
}, {
"location": {
"latitude": 400342070,
"longitude": -748788996
},
"name": ""
}, {
"location": {
"latitude": 401809022,
"longitude": -744157964
},
"name": ""
}, {
"location": {
"latitude": 404226644,
"longitude": -740517141
},
"name": "9 Thompson Avenue, Leonardo, NJ 07737, USA"
}, {
"location": {
"latitude": 410322033,
"longitude": -747871659
},
"name": ""
}, {
"location": {
"latitude": 407100674,
"longitude": -747742727
},
"name": ""
}, {
"location": {
"latitude": 418811433,
"longitude": -741718005
},
"name": "213 Bush Road, Stone Ridge, NY 12484, USA"
}, {
"location": {
"latitude": 415034302,
"longitude": -743850945
},
"name": ""
}, {
"location": {
"latitude": 411349992,
"longitude": -743694161
},
"name": ""
}, {
"location": {
"latitude": 404839914,
"longitude": -744759616
},
"name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA"
}, {
"location": {
"latitude": 414638017,
"longitude": -745957854
},
"name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA"
}, {
"location": {
"latitude": 412127800,
"longitude": -740173578
},
"name": ""
}, {
"location": {
"latitude": 401263460,
"longitude": -747964303
},
"name": ""
}, {
"location": {
"latitude": 412843391,
"longitude": -749086026
},
"name": ""
}, {
"location": {
"latitude": 418512773,
"longitude": -743067823
},
"name": ""
}, {
"location": {
"latitude": 404318328,
"longitude": -740835638
},
"name": "42-102 Main Street, Belford, NJ 07718, USA"
}, {
"location": {
"latitude": 419020746,
"longitude": -741172328
},
"name": ""
}, {
"location": {
"latitude": 404080723,
"longitude": -746119569
},
"name": ""
}, {
"location": {
"latitude": 401012643,
"longitude": -744035134
},
"name": ""
}, {
"location": {
"latitude": 404306372,
"longitude": -741079661
},
"name": ""
}, {
"location": {
"latitude": 403966326,
"longitude": -748519297
},
"name": ""
}, {
"location": {
"latitude": 405002031,
"longitude": -748407866
},
"name": ""
}, {
"location": {
"latitude": 409532885,
"longitude": -742200683
},
"name": ""
}, {
"location": {
"latitude": 416851321,
"longitude": -742674555
},
"name": ""
}, {
"location": {
"latitude": 406411633,
"longitude": -741722051
},
"name": "3387 Richmond Terrace, Staten Island, NY 10303, USA"
}, {
"location": {
"latitude": 413069058,
"longitude": -744597778
},
"name": "261 Van Sickle Road, Goshen, NY 10924, USA"
}, {
"location": {
"latitude": 418465462,
"longitude": -746859398
},
"name": ""
}, {
"location": {
"latitude": 411733222,
"longitude": -744228360
},
"name": ""
}, {
"location": {
"latitude": 410248224,
"longitude": -747127767
},
"name": "3 Hasta Way, Newton, NJ 07860, USA"
}]`)

0
test/template/.gitignore vendored Normal file
View File

3
test/template/Dockerfile Normal file
View File

@@ -0,0 +1,3 @@
FROM alpine
ADD idiomatic /idiomatic
ENTRYPOINT [ "/idiomatic" ]

17
test/template/Makefile Normal file
View File

@@ -0,0 +1,17 @@
GOPATH:=$(shell go env GOPATH)
.PHONY: proto
proto:
protoc --proto_path=. --micro_out=. --go_out=:. proto/idiomatic.proto
.PHONY: build
build:
go build -o idiomatic *.go
.PHONY: test
test:
go test -v ./... -cover
.PHONY: docker
docker:
docker build . -t idiomatic:latest

53
test/template/README.md Normal file
View File

@@ -0,0 +1,53 @@
# Template Service
This is an example of a service template
Generated with
```
micro new template
```
## Getting Started
- [Configuration](#configuration)
- [Dependencies](#dependencies)
- [Usage](#usage)
## Configuration
- Alias: template
## Dependencies
Micro services depend on service discovery. The default is multicast DNS, a zeroconf system.
In the event you need a resilient multi-host setup we recommend etcd.
```
# install etcd
brew install etcd
# run etcd
etcd
```
## Usage
A Makefile is included for convenience
Build the binary
```
make build
```
Run the service
```
./template
```
Build a docker image
```
make docker
```

View File

@@ -0,0 +1,24 @@
package main
import (
"github.com/micro/services/template/handler"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
)
func main() {
// Create service
srv := service.New(
service.Name("idiomatic"),
service.Version("latest"),
)
// Register handler
srv.Handle(new(handler.Idiomatic))
// Run service
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
}

View File

@@ -0,0 +1,2 @@
package main
//go:generate make proto

View File

@@ -0,0 +1,48 @@
package handler
import (
"context"
log "github.com/micro/micro/v3/service/logger"
idiomatic "github.com/micro/services/template/proto"
)
type Idiomatic struct{}
// Call is a single request handler called via client.Call or the generated client code
func (e *Idiomatic) Call(ctx context.Context, req *idiomatic.Request, rsp *idiomatic.Response) error {
log.Info("Received Idiomatic.Call request")
rsp.Msg = "Hello " + req.Name
return nil
}
// Stream is a server side stream handler called via client.Stream or the generated client code
func (e *Idiomatic) Stream(ctx context.Context, req *idiomatic.StreamingRequest, stream idiomatic.Idiomatic_StreamStream) error {
log.Infof("Received Idiomatic.Stream request with count: %d", req.Count)
for i := 0; i < int(req.Count); i++ {
log.Infof("Responding: %d", i)
if err := stream.Send(&idiomatic.StreamingResponse{
Count: int64(i),
}); err != nil {
return err
}
}
return nil
}
// PingPong is a bidirectional stream handler called via client.Stream or the generated client code
func (e *Idiomatic) PingPong(ctx context.Context, stream idiomatic.Idiomatic_PingPongStream) error {
for {
req, err := stream.Recv()
if err != nil {
return err
}
log.Infof("Got ping %v", req.Stroke)
if err := stream.Send(&idiomatic.Pong{Stroke: req.Stroke}); err != nil {
return err
}
}
}

View File

@@ -0,0 +1,327 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: proto/idiomatic.proto
package idiomatic
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Message struct {
Say string `protobuf:"bytes,1,opt,name=say,proto3" json:"say,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{0}
}
func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b)
}
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Message.Marshal(b, m, deterministic)
}
func (m *Message) XXX_Merge(src proto.Message) {
xxx_messageInfo_Message.Merge(m, src)
}
func (m *Message) XXX_Size() int {
return xxx_messageInfo_Message.Size(m)
}
func (m *Message) XXX_DiscardUnknown() {
xxx_messageInfo_Message.DiscardUnknown(m)
}
var xxx_messageInfo_Message proto.InternalMessageInfo
func (m *Message) GetSay() string {
if m != nil {
return m.Say
}
return ""
}
type Request struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Request) Reset() { *m = Request{} }
func (m *Request) String() string { return proto.CompactTextString(m) }
func (*Request) ProtoMessage() {}
func (*Request) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{1}
}
func (m *Request) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Request.Unmarshal(m, b)
}
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Request.Marshal(b, m, deterministic)
}
func (m *Request) XXX_Merge(src proto.Message) {
xxx_messageInfo_Request.Merge(m, src)
}
func (m *Request) XXX_Size() int {
return xxx_messageInfo_Request.Size(m)
}
func (m *Request) XXX_DiscardUnknown() {
xxx_messageInfo_Request.DiscardUnknown(m)
}
var xxx_messageInfo_Request proto.InternalMessageInfo
func (m *Request) GetName() string {
if m != nil {
return m.Name
}
return ""
}
type Response struct {
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{2}
}
func (m *Response) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Response.Unmarshal(m, b)
}
func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Response.Marshal(b, m, deterministic)
}
func (m *Response) XXX_Merge(src proto.Message) {
xxx_messageInfo_Response.Merge(m, src)
}
func (m *Response) XXX_Size() int {
return xxx_messageInfo_Response.Size(m)
}
func (m *Response) XXX_DiscardUnknown() {
xxx_messageInfo_Response.DiscardUnknown(m)
}
var xxx_messageInfo_Response proto.InternalMessageInfo
func (m *Response) GetMsg() string {
if m != nil {
return m.Msg
}
return ""
}
type StreamingRequest struct {
Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StreamingRequest) Reset() { *m = StreamingRequest{} }
func (m *StreamingRequest) String() string { return proto.CompactTextString(m) }
func (*StreamingRequest) ProtoMessage() {}
func (*StreamingRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{3}
}
func (m *StreamingRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamingRequest.Unmarshal(m, b)
}
func (m *StreamingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StreamingRequest.Marshal(b, m, deterministic)
}
func (m *StreamingRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_StreamingRequest.Merge(m, src)
}
func (m *StreamingRequest) XXX_Size() int {
return xxx_messageInfo_StreamingRequest.Size(m)
}
func (m *StreamingRequest) XXX_DiscardUnknown() {
xxx_messageInfo_StreamingRequest.DiscardUnknown(m)
}
var xxx_messageInfo_StreamingRequest proto.InternalMessageInfo
func (m *StreamingRequest) GetCount() int64 {
if m != nil {
return m.Count
}
return 0
}
type StreamingResponse struct {
Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StreamingResponse) Reset() { *m = StreamingResponse{} }
func (m *StreamingResponse) String() string { return proto.CompactTextString(m) }
func (*StreamingResponse) ProtoMessage() {}
func (*StreamingResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{4}
}
func (m *StreamingResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamingResponse.Unmarshal(m, b)
}
func (m *StreamingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StreamingResponse.Marshal(b, m, deterministic)
}
func (m *StreamingResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_StreamingResponse.Merge(m, src)
}
func (m *StreamingResponse) XXX_Size() int {
return xxx_messageInfo_StreamingResponse.Size(m)
}
func (m *StreamingResponse) XXX_DiscardUnknown() {
xxx_messageInfo_StreamingResponse.DiscardUnknown(m)
}
var xxx_messageInfo_StreamingResponse proto.InternalMessageInfo
func (m *StreamingResponse) GetCount() int64 {
if m != nil {
return m.Count
}
return 0
}
type Ping struct {
Stroke int64 `protobuf:"varint,1,opt,name=stroke,proto3" json:"stroke,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Ping) Reset() { *m = Ping{} }
func (m *Ping) String() string { return proto.CompactTextString(m) }
func (*Ping) ProtoMessage() {}
func (*Ping) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{5}
}
func (m *Ping) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ping.Unmarshal(m, b)
}
func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Ping.Marshal(b, m, deterministic)
}
func (m *Ping) XXX_Merge(src proto.Message) {
xxx_messageInfo_Ping.Merge(m, src)
}
func (m *Ping) XXX_Size() int {
return xxx_messageInfo_Ping.Size(m)
}
func (m *Ping) XXX_DiscardUnknown() {
xxx_messageInfo_Ping.DiscardUnknown(m)
}
var xxx_messageInfo_Ping proto.InternalMessageInfo
func (m *Ping) GetStroke() int64 {
if m != nil {
return m.Stroke
}
return 0
}
type Pong struct {
Stroke int64 `protobuf:"varint,1,opt,name=stroke,proto3" json:"stroke,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Pong) Reset() { *m = Pong{} }
func (m *Pong) String() string { return proto.CompactTextString(m) }
func (*Pong) ProtoMessage() {}
func (*Pong) Descriptor() ([]byte, []int) {
return fileDescriptor_70718d389c4b1652, []int{6}
}
func (m *Pong) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Pong.Unmarshal(m, b)
}
func (m *Pong) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Pong.Marshal(b, m, deterministic)
}
func (m *Pong) XXX_Merge(src proto.Message) {
xxx_messageInfo_Pong.Merge(m, src)
}
func (m *Pong) XXX_Size() int {
return xxx_messageInfo_Pong.Size(m)
}
func (m *Pong) XXX_DiscardUnknown() {
xxx_messageInfo_Pong.DiscardUnknown(m)
}
var xxx_messageInfo_Pong proto.InternalMessageInfo
func (m *Pong) GetStroke() int64 {
if m != nil {
return m.Stroke
}
return 0
}
func init() {
proto.RegisterType((*Message)(nil), "idiomatic.Message")
proto.RegisterType((*Request)(nil), "idiomatic.Request")
proto.RegisterType((*Response)(nil), "idiomatic.Response")
proto.RegisterType((*StreamingRequest)(nil), "idiomatic.StreamingRequest")
proto.RegisterType((*StreamingResponse)(nil), "idiomatic.StreamingResponse")
proto.RegisterType((*Ping)(nil), "idiomatic.Ping")
proto.RegisterType((*Pong)(nil), "idiomatic.Pong")
}
func init() { proto.RegisterFile("proto/idiomatic.proto", fileDescriptor_70718d389c4b1652) }
var fileDescriptor_70718d389c4b1652 = []byte{
// 270 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0x3f, 0x4f, 0xc3, 0x30,
0x10, 0xc5, 0x6b, 0xb5, 0xa4, 0xcd, 0x2d, 0x6d, 0x8f, 0x3f, 0x42, 0x69, 0x41, 0xc8, 0x53, 0x58,
0x4a, 0x29, 0x23, 0x1b, 0x0c, 0x88, 0x01, 0x09, 0x85, 0x8d, 0xcd, 0x14, 0xcb, 0xb2, 0xa8, 0xed,
0x92, 0x73, 0x07, 0x3e, 0x1b, 0x5f, 0x0e, 0xc5, 0x71, 0x4a, 0x8a, 0xca, 0x76, 0xf7, 0x7e, 0xef,
0x4e, 0xef, 0x6c, 0x38, 0x5e, 0x97, 0xce, 0xbb, 0x2b, 0xfd, 0xae, 0x9d, 0x11, 0x5e, 0x2f, 0x67,
0xa1, 0xc7, 0x74, 0x2b, 0xf0, 0x09, 0xf4, 0x9f, 0x24, 0x91, 0x50, 0x12, 0x47, 0xd0, 0x25, 0xf1,
0x75, 0xca, 0x2e, 0x58, 0x9e, 0x16, 0x55, 0xc9, 0xcf, 0xa0, 0x5f, 0xc8, 0xcf, 0x8d, 0x24, 0x8f,
0x08, 0x3d, 0x2b, 0x8c, 0x8c, 0x34, 0xd4, 0x7c, 0x0a, 0x83, 0x42, 0xd2, 0xda, 0x59, 0x0a, 0xc3,
0x86, 0x54, 0x33, 0x6c, 0x48, 0xf1, 0x1c, 0x46, 0x2f, 0xbe, 0x94, 0xc2, 0x68, 0xab, 0x9a, 0x2d,
0x47, 0x70, 0xb0, 0x74, 0x1b, 0xeb, 0x83, 0xaf, 0x5b, 0xd4, 0x0d, 0xbf, 0x84, 0x71, 0xcb, 0x19,
0x17, 0xee, 0xb7, 0x9e, 0x43, 0xef, 0x59, 0x5b, 0x85, 0x27, 0x90, 0x90, 0x2f, 0xdd, 0x87, 0x8c,
0x38, 0x76, 0x81, 0xbb, 0xff, 0xf9, 0xe2, 0x9b, 0x41, 0xfa, 0xd8, 0x1c, 0x8f, 0xd7, 0xd0, 0xbb,
0x17, 0xab, 0x15, 0xe2, 0xec, 0xf7, 0x85, 0x62, 0xd4, 0xec, 0x70, 0x47, 0xab, 0x43, 0xf1, 0x0e,
0x3e, 0x40, 0x52, 0x67, 0xc5, 0x49, 0xcb, 0xf0, 0xf7, 0xd0, 0x6c, 0xba, 0x1f, 0x36, 0x6b, 0xe6,
0x0c, 0x17, 0x30, 0xa8, 0x2e, 0x09, 0x69, 0x87, 0x2d, 0x77, 0x25, 0x66, 0x3b, 0x82, 0xb3, 0x8a,
0x77, 0x72, 0x36, 0x67, 0x77, 0xe3, 0xd7, 0x61, 0xf8, 0xc0, 0xdb, 0x2d, 0x7d, 0x4b, 0x82, 0x70,
0xf3, 0x13, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xd7, 0xdf, 0x69, 0xea, 0x01, 0x00, 0x00,
}

View File

@@ -0,0 +1,284 @@
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/idiomatic.proto
package idiomatic
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
import (
context "context"
api "github.com/micro/go-micro/v3/api"
client "github.com/micro/go-micro/v3/client"
server "github.com/micro/go-micro/v3/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option
// Api Endpoints for Idiomatic service
func NewIdiomaticEndpoints() []*api.Endpoint {
return []*api.Endpoint{}
}
// Client API for Idiomatic service
type IdiomaticService interface {
Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
Stream(ctx context.Context, in *StreamingRequest, opts ...client.CallOption) (Idiomatic_StreamService, error)
PingPong(ctx context.Context, opts ...client.CallOption) (Idiomatic_PingPongService, error)
}
type idiomaticService struct {
c client.Client
name string
}
func NewIdiomaticService(name string, c client.Client) IdiomaticService {
return &idiomaticService{
c: c,
name: name,
}
}
func (c *idiomaticService) Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Idiomatic.Call", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *idiomaticService) Stream(ctx context.Context, in *StreamingRequest, opts ...client.CallOption) (Idiomatic_StreamService, error) {
req := c.c.NewRequest(c.name, "Idiomatic.Stream", &StreamingRequest{})
stream, err := c.c.Stream(ctx, req, opts...)
if err != nil {
return nil, err
}
if err := stream.Send(in); err != nil {
return nil, err
}
return &idiomaticServiceStream{stream}, nil
}
type Idiomatic_StreamService interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Recv() (*StreamingResponse, error)
}
type idiomaticServiceStream struct {
stream client.Stream
}
func (x *idiomaticServiceStream) Close() error {
return x.stream.Close()
}
func (x *idiomaticServiceStream) Context() context.Context {
return x.stream.Context()
}
func (x *idiomaticServiceStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *idiomaticServiceStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *idiomaticServiceStream) Recv() (*StreamingResponse, error) {
m := new(StreamingResponse)
err := x.stream.Recv(m)
if err != nil {
return nil, err
}
return m, nil
}
func (c *idiomaticService) PingPong(ctx context.Context, opts ...client.CallOption) (Idiomatic_PingPongService, error) {
req := c.c.NewRequest(c.name, "Idiomatic.PingPong", &Ping{})
stream, err := c.c.Stream(ctx, req, opts...)
if err != nil {
return nil, err
}
return &idiomaticServicePingPong{stream}, nil
}
type Idiomatic_PingPongService interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*Ping) error
Recv() (*Pong, error)
}
type idiomaticServicePingPong struct {
stream client.Stream
}
func (x *idiomaticServicePingPong) Close() error {
return x.stream.Close()
}
func (x *idiomaticServicePingPong) Context() context.Context {
return x.stream.Context()
}
func (x *idiomaticServicePingPong) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *idiomaticServicePingPong) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *idiomaticServicePingPong) Send(m *Ping) error {
return x.stream.Send(m)
}
func (x *idiomaticServicePingPong) Recv() (*Pong, error) {
m := new(Pong)
err := x.stream.Recv(m)
if err != nil {
return nil, err
}
return m, nil
}
// Server API for Idiomatic service
type IdiomaticHandler interface {
Call(context.Context, *Request, *Response) error
Stream(context.Context, *StreamingRequest, Idiomatic_StreamStream) error
PingPong(context.Context, Idiomatic_PingPongStream) error
}
func RegisterIdiomaticHandler(s server.Server, hdlr IdiomaticHandler, opts ...server.HandlerOption) error {
type idiomatic interface {
Call(ctx context.Context, in *Request, out *Response) error
Stream(ctx context.Context, stream server.Stream) error
PingPong(ctx context.Context, stream server.Stream) error
}
type Idiomatic struct {
idiomatic
}
h := &idiomaticHandler{hdlr}
return s.Handle(s.NewHandler(&Idiomatic{h}, opts...))
}
type idiomaticHandler struct {
IdiomaticHandler
}
func (h *idiomaticHandler) Call(ctx context.Context, in *Request, out *Response) error {
return h.IdiomaticHandler.Call(ctx, in, out)
}
func (h *idiomaticHandler) Stream(ctx context.Context, stream server.Stream) error {
m := new(StreamingRequest)
if err := stream.Recv(m); err != nil {
return err
}
return h.IdiomaticHandler.Stream(ctx, m, &idiomaticStreamStream{stream})
}
type Idiomatic_StreamStream interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*StreamingResponse) error
}
type idiomaticStreamStream struct {
stream server.Stream
}
func (x *idiomaticStreamStream) Close() error {
return x.stream.Close()
}
func (x *idiomaticStreamStream) Context() context.Context {
return x.stream.Context()
}
func (x *idiomaticStreamStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *idiomaticStreamStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *idiomaticStreamStream) Send(m *StreamingResponse) error {
return x.stream.Send(m)
}
func (h *idiomaticHandler) PingPong(ctx context.Context, stream server.Stream) error {
return h.IdiomaticHandler.PingPong(ctx, &idiomaticPingPongStream{stream})
}
type Idiomatic_PingPongStream interface {
Context() context.Context
SendMsg(interface{}) error
RecvMsg(interface{}) error
Close() error
Send(*Pong) error
Recv() (*Ping, error)
}
type idiomaticPingPongStream struct {
stream server.Stream
}
func (x *idiomaticPingPongStream) Close() error {
return x.stream.Close()
}
func (x *idiomaticPingPongStream) Context() context.Context {
return x.stream.Context()
}
func (x *idiomaticPingPongStream) SendMsg(m interface{}) error {
return x.stream.Send(m)
}
func (x *idiomaticPingPongStream) RecvMsg(m interface{}) error {
return x.stream.Recv(m)
}
func (x *idiomaticPingPongStream) Send(m *Pong) error {
return x.stream.Send(m)
}
func (x *idiomaticPingPongStream) Recv() (*Ping, error) {
m := new(Ping)
if err := x.stream.Recv(m); err != nil {
return nil, err
}
return m, nil
}

View File

@@ -0,0 +1,39 @@
syntax = "proto3";
package idiomatic;
option go_package = "proto;idiomatic";
service Idiomatic {
rpc Call(Request) returns (Response) {}
rpc Stream(StreamingRequest) returns (stream StreamingResponse) {}
rpc PingPong(stream Ping) returns (stream Pong) {}
}
message Message {
string say = 1;
}
message Request {
string name = 1;
}
message Response {
string msg = 1;
}
message StreamingRequest {
int64 count = 1;
}
message StreamingResponse {
int64 count = 1;
}
message Ping {
int64 stroke = 1;
}
message Pong {
int64 stroke = 1;
}