Restructure go-micro layout and plugins
This commit is contained in:
11
transport/http/http.go
Normal file
11
transport/http/http.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package http
|
||||
|
||||
// This is a hack
|
||||
|
||||
import (
|
||||
"github.com/myodc/go-micro/transport"
|
||||
)
|
||||
|
||||
func NewTransport(addrs []string, opt ...transport.Option) transport.Transport {
|
||||
return transport.NewTransport(addrs, opt...)
|
||||
}
|
||||
@@ -13,21 +13,21 @@ type headerRoundTripper struct {
|
||||
r http.RoundTripper
|
||||
}
|
||||
|
||||
type HttpTransport struct {
|
||||
type httpTransport struct {
|
||||
client *http.Client
|
||||
}
|
||||
|
||||
type HttpTransportClient struct {
|
||||
ht *HttpTransport
|
||||
type httpTransportClient struct {
|
||||
ht *httpTransport
|
||||
addr string
|
||||
}
|
||||
|
||||
type HttpTransportSocket struct {
|
||||
type httpTransportSocket struct {
|
||||
r *http.Request
|
||||
w http.ResponseWriter
|
||||
}
|
||||
|
||||
type HttpTransportListener struct {
|
||||
type httpTransportListener struct {
|
||||
listener net.Listener
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ func (t *headerRoundTripper) RoundTrip(r *http.Request) (*http.Response, error)
|
||||
return t.r.RoundTrip(r)
|
||||
}
|
||||
|
||||
func (h *HttpTransportClient) Send(m *Message) (*Message, error) {
|
||||
func (h *httpTransportClient) Send(m *Message) (*Message, error) {
|
||||
header := make(http.Header)
|
||||
|
||||
for k, v := range m.Header {
|
||||
@@ -88,11 +88,11 @@ func (h *HttpTransportClient) Send(m *Message) (*Message, error) {
|
||||
return mr, nil
|
||||
}
|
||||
|
||||
func (h *HttpTransportClient) Close() error {
|
||||
func (h *httpTransportClient) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *HttpTransportSocket) Recv(m *Message) error {
|
||||
func (h *httpTransportSocket) Recv(m *Message) error {
|
||||
if m == nil {
|
||||
return errors.New("message passed in is nil")
|
||||
}
|
||||
@@ -119,7 +119,7 @@ func (h *HttpTransportSocket) Recv(m *Message) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *HttpTransportSocket) Send(m *Message) error {
|
||||
func (h *httpTransportSocket) Send(m *Message) error {
|
||||
for k, v := range m.Header {
|
||||
h.w.Header().Set(k, v)
|
||||
}
|
||||
@@ -128,22 +128,22 @@ func (h *HttpTransportSocket) Send(m *Message) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (h *HttpTransportSocket) Close() error {
|
||||
func (h *httpTransportSocket) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *HttpTransportListener) Addr() string {
|
||||
func (h *httpTransportListener) Addr() string {
|
||||
return h.listener.Addr().String()
|
||||
}
|
||||
|
||||
func (h *HttpTransportListener) Close() error {
|
||||
func (h *httpTransportListener) Close() error {
|
||||
return h.listener.Close()
|
||||
}
|
||||
|
||||
func (h *HttpTransportListener) Accept(fn func(Socket)) error {
|
||||
func (h *httpTransportListener) Accept(fn func(Socket)) error {
|
||||
srv := &http.Server{
|
||||
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
fn(&HttpTransportSocket{
|
||||
fn(&httpTransportSocket{
|
||||
r: r,
|
||||
w: w,
|
||||
})
|
||||
@@ -153,27 +153,27 @@ func (h *HttpTransportListener) Accept(fn func(Socket)) error {
|
||||
return srv.Serve(h.listener)
|
||||
}
|
||||
|
||||
func (h *HttpTransport) Dial(addr string) (Client, error) {
|
||||
return &HttpTransportClient{
|
||||
func (h *httpTransport) Dial(addr string) (Client, error) {
|
||||
return &httpTransportClient{
|
||||
ht: h,
|
||||
addr: addr,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (h *HttpTransport) Listen(addr string) (Listener, error) {
|
||||
func (h *httpTransport) Listen(addr string) (Listener, error) {
|
||||
l, err := net.Listen("tcp", addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &HttpTransportListener{
|
||||
return &httpTransportListener{
|
||||
listener: l,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewHttpTransport(addrs []string) *HttpTransport {
|
||||
func newHttpTransport(addrs []string, opt ...Option) *httpTransport {
|
||||
client := &http.Client{}
|
||||
client.Transport = &headerRoundTripper{http.DefaultTransport}
|
||||
|
||||
return &HttpTransport{client: client}
|
||||
return &httpTransport{client: client}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package transport
|
||||
package nats
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -7,29 +7,30 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/apcera/nats"
|
||||
"github.com/myodc/go-micro/transport"
|
||||
)
|
||||
|
||||
type NatsTransport struct {
|
||||
type ntport struct {
|
||||
addrs []string
|
||||
}
|
||||
|
||||
type NatsTransportClient struct {
|
||||
type ntportClient struct {
|
||||
conn *nats.Conn
|
||||
addr string
|
||||
}
|
||||
|
||||
type NatsTransportSocket struct {
|
||||
type ntportSocket struct {
|
||||
conn *nats.Conn
|
||||
m *nats.Msg
|
||||
}
|
||||
|
||||
type NatsTransportListener struct {
|
||||
type ntportListener struct {
|
||||
conn *nats.Conn
|
||||
addr string
|
||||
exit chan bool
|
||||
}
|
||||
|
||||
func (n *NatsTransportClient) Send(m *Message) (*Message, error) {
|
||||
func (n *ntportClient) Send(m *transport.Message) (*transport.Message, error) {
|
||||
b, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -40,7 +41,7 @@ func (n *NatsTransportClient) Send(m *Message) (*Message, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var mr *Message
|
||||
var mr *transport.Message
|
||||
if err := json.Unmarshal(rsp.Data, &mr); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -48,12 +49,12 @@ func (n *NatsTransportClient) Send(m *Message) (*Message, error) {
|
||||
return mr, nil
|
||||
}
|
||||
|
||||
func (n *NatsTransportClient) Close() error {
|
||||
func (n *ntportClient) Close() error {
|
||||
n.conn.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NatsTransportSocket) Recv(m *Message) error {
|
||||
func (n *ntportSocket) Recv(m *transport.Message) error {
|
||||
if m == nil {
|
||||
return errors.New("message passed in is nil")
|
||||
}
|
||||
@@ -64,7 +65,7 @@ func (n *NatsTransportSocket) Recv(m *Message) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NatsTransportSocket) Send(m *Message) error {
|
||||
func (n *ntportSocket) Send(m *transport.Message) error {
|
||||
b, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -72,23 +73,23 @@ func (n *NatsTransportSocket) Send(m *Message) error {
|
||||
return n.conn.Publish(n.m.Reply, b)
|
||||
}
|
||||
|
||||
func (n *NatsTransportSocket) Close() error {
|
||||
func (n *ntportSocket) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NatsTransportListener) Addr() string {
|
||||
func (n *ntportListener) Addr() string {
|
||||
return n.addr
|
||||
}
|
||||
|
||||
func (n *NatsTransportListener) Close() error {
|
||||
func (n *ntportListener) Close() error {
|
||||
n.exit <- true
|
||||
n.conn.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NatsTransportListener) Accept(fn func(Socket)) error {
|
||||
func (n *ntportListener) Accept(fn func(transport.Socket)) error {
|
||||
s, err := n.conn.Subscribe(n.addr, func(m *nats.Msg) {
|
||||
fn(&NatsTransportSocket{
|
||||
fn(&ntportSocket{
|
||||
conn: n.conn,
|
||||
m: m,
|
||||
})
|
||||
@@ -101,7 +102,7 @@ func (n *NatsTransportListener) Accept(fn func(Socket)) error {
|
||||
return s.Unsubscribe()
|
||||
}
|
||||
|
||||
func (n *NatsTransport) Dial(addr string) (Client, error) {
|
||||
func (n *ntport) Dial(addr string) (transport.Client, error) {
|
||||
cAddr := nats.DefaultURL
|
||||
|
||||
if len(n.addrs) > 0 && strings.HasPrefix(n.addrs[0], "nats://") {
|
||||
@@ -113,13 +114,13 @@ func (n *NatsTransport) Dial(addr string) (Client, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &NatsTransportClient{
|
||||
return &ntportClient{
|
||||
conn: c,
|
||||
addr: addr,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (n *NatsTransport) Listen(addr string) (Listener, error) {
|
||||
func (n *ntport) Listen(addr string) (transport.Listener, error) {
|
||||
cAddr := nats.DefaultURL
|
||||
|
||||
if len(n.addrs) > 0 && strings.HasPrefix(n.addrs[0], "nats://") {
|
||||
@@ -131,15 +132,15 @@ func (n *NatsTransport) Listen(addr string) (Listener, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &NatsTransportListener{
|
||||
return &ntportListener{
|
||||
addr: nats.NewInbox(),
|
||||
conn: c,
|
||||
exit: make(chan bool, 1),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewNatsTransport(addrs []string) *NatsTransport {
|
||||
return &NatsTransport{
|
||||
func NewTransport(addrs []string, opt ...transport.Option) transport.Transport {
|
||||
return &ntport{
|
||||
addrs: addrs,
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package transport
|
||||
package rabbitmq
|
||||
|
||||
//
|
||||
// All credit to Mondo
|
||||
@@ -1,4 +1,4 @@
|
||||
package transport
|
||||
package rabbitmq
|
||||
|
||||
//
|
||||
// All credit to Mondo
|
||||
@@ -1,4 +1,4 @@
|
||||
package transport
|
||||
package rabbitmq
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -8,16 +8,18 @@ import (
|
||||
"errors"
|
||||
uuid "github.com/nu7hatch/gouuid"
|
||||
"github.com/streadway/amqp"
|
||||
|
||||
"github.com/myodc/go-micro/transport"
|
||||
)
|
||||
|
||||
type RabbitMQTransport struct {
|
||||
type rmqtport struct {
|
||||
conn *rabbitMQConn
|
||||
addrs []string
|
||||
}
|
||||
|
||||
type RabbitMQTransportClient struct {
|
||||
type rmqtportClient struct {
|
||||
once sync.Once
|
||||
rt *RabbitMQTransport
|
||||
rt *rmqtport
|
||||
addr string
|
||||
replyTo string
|
||||
|
||||
@@ -25,17 +27,17 @@ type RabbitMQTransportClient struct {
|
||||
inflight map[string]chan amqp.Delivery
|
||||
}
|
||||
|
||||
type RabbitMQTransportSocket struct {
|
||||
type rmqtportSocket struct {
|
||||
conn *rabbitMQConn
|
||||
d *amqp.Delivery
|
||||
}
|
||||
|
||||
type RabbitMQTransportListener struct {
|
||||
type rmqtportListener struct {
|
||||
conn *rabbitMQConn
|
||||
addr string
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) init() {
|
||||
func (r *rmqtportClient) init() {
|
||||
<-r.rt.conn.Init()
|
||||
if err := r.rt.conn.Channel.DeclareReplyQueue(r.replyTo); err != nil {
|
||||
return
|
||||
@@ -51,7 +53,7 @@ func (r *RabbitMQTransportClient) init() {
|
||||
}()
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) handle(delivery amqp.Delivery) {
|
||||
func (r *rmqtportClient) handle(delivery amqp.Delivery) {
|
||||
ch := r.getReq(delivery.CorrelationId)
|
||||
if ch == nil {
|
||||
return
|
||||
@@ -62,7 +64,7 @@ func (r *RabbitMQTransportClient) handle(delivery amqp.Delivery) {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) putReq(id string) chan amqp.Delivery {
|
||||
func (r *rmqtportClient) putReq(id string) chan amqp.Delivery {
|
||||
r.Lock()
|
||||
ch := make(chan amqp.Delivery, 1)
|
||||
r.inflight[id] = ch
|
||||
@@ -70,7 +72,7 @@ func (r *RabbitMQTransportClient) putReq(id string) chan amqp.Delivery {
|
||||
return ch
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) getReq(id string) chan amqp.Delivery {
|
||||
func (r *rmqtportClient) getReq(id string) chan amqp.Delivery {
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
if ch, ok := r.inflight[id]; ok {
|
||||
@@ -80,7 +82,7 @@ func (r *RabbitMQTransportClient) getReq(id string) chan amqp.Delivery {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) Send(m *Message) (*Message, error) {
|
||||
func (r *rmqtportClient) Send(m *transport.Message) (*transport.Message, error) {
|
||||
r.once.Do(r.init)
|
||||
|
||||
if !r.rt.conn.IsConnected() {
|
||||
@@ -115,7 +117,7 @@ func (r *RabbitMQTransportClient) Send(m *Message) (*Message, error) {
|
||||
|
||||
select {
|
||||
case d := <-replyChan:
|
||||
mr := &Message{
|
||||
mr := &transport.Message{
|
||||
Header: make(map[string]string),
|
||||
Body: d.Body,
|
||||
}
|
||||
@@ -130,16 +132,16 @@ func (r *RabbitMQTransportClient) Send(m *Message) (*Message, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportClient) Close() error {
|
||||
func (r *rmqtportClient) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportSocket) Recv(m *Message) error {
|
||||
func (r *rmqtportSocket) Recv(m *transport.Message) error {
|
||||
if m == nil {
|
||||
return errors.New("message passed in is nil")
|
||||
}
|
||||
|
||||
mr := &Message{
|
||||
mr := &transport.Message{
|
||||
Header: make(map[string]string),
|
||||
Body: r.d.Body,
|
||||
}
|
||||
@@ -152,7 +154,7 @@ func (r *RabbitMQTransportSocket) Recv(m *Message) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportSocket) Send(m *Message) error {
|
||||
func (r *rmqtportSocket) Send(m *transport.Message) error {
|
||||
msg := amqp.Publishing{
|
||||
CorrelationId: r.d.CorrelationId,
|
||||
Timestamp: time.Now().UTC(),
|
||||
@@ -167,27 +169,27 @@ func (r *RabbitMQTransportSocket) Send(m *Message) error {
|
||||
return r.conn.Publish("", r.d.ReplyTo, msg)
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportSocket) Close() error {
|
||||
func (r *rmqtportSocket) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportListener) Addr() string {
|
||||
func (r *rmqtportListener) Addr() string {
|
||||
return r.addr
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportListener) Close() error {
|
||||
func (r *rmqtportListener) Close() error {
|
||||
r.conn.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransportListener) Accept(fn func(Socket)) error {
|
||||
func (r *rmqtportListener) Accept(fn func(transport.Socket)) error {
|
||||
deliveries, err := r.conn.Consume(r.addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
handler := func(d amqp.Delivery) {
|
||||
fn(&RabbitMQTransportSocket{
|
||||
fn(&rmqtportSocket{
|
||||
d: &d,
|
||||
conn: r.conn,
|
||||
})
|
||||
@@ -200,13 +202,13 @@ func (r *RabbitMQTransportListener) Accept(fn func(Socket)) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransport) Dial(addr string) (Client, error) {
|
||||
func (r *rmqtport) Dial(addr string) (transport.Client, error) {
|
||||
id, err := uuid.NewV4()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &RabbitMQTransportClient{
|
||||
return &rmqtportClient{
|
||||
rt: r,
|
||||
addr: addr,
|
||||
inflight: make(map[string]chan amqp.Delivery),
|
||||
@@ -214,7 +216,7 @@ func (r *RabbitMQTransport) Dial(addr string) (Client, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (r *RabbitMQTransport) Listen(addr string) (Listener, error) {
|
||||
func (r *rmqtport) Listen(addr string) (transport.Listener, error) {
|
||||
id, err := uuid.NewV4()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -223,14 +225,14 @@ func (r *RabbitMQTransport) Listen(addr string) (Listener, error) {
|
||||
conn := newRabbitMQConn("", r.addrs)
|
||||
<-conn.Init()
|
||||
|
||||
return &RabbitMQTransportListener{
|
||||
return &rmqtportListener{
|
||||
addr: id.String(),
|
||||
conn: conn,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewRabbitMQTransport(addrs []string) *RabbitMQTransport {
|
||||
return &RabbitMQTransport{
|
||||
func NewTransport(addrs []string, opt ...transport.Option) transport.Transport {
|
||||
return &rmqtport{
|
||||
conn: newRabbitMQConn("", addrs),
|
||||
addrs: addrs,
|
||||
}
|
||||
@@ -27,10 +27,18 @@ type Transport interface {
|
||||
Listen(addr string) (Listener, error)
|
||||
}
|
||||
|
||||
type options struct{}
|
||||
|
||||
type Option func(*options)
|
||||
|
||||
var (
|
||||
DefaultTransport Transport = NewHttpTransport([]string{})
|
||||
DefaultTransport Transport = newHttpTransport([]string{})
|
||||
)
|
||||
|
||||
func NewTransport(addrs []string, opt ...Option) Transport {
|
||||
return newHttpTransport(addrs, opt...)
|
||||
}
|
||||
|
||||
func Dial(addr string) (Client, error) {
|
||||
return DefaultTransport.Dial(addr)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user