In part I we’ve learned the concept of how Microservice worked and also how Go Kit fit into the design. In this part lets put it into practice by implementing a simple random sentence generator service.
Service
Lets start from our business logic by define and implement a service, basically a contract. For the purpose of this example our service will has one simple method which take n number of setences to return and return n random setences.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <span class="token keyword">package</span> service <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"context"</span> <span class="token string">"errors"</span> <span class="token string">"math/rand"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> rand<span class="token punctuation">.</span><span class="token function">Seed</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">UnixNano</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Service <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">GetRandomSentences</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> n <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">NewService</span><span class="token punctuation">(</span><span class="token punctuation">)</span> Service <span class="token punctuation">{</span> sentences <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"I want to eat apple"</span><span class="token punctuation">,</span> <span class="token string">"Nice day today huh!"</span><span class="token punctuation">,</span> <span class="token string">"Hey there! How do you do?"</span><span class="token punctuation">,</span> <span class="token string">"Anime's rock!"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token operator">&</span>service<span class="token punctuation">{</span>sentences<span class="token punctuation">:</span> sentences<span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> service <span class="token keyword">struct</span> <span class="token punctuation">{</span> sentences <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>s <span class="token operator">*</span>service<span class="token punctuation">)</span> <span class="token function">GetRandomSentences</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> n <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> n <span class="token operator">></span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span>sentences<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> errors<span class="token punctuation">.</span><span class="token function">New</span><span class="token punctuation">(</span><span class="token string">"The maximum number is exceed"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> sens <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> j <span class="token operator">:=</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span><span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span>sentences<span class="token punctuation">)</span><span class="token punctuation">)</span> sens <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>sens<span class="token punctuation">,</span> s<span class="token punctuation">.</span>sentences<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> sens<span class="token punctuation">,</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> |
Endpoint
Our endpoint will wrap the sentences return from service into a SentencesResponse
struct with Data
and Err
field. Because could only come from client bad input we will only wrap error in the return struct so that we can feedback to the client what kind error that make the server failed. We also wrap our endpoint in a loggingMiddleware
, which take a logger and an endpoint and return a new endpoint decorated with logging behaviour.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <span class="token keyword">package</span> endpoint <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"context"</span> <span class="token string">"time"</span> <span class="token string">"github.com/go-kit/kit/endpoint"</span> <span class="token string">"github.com/go-kit/kit/log"</span> <span class="token string">"example.com/randsvc/service"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> Errorer <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Endpoint <span class="token keyword">struct</span> <span class="token punctuation">{</span> GetRandomSentencesEndpoint endpoint<span class="token punctuation">.</span>Endpoint <span class="token punctuation">}</span> <span class="token keyword">type</span> SentencesResponse <span class="token keyword">struct</span> <span class="token punctuation">{</span> Data <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token string">`json:"data"`</span> Err <span class="token builtin">error</span> <span class="token string">`json:"err,omitempty"`</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>r <span class="token operator">*</span>SentencesResponse<span class="token punctuation">)</span> <span class="token function">GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> r<span class="token punctuation">.</span>Err <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">NewEndpoint</span><span class="token punctuation">(</span>svc service<span class="token punctuation">.</span>Service<span class="token punctuation">,</span> logger log<span class="token punctuation">.</span>Logger<span class="token punctuation">)</span> Endpoint <span class="token punctuation">{</span> getRandomSentencesEndpoint <span class="token operator">:=</span> <span class="token function">makeGetRandomSentencesEndpoint</span><span class="token punctuation">(</span>svc<span class="token punctuation">)</span> getRandomSentencesEndpoint <span class="token operator">=</span> <span class="token function">loggingMiddleware</span><span class="token punctuation">(</span>log<span class="token punctuation">.</span><span class="token function">WithPrefix</span><span class="token punctuation">(</span>logger<span class="token punctuation">,</span> <span class="token string">"method"</span><span class="token punctuation">,</span> <span class="token string">"GetRandomSetences"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">(</span>getRandomSentencesEndpoint<span class="token punctuation">)</span> <span class="token keyword">return</span> Endpoint<span class="token punctuation">{</span> GetRandomSentencesEndpoint<span class="token punctuation">:</span> getRandomSentencesEndpoint<span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">makeGetRandomSentencesEndpoint</span><span class="token punctuation">(</span>svc<span class="token punctuation">)</span> endpoint<span class="token punctuation">.</span>Endpoint <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">func</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> request <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> sens<span class="token punctuation">,</span> err <span class="token operator">:=</span> svc<span class="token punctuation">.</span><span class="token function">GetRandomSentences</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> request<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> SentencesResponse<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> sens<span class="token punctuation">,</span> Err<span class="token punctuation">:</span> err<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">loggingMiddleware</span><span class="token punctuation">(</span>logger log<span class="token punctuation">.</span>Logger<span class="token punctuation">)</span> endpoint<span class="token punctuation">.</span>Middleware <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">func</span><span class="token punctuation">(</span>next endpoint<span class="token punctuation">.</span>Endpoint<span class="token punctuation">)</span> endpoint<span class="token punctuation">.</span>Endpoint <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">func</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> request <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>resp <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span>begin time<span class="token punctuation">.</span>Time<span class="token punctuation">)</span> <span class="token punctuation">{</span> logger<span class="token punctuation">.</span><span class="token function">Log</span><span class="token punctuation">(</span><span class="token string">"took"</span><span class="token punctuation">,</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>begin<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"err"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> resp<span class="token punctuation">,</span> err <span class="token operator">=</span> <span class="token function">next</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> request<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
HTTP Transport
To expose our service to the ourside world, we choose HTTP
protocol as our transport. The number of sentences to return will be get in the form of request body from a POST
request and when we get the result back from endpoint we write a JSON response back to the client. The conversion and type checking is to get user generated error, which we wrapped inside SentencesResponse
struct, and show it accordingly. Any error that return from endpoint
will be caught by ServerErrorEncoder
server option.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <span class="token keyword">package</span> transport <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"context"</span> <span class="token string">"net/http"</span> <span class="token string">"github.com/go-kit/kit/log"</span> kithttp <span class="token string">"github.com/go-kit/kit/transport/http"</span> <span class="token string">"example.com/randsvc/endpoint"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> NumberRequest <span class="token keyword">struct</span> <span class="token punctuation">{</span> N <span class="token builtin">int</span> <span class="token string">`json:"n"`</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">NewHTTPServer</span><span class="token punctuation">(</span>endp endpoint<span class="token punctuation">.</span>Endpoint<span class="token punctuation">,</span> logger log<span class="token punctuation">.</span>Logger<span class="token punctuation">)</span> http<span class="token punctuation">.</span>Handler <span class="token punctuation">{</span> options <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>kithttp<span class="token punctuation">.</span>ServerOption<span class="token punctuation">{</span> kithttp<span class="token punctuation">.</span><span class="token function">ServerErrorEncoder</span><span class="token punctuation">(</span>errEncoder<span class="token punctuation">)</span><span class="token punctuation">,</span> kithttp<span class="token punctuation">.</span><span class="token function">ServerErrorLogger</span><span class="token punctuation">(</span>log<span class="token punctuation">.</span><span class="token function">WithPrefix</span><span class="token punctuation">(</span>logger<span class="token punctuation">,</span> <span class="token string">"transport"</span><span class="token punctuation">,</span> <span class="token string">"HTTP"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> kithttp<span class="token punctuation">.</span><span class="token function">NewServer</span><span class="token punctuation">(</span> endp<span class="token punctuation">.</span>GetRandomSentencesEndpoint<span class="token punctuation">,</span> decodeHTTPRequest<span class="token punctuation">,</span> encodeHTTPResponse<span class="token punctuation">,</span> options<span class="token operator">...</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">decodeHTTPRequest</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> r <span class="token operator">*</span>http<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> req NumberRequest <span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">NewDecoder</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>Body<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Decode</span><span class="token punctuation">(</span><span class="token operator">&</span>req<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> err <span class="token punctuation">}</span> <span class="token keyword">return</span> req<span class="token punctuation">.</span>N<span class="token punctuation">,</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">encodeHTTPResponse</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> w http<span class="token punctuation">.</span>ResponseWriter<span class="token punctuation">,</span> response <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span> w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">,</span> <span class="token string">"application/json; charset=utf-8"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> resp<span class="token punctuation">,</span> ok <span class="token operator">:=</span> response<span class="token punctuation">.</span><span class="token punctuation">(</span>endpoint<span class="token punctuation">.</span>Errorer<span class="token punctuation">)</span><span class="token punctuation">;</span> ok <span class="token operator">&&</span> resp<span class="token punctuation">.</span><span class="token function">GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> w<span class="token punctuation">.</span><span class="token function">WriteHeader</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusBadRequest<span class="token punctuation">)</span> <span class="token keyword">return</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span><span class="token string">"error"</span><span class="token punctuation">:</span> resp<span class="token punctuation">.</span><span class="token function">GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> w<span class="token punctuation">.</span><span class="token function">WriteHeader</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusOK<span class="token punctuation">)</span> <span class="token keyword">return</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span>response<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">errEncoder</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">,</span> w http<span class="token punctuation">.</span>ResponseWriter<span class="token punctuation">)</span> <span class="token punctuation">{</span> w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">,</span> <span class="token string">"application/json; charset=utf-8"</span><span class="token punctuation">)</span> w<span class="token punctuation">.</span><span class="token function">WriteHeader</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusInternalServerError<span class="token punctuation">)</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span><span class="token string">"error"</span><span class="token punctuation">:</span> <span class="token string">"internal server error"</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Wire it up
This is how we wired up all component together to get a working service. There is nothing fancy here, just a couple of initialization code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"flag"</span> <span class="token string">"net/http"</span> <span class="token string">"os"</span> <span class="token string">"time"</span> <span class="token string">"github.com/go-kit/kit/log"</span> <span class="token string">"example.com/randsvc/endpoint"</span> <span class="token string">"example.com/randsvc/transport"</span> <span class="token string">"example.com/randsvc/service"</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> <span class="token punctuation">(</span> fs <span class="token operator">=</span> flag<span class="token punctuation">.</span><span class="token function">NewFlagSet</span><span class="token punctuation">(</span><span class="token string">"randsvc"</span><span class="token punctuation">,</span> flag<span class="token punctuation">.</span>ExitOnError<span class="token punctuation">)</span> httpAddr <span class="token operator">=</span> fs<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token string">"http-addr"</span><span class="token punctuation">,</span> <span class="token string">":8080"</span><span class="token punctuation">,</span> <span class="token string">"HTTP listening address"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> logger <span class="token operator">:=</span> log<span class="token punctuation">.</span><span class="token function">NewLogfmtLogger</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>Stdout<span class="token punctuation">)</span> logger <span class="token operator">=</span> log<span class="token punctuation">.</span><span class="token function">WithPrefix</span><span class="token punctuation">(</span>logger<span class="token punctuation">,</span> <span class="token string">"service"</span><span class="token punctuation">,</span> <span class="token string">"randsvc"</span><span class="token punctuation">,</span> <span class="token string">"ts"</span><span class="token punctuation">,</span> log<span class="token punctuation">.</span>DefaultTimestamp<span class="token punctuation">)</span> svc <span class="token operator">:=</span> service<span class="token punctuation">.</span><span class="token function">NewService</span><span class="token punctuation">(</span><span class="token punctuation">)</span> endp <span class="token operator">:=</span> endpoint<span class="token punctuation">.</span><span class="token function">NewEndpoint</span><span class="token punctuation">(</span>svc<span class="token punctuation">,</span> logger<span class="token punctuation">)</span> handler <span class="token operator">:=</span> transport<span class="token punctuation">.</span><span class="token function">NewHTTPServer</span><span class="token punctuation">(</span>endp<span class="token punctuation">,</span> logger<span class="token punctuation">)</span> server <span class="token operator">:=</span> <span class="token operator">&</span>http<span class="token punctuation">.</span>Server<span class="token punctuation">{</span> Addr<span class="token punctuation">:</span> <span class="token operator">*</span>httpAddr<span class="token punctuation">,</span> Handler<span class="token punctuation">:</span> handler<span class="token punctuation">,</span> ReadTimeout<span class="token punctuation">:</span> <span class="token number">10</span><span class="token operator">*</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">,</span> WriteTimeout<span class="token punctuation">:</span> <span class="token number">10</span><span class="token operator">*</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">,</span> <span class="token punctuation">}</span> logger<span class="token punctuation">.</span><span class="token function">Log</span><span class="token punctuation">(</span><span class="token string">"transport"</span><span class="token punctuation">,</span> <span class="token string">"HTTP"</span><span class="token punctuation">,</span> <span class="token string">"addr"</span><span class="token punctuation">,</span> <span class="token operator">*</span>httpAddr<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">:=</span> server<span class="token punctuation">.</span><span class="token function">ListenAndServe</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> logger<span class="token punctuation">.</span><span class="token function">Log</span><span class="token punctuation">(</span><span class="token string">"during"</span><span class="token punctuation">,</span> <span class="token string">"HTTP"</span><span class="token punctuation">,</span> <span class="token string">"err"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> os<span class="token punctuation">.</span><span class="token function">Exit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Conclusion
I hope from this post you will get a better idea on how to implement a microservice in golang using Go Kit packages.