Skip to content

Commit 24f1624

Browse files
author
amit
committed
added client and modified transport layer for client endpoint
1 parent 74ace25 commit 24f1624

File tree

7 files changed

+122
-6
lines changed

7 files changed

+122
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
microservices-with-gokit/.vscode/launch.json
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package client
2+
3+
import (
4+
"github.com/go-kit/kit/endpoint"
5+
"github.com/go-kit/kit/sd"
6+
"github.com/go-kit/kit/sd/consul"
7+
"github.com/go-kit/kit/sd/lb"
8+
consulapi "github.com/hashicorp/consul/api"
9+
"io"
10+
"time"
11+
12+
"github.com/amit1563/microservices-with-go/microservices-with-gokit/calculator"
13+
"github.com/go-kit/kit/log"
14+
)
15+
16+
func New(serverAddr string, logger log.Logger) (calculatorservice.Service, error) {
17+
apiClient, err := consulapi.NewClient(&consulapi.Config{
18+
Address: serverAddr,
19+
})
20+
if err != nil {
21+
return nil, err
22+
}
23+
var (
24+
consulService = "calculatorservice"
25+
consulTags = []string{"DEV"}
26+
)
27+
var (
28+
sdclient = consul.NewClient(apiClient)
29+
instancer = consul.NewInstancer(sdclient, logger, consulService, consulTags, true)
30+
endpoints calculatorservice.Endpoints
31+
)
32+
{
33+
factory := factoryFor(calculatorservice.MakeAddEndpoint)
34+
endpointer := sd.NewEndpointer(instancer, factory, logger)
35+
balancer := lb.NewRoundRobin(endpointer)
36+
retry := lb.Retry(3, 500*time.Millisecond, balancer)
37+
endpoints.AddEndpoint = retry
38+
}
39+
return endpoints, nil
40+
}
41+
42+
func factoryFor(makeEndpoint func(calculatorservice.Service) endpoint.Endpoint) sd.Factory {
43+
return func(serverAddr string) (endpoint.Endpoint, io.Closer, error) {
44+
service, err := calculatorservice.MakeClientEndpoints(serverAddr)
45+
if err != nil {
46+
return nil, nil, err
47+
}
48+
return makeEndpoint(service), nil, nil
49+
}
50+
}

microservices-with-gokit/calculator/endpoint.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package calculatorservice
33
import (
44
"context"
55
"github.com/go-kit/kit/endpoint"
6+
httptransport "github.com/go-kit/kit/transport/http"
7+
"net/url"
8+
"strings"
69
)
710

