Trong phần tôi đã tìm hiểu khái niệm về cách thức hoạt động của microservice và cách Go Kit phù hợp với thiết kế. Trong phần này, hãy đưa nó vào thực tế bằng cách triển khai một dịch vụ tạo câu ngẫu nhiên đơn giản.
Dịch vụ
Hãy bắt đầu từ logic kinh doanh của chúng tôi bằng cách xác định và triển khai dịch vụ, về cơ bản là hợp đồng. Với mục đích của ví dụ này, dịch vụ của chúng tôi sẽ có một phương thức đơn giản, lấy n số tập hợp để trả về và trả về n tập hợp ngẫu nhiên.
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> |
Điểm cuối
Điểm cuối của chúng tôi sẽ gói các câu trả về từ dịch vụ vào cấu trúc SentencesResponse
với trường Data
và Err
. Bởi vì chỉ có thể đến từ đầu vào xấu của máy khách, chúng tôi sẽ chỉ bao gồm lỗi trong cấu trúc trả về để chúng tôi có thể phản hồi cho khách hàng loại lỗi nào khiến máy chủ bị lỗi. Chúng tôi cũng bọc điểm cuối của chúng tôi trong phần loggingMiddleware
, phần mềm này lấy một bộ ghi và điểm cuối và trả về một điểm cuối mới được trang trí bằng hành vi ghi nhật ký.
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> |
Vận chuyển HTTP
Để đưa dịch vụ của chúng tôi ra thế giới bên cạnh, chúng tôi chọn giao thức HTTP
làm phương tiện di chuyển. Số lượng câu trả về sẽ được nhận ở dạng thân yêu cầu từ yêu cầu POST
và khi chúng tôi nhận được kết quả từ điểm cuối, chúng tôi sẽ viết phản hồi JSON cho khách hàng. Việc kiểm tra chuyển đổi và loại là để nhận lỗi do người dùng tạo, chúng tôi đã gói bên trong cấu trúc SentencesResponse
và hiển thị nó theo đó. Bất kỳ lỗi nào trả về từ endpoint
sẽ bị tùy chọn máy chủ ServerErrorEncoder
bắt gặp.
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> |
Dây nó lên
Đây là cách chúng tôi kết nối tất cả các thành phần với nhau để có được một dịch vụ làm việc. Không có gì lạ mắt ở đây, chỉ là một vài mã khởi tạo.
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> |
Phần kết luận
Tôi hy vọng từ bài đăng này, bạn sẽ có ý tưởng tốt hơn về cách triển khai microservice trong golang bằng các gói Go Kit.