netx

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 5, 2018 License: MIT Imports: 14 Imported by: 0

README

netx - Semantic addressing extention for go's net package

GoDoc Build Status

This package provides an extention of go stdlib's net package. It provides extended Listen and Dial methods in order to enabled clients and servers for semantic addressing. The returned structs implement net.Listener and net.Conn and should seamlessly integrate with your existing application.

For transport/service organisation, NATS, consul or DNSSRV can be used. An implementation of quic is in development.

The following examples require a local NATS node on port 4222.

TCP connection example

import (
  "fmt"

  "github.com/simia-tech/netx"
  _ "github.com/simia-tech/netx/network/nats"
)

func main() {
  listener, _ := netx.Listen("nats", "echo", netx.Nodes("nats://localhost:4222"))
  go func() {
    conn, _ := listener.Accept()
    defer conn.Close()

    buffer := make([]byte, 5)
    conn.Read(buffer)
    conn.Write(buffer)
  }()

  client, _ := netx.Dial("nats", "echo", netx.Nodes("nats://localhost:4222"))
  defer client.Close()

  fmt.Fprintf(client, "hello")

  buffer := make([]byte, 5)
  client.Read(buffer)

  fmt.Println(string(buffer))
  // Output: hello
}

HTTP connection example

import (
  "net/http"
  "fmt"
  "io/ioutil"

  "github.com/simia-tech/netx"
  _ "github.com/simia-tech/netx/network/nats"
)

func main() {
  listener, _ := netx.Listen("nats", "greeter", netx.Nodes("nats://localhost:4222"))

  mux := &http.ServeMux{}
  mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
  })

  server := &http.Server{Handler: mux}
  go func() {
    server.Serve(listener)
  }()

  client := &http.Client{
    Transport: netx.NewHTTPTransport("nats", netx.Nodes("nats://localhost:4222")),
  }
  response, _ := client.Get("http://greeter/hello")
  defer response.Body.Close()

  body, _ := ioutil.ReadAll(response.Body)
  fmt.Println(string(body))
  // Output: Hello
}

GRPC connection example

import (
	"fmt"
	"log"
	"time"

	"golang.org/x/net/context"
	"google.golang.org/grpc"

	"github.com/simia-tech/netx"
	_ "github.com/simia-tech/netx/network/nats"
)

type echoServer struct{}

func (e *echoServer) Echo(ctx context.Context, request *EchoRequest) (*EchoResponse, error) {
	return &EchoResponse{Text: request.Text}, nil
}

func main() {
	listener, _ := netx.Listen("nats", "echo", netx.Nodes("nats://localhost:4222"))

	server := grpc.NewServer()
	RegisterEchoServiceServer(server, &echoServer{})

	go func() {
		server.Serve(listener)
	}()

	conn, _ := grpc.Dial("echo",
		grpc.WithDialer(netx.NewGRPCDialer("nats", netx.Nodes("nats://localhost:4222"))),
		grpc.WithInsecure())

	client := NewEchoServiceClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	response, _ := client.Echo(ctx, &EchoRequest{Text: "Hello"})
	cancel()

	fmt.Println(response.Text)
	// Output: Hello
}

More examples

More example can be found in the example directory.

Tests

In order to run the tests, type

go test -v ./...

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrServiceUnavailable = errors.New("service unavailable")
)

Definition of possible errors.

Functions

func Dial

func Dial(ctx context.Context, network, address string, options ...value.Option) (net.Conn, error)

Dial establishs a connection on the provided network to the provided address.

func DialMulticast

func DialMulticast(network, address string, options ...value.Option) (io.WriteCloser, error)

DialMulticast opens a multicast connection on the provided network to the provided address.

func Listen

func Listen(network, address string, options ...value.Option) (net.Listener, error)

Listen creates a listener on the provided network at the provided address.

func ListenAndDialMulticast