811
type Endpoints struct {
@@ -18,10 +21,41 @@ func MakeAddEndpoint(s Service) endpoint.Endpoint {
1821
return func(ctx context.Context, request interface{}) (interface{}, error) {
1922
req := request.(addRequest)
2023
//res := (addResponse)
21-
r, err := s.Add(req.X, req.Y)
24+
r, err := s.Add(ctx, req.X, req.Y)
2225
if err != nil {
2326
return addResponse{0, err}, err
2427
}
2528
return addResponse{r, nil}, nil
2629
}
2730
}
31+
32+
func MakeClientEndpoints(target string) (Endpoints, error) {
33+
if !strings.HasPrefix(target, "http") {
34+
target = "http://" + target
35+
}
36+
37+
tgt, err := url.Parse(target)
38+
39+
if err != nil {
40+
return Endpoints{}, err
41+
}
42+
tgt.Path = ""
43+
44+
options := []httptransport.ClientOption{}
45+
46+
return Endpoints{
47+
AddEndpoint: httptransport.NewClient("GET", tgt, encodeAddRequest, decodeAddResponse, options...).Endpoint(),
48+
}, nil
49+
}
50+
51+
// implement client endpoint
52+
53+
func (e Endpoints) Add(ctx context.Context, x int, y int) (int, error) {
54+
req := addRequest{X: x, Y: y}
55+
res, err := e.AddEndpoint(ctx, req)
56+
if err != nil {
57+
return 0, nil
58+
}
59+
response := res.(addResponse)
60+
return response.Result, nil
61+
}

microservices-with-gokit/calculator/middleware.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package calculatorservice
22

33
import (
4+
"context"
45
"github.com/go-kit/kit/log"
56
"time"
67
)
@@ -21,9 +22,9 @@ type loggingMiddleware struct {
2122
logger log.Logger
2223
}
2324

24-
func (mw loggingMiddleware) Add(x int, y int) (result int, err error) {
25+
func (mw loggingMiddleware) Add(ctx context.Context, x int, y int) (result int, err error) {
2526
defer func(begin time.Time) {
2627
mw.logger.Log("Method", "Add", "Result", result, "Took", time.Since(begin), "error", err)
2728
}(time.Now())
28-
return mw.next.Add(x, y)
29+
return mw.next.Add(ctx, x, y)
2930
}

microservices-with-gokit/calculator/server/server.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"flag"
45
"fmt"
56
"github.com/amit1563/microservices-with-go/microservices-with-gokit/calculator"
67
"github.com/go-kit/kit/log"
@@ -11,6 +12,10 @@ import (
1112
)
1213

1314
func main() {
15+
var (
16+
httpAddr = flag.String("http.addr", ":8080", "HTTP listen address")
17+
)
18+
flag.Parse()
1419

1520
var logger log.Logger
1621
{
@@ -28,14 +33,18 @@ func main() {
2833
{
2934
httpHandler = calculatorservice.MakeHTTPHandler(s, log.With(logger, "component", "http"))
3035
}
36+
// Interrupt handler.
3137
err := make(chan error)
3238
go func() {
3339
osSigChannel := make(chan os.Signal)
3440
signal.Notify(osSigChannel, syscall.SIGINT, syscall.SIGTERM)
3541
err <- fmt.Errorf("%s", <-osSigChannel)
3642
}()
43+
// HTTP transport.
3744
go func() {
38-
err <- http.ListenAndServe(":8080", httpHandler)
45+
err <- http.ListenAndServe(*httpAddr, httpHandler)
3946
}()
47+
// Run!
4048
logger.Log("lastcall", <-err)
49+
4150
}

microservices-with-gokit/calculator/service.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package calculatorservice
22

33
import (
4+
"context"
45
"errors"
56
"math"
67
)
@@ -10,7 +11,7 @@ var (
1011
)
1112

1213
type Service interface {
13-
Add(int, int) (int, error)
14+
Add(context.Context, int, int) (int, error)
1415
}
1516

1617
type service struct {
@@ -20,7 +21,7 @@ func NewService() Service {
2021
return service{}
2122
}
2223

23-
func (service) Add(x int, y int) (int, error) {
24+
func (service) Add(_ context.Context, x int, y int) (int, error) {
2425
if x > math.MaxInt16 || x-y > math.MaxInt16 {
2526
return 0, InternalServerErr
2627
}

microservices-with-gokit/calculator/transport.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package calculatorservice
22

33
import (
4+
"bytes"
45
"context"
56
"encoding/json"
67
"github.com/go-kit/kit/log"
78
"github.com/go-kit/kit/transport"
89
httptransport "github.com/go-kit/kit/transport/http"
910
"github.com/gorilla/mux"
11+
"io/ioutil"
1012
"net/http"
1113
)
1214

@@ -28,7 +30,16 @@ func MakeHTTPHandler(s Service, logger log.Logger) http.Handler {
2830
))
2931
return r
3032
}
33+
func encodeAddRequest(ctx context.Context, req *http.Request, request interface{}) error {
3134

35+
req.URL.Path = "/add/"
36+
return encodeRequest(ctx, req, request)
37+
}
38+
func decodeAddResponse(ctx context.Context, res *http.Response) (interface{}, error) {
39+
var response addResponse
40+
err := json.NewDecoder(res.Body).Decode(&response)
41+
return response, err
42+
}
3243
func decodeAddRequest(ctx context.Context, req *http.Request) (interface{}, error) {
3344
var r addRequest
3445
err := json.NewDecoder(req.Body).Decode(&r)
@@ -43,6 +54,15 @@ type errorer interface {
4354
error() error
4455
}
4556

57+
func encodeRequest(_ context.Context, req *http.Request, request interface{}) error {
58+
var buf bytes.Buffer
59+
err := json.NewEncoder(&buf).Encode(request)
60+
if err != nil {
61+
return err
62+
}
63+
req.Body = ioutil.NopCloser(&buf)
64+
return nil
65+
}
4666
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
4767
if e, ok := response.(errorer); ok && e.error() != nil {
4868
// Not a Go kit transport error, but a business-logic error.

0 commit comments

Comments
 (0)