func ListenAndDialMulticast(network, readAddress, writeAddress string, options ...value.Option) (io.ReadWriteCloser, error)

ListenAndDialMulticast listens to the provided readAddress and dials the provided writeAddress. The result is combined in the returned io.ReadWriteCloser interface.

func ListenMulticast

func ListenMulticast(network, address string, options ...value.Option) (io.ReadCloser, error)

ListenMulticast creates a multicast connection on the provided network at the provided address.

func NewGRPCDialer

func NewGRPCDialer(network string, options ...value.Option) func(string, time.Duration) (net.Conn, error)

NewGRPCDialer returns a dialer that can be passed to the grpc.Dial function.

func NewGRPCMultiDialer

func NewGRPCMultiDialer(md *MultiDialer) func(string, time.Duration) (net.Conn, error)

NewGRPCMultiDialer returns a dialer that can be passed to the grpc.Dial function.

func NewHTTPMultiTransport

func NewHTTPMultiTransport(md *MultiDialer) *http.Transport

NewHTTPMultiTransport returns a new transport instance that uses the provided MultiDialer.

func NewHTTPTransport

func NewHTTPTransport(network string, options ...value.Option) *http.Transport

NewHTTPTransport returns a new transport instance for a http client. The instance will use netx.Dial to establish a connection.

func RandomAddress

func RandomAddress(prefix string) string

RandomAddress returns a random address with the provided prefix.

func RegisterDial

func RegisterDial(network string, dialFunc DialFunc)

RegisterDial registers the provided Dial method under the provided network name.

func RegisterDialMulticast

func RegisterDialMulticast(network string, dialMulticastFunc DialMulticastFunc)

RegisterDialMulticast registers the provided DialMulticast method under the provided network name.

func RegisterListen

func RegisterListen(network string, listenFunc ListenFunc)

RegisterListen registers the provided Listen method under the provided network name.

func RegisterListenMulticast

func RegisterListenMulticast(network string, listenMulticastFunc ListenMulticastFunc)

RegisterListenMulticast registers the provided Listen method under the provided network name.

func RegisteredDialMulticastNetworks

func RegisteredDialMulticastNetworks() []string

RegisteredDialMulticastNetworks returns the available networks for the DialMulticast function.

func RegisteredDialNetworks

func RegisteredDialNetworks() []string

RegisteredDialNetworks returns the available networks for the Dial function.

func RegisteredListenMulticastNetworks

func RegisteredListenMulticastNetworks() []string

RegisteredListenMulticastNetworks returns the available networks for the ListenMulticast function.

func RegisteredListenNetworks

func RegisteredListenNetworks() []string

RegisteredListenNetworks returns the available networks for the Listen function.

Types

type DialFunc

type DialFunc func(context.Context, string, *value.Options) (net.Conn, error)

DialFunc defines the signature of the Dial function.

type DialMulticastFunc

type DialMulticastFunc func(string, *value.Options) (io.WriteCloser, error)

DialMulticastFunc defines the signature of the Dial function.

type ListenFunc

type ListenFunc func(string, *value.Options) (net.Listener, error)

ListenFunc defines the signature of the Listen function.

type ListenMulticastFunc

type ListenMulticastFunc func(string, *value.Options) (io.ReadCloser, error)

ListenMulticastFunc defines the signature of the ListenMulticast function.

type MultiDialer

type MultiDialer struct {
	// contains filtered or unexported fields
}

MultiDialer implements a multi dialer.

func NewMultiDialer

NewMultiDialer returns a new nulti dialer.

func (*MultiDialer) Dial

func (md *MultiDialer) Dial(ctx context.Context, service string) (net.Conn, error)

Dial dials one the endpoints from the provided service.

Directories

Path Synopsis
example
nats-grpc
Package main is a generated protocol buffer package.
Package main is a generated protocol buffer package.
Package model is a generated protocol buffer package.
Package model is a generated protocol buffer package.
network
udp

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL