Go-Kit实现莫斯电码转换

go-kit

本文通过一个简单的服务器案例,说明go-kit微服务工具集的基本使用方式。

我们的需求是实现一个可以将英文和莫斯电码相互转换的api服务,举例,我们希望通过建立一个api服务,将 ”Hello World“ 翻译为 ”… . .-… .-… — .-- — .-. .-… -…“。

项目地址:https://github.com/xuezhaojun/gomorse_gui

Overview

Go-kit架构具有三个抽象分层,分别是:

  • 传输层
  • 服务层
  • EndPoint层

然后概览一下项目结构:

--gomorse_gui--pkg-- object_model-- interfaces.go-- morse-- morse_translater.go--svc-- morse_service-- endpoint.go-- transport.go-- main.go

主要go文件有四个:

  • interfaces.go
  • morse_translater.go
  • main.go
  • transport.go

接下来,我们将分别介绍三个层以及其对应的代码

服务层

业务逻辑实现在服务层里,而在服务层的代码只需要关心业务逻辑即可。

pkg/object_model目录下的interfaces.go,主要作用以接口的形式,定义业务目标:

type Morse interface {TranslateEnglishToMorseCode(request Request) (Response, error)TranslateMorseCodeToEnglish(request Request) (Response, error)
}

简明来说,我们的这个需要实现两个目标:

  • 将English翻译为MorseCode
  • 将MorseCode翻译为English

pkg/morse目录下的morse_translater.go, 则是该接口的具体实现:

type MorseTranslater struct{}func NewMorseTranlater() *MorseTranslater {return &MorseTranslater{}
}func (m *MorseTranslater) TranslateEnglishToMorseCode(request object_model.Request) (response object_model.Response, err error) {if err := gomorse.Valid(request.Text); err != nil {return object_model.Response{}, err}return object_model.Response{Text: gomorse.ToMorse(request.Text),}, nil
}func (m *MorseTranslater) TranslateMorseCodeToEnglish(request object_model.Request) (response object_model.Response, err error) {return object_model.Response{Text: gomorse.FromMorse(request.Text),}, nil
}

具体实现业务目标解耦,外部依赖只引用object_model包下的接口定义,而对接口具体是如何实现的并不关心。

EndPoint层

EndPoint是server和client的基础结构,我们来看下EndPoint在Go-kit中的定义:

type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

Endpoint是一个function,输入request(泛型),输出response(泛型)

我们的目的是将之前的业务逻辑,打包到EndPoint里,代码在svc/morse_service/endpoint.go 文件下, 比如 makeTranslateEToMEndpoint 这个方法,将转换英文到morseCode这个业务,打包为了一个EndPoint, 这个EndPoint中:

  • 先将req指定为request类型
  • 然后调用业务代码
  • 然后在将结果转化为response类型
func makeTranslateEToMEndpoint(s *morse.MorseTranslater) endpoint.Endpoint {return func(ctx context.Context, req interface{}) (interface{}, error) {// 此处request是transport层来的r := req.(request)// 此处需要打包为transport层可以明白结构体resp, err := s.TranslateEnglishToMorseCode(object_model.Request{r.Text,})if err != nil {return response{Err: err.Error(),}, nil}return response{Text: resp.Text,}, nil}
}

其中request 和 response,是传输层定义的http数据包结构,由此可见Endpoint起到业务层(或者服务层)和传输层之间的粘合作用

传输层

传输层负责微服务和外部的通信,go-kit支持多种传输层方法,包括但不限于:

  • http
  • gRPC
  • amqp消息队列
  • nats消息队列

本项目中,我们使用http的作为传输层。

首先,我们需要定义EndPoint中所使用到的request和response:

type request struct {Text string `json:"text"`
}type response struct {Text string `json:"text"`Err  string `json:"err"`
}

既然基于http,我们就需要定义如何解析http的data到我们的request和response:

func decodeRequest(_ context.Context, r *http.Request) (interface{}, error) {var request requesterr := json.NewDecoder(r.Body).Decode(&request)if err != nil {return nil, err}return request, err
}func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {return json.NewEncoder(w).Encode(response)
}

然后我们定义个Run方法,并执行以下步骤:

  • 创建服务层业务逻辑实现的实例 — translateSvc
  • 通过makeEndpoint将translateSvc包装为EndPoint
  • 我们借助了 go-kit/translate/http 包下NewServer方法, 将EndPoint打包为一个http.Handler
    • 当然我们也可以利用go-kit/translate/grpc包下的NewServer方法,将EndPoint打包为 grpc.Handler, 对应grpc方式的传输层
  • 最后利用handler创建http服务,完成传输层的构建
func Run(addr string) error {translateSvc := morse.NewMorseTranlater()endPointEtoM := makeTranslateEToMEndpoint(translateSvc)endPointMtoE := makeTranslateMToEEndPoint(translateSvc)// NewServer以三个方法作为输入translateEToMHandler := httphandler.NewServer(endPointEToM, decodeRequest, encodeResponse,)translateMToEHandler := httphandler.NewServer(endPointMToE, decodeRequest, encodeResponse,)r := mux.NewRouter()r.Methods("POST").Path("/english_to_morse").Handler(translateEToMHandler)r.Methods("POST").Path("/morse_to_english").Handler(translateMToEHandler)r.Methods("GET").PathPrefix("/").Handler(&hello{})return http.ListenAndServe(addr, r)
}

总结

至此,我们完成了一个基于Go-kit的http微服务的编写,其实Go-kit官方推荐了不少代码生成的工具,可以自动基于proto文件生成除了业务逻辑以外的代码,但是从scratch来编写代码,会更有助于理解go-kit的结构。

Thanks for reading!

参考

Go Microservices with Go kit: Introduction

Go-Kit实现莫斯电码转换相关推荐

  1. 摩尔斯电码转换python编码_摩尔斯电码到英文python3

    我想用Python 3将摩尔斯电码转换成英文 我已经设法使用这个将英语转换成莫尔斯码 http://code.activestate.com/recipes/578407-simple-morse-c ...

  2. 摩尔斯电码转换的小程序【python编写】

    摩尔斯电码转换的小程序 博主是一个刚刚接触生信的新手,正在学习Linux和Python,平时会发布一些自己练手的脚本,用来记录自己的学习之路. 介绍 下面是一个用python写的进行英语和摩尔斯电码转 ...

  3. 摩尔斯电码转换python编码_Morse Code 用Python做个摩斯密码转换器

    摩斯密码摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号,不同于现代只使用零和一两种状态的二进制代码,它的代码包括五种 ...

  4. 摩尔斯电码转换python编码_python转换字符串为摩尔斯电码的方法

    python转换字符串为摩尔斯电码的方法 本文实例讲述了python转换字符串为摩尔斯电码的方法.分享给大家供大家参考.具体实现方法如下: chars = ",.0123456789?abc ...

  5. java 摩尔斯电码_使用Java进行摩尔斯电码转换

    我正在尝试学习Java中的哈希映射和2D数组.我们有一个任务,因为有一个扫描仪接受一个字符串并将其转换为莫尔斯电码.我们使用的代码基于一个充满if语句的方法,但我想学习如何使用list,hashmap ...

  6. PHP实现基于文本的莫斯电码生成器

    介绍 我最近遇到一个基于输入文本生成摩斯代码音频文件的需求.几番搜索无果之后,我决定自己编写一个生成器. 下载源代码 – 2.63 KB 因为我希望通过web的方式访问我的摩斯代码音频文件,所以我决定 ...

  7. 在线摩斯电码转换,支持中文的摩斯密码转换

    在线DEMO:https://oktools.net/morse 摩斯电码和Unicode映射 const standard = {'A': '01','B': '1000','C': '1010', ...

  8. php解摩斯电码,PHP实现基于文本的莫斯电码生成器

    最近遇到一个基于输入文本生成摩斯代码音频文件的需求.几番搜索无果之后,我决定自己编写一个生成器. 因为我希望通过web的方式访问我的摩斯代码音频文件,所以我决定采用PHP作为我主要的编程语言.上面的截 ...

  9. 摩斯电码转换在线网站

    [转发]IDF-CTF-牛刀小试-摩斯密码 题目: 嘀嗒嘀嗒嘀嗒嘀嗒 时针它不停在转动 – - .-. - . 嘀嗒嘀嗒嘀嗒嘀嗒 小雨它拍打着水花 -.-. - -- . PS:答案格式wctf{你所 ...

  10. 摩尔斯电码转换python编码_python-摩尔斯电码查询器

    #-*- coding: UTF-8 -*- __author__ = '007' __date__ = '2016/4/5' from Tkinter import * classmorse2cha ...

最新文章

  1. 在 VMware ESXi 5.0 上安装万兆网卡驱动
  2. linux常用的28个快捷键
  3. Button中command后面函数添加参数解决方法
  4. access开发精要(12)-文本 和 备注 数据类型格式(1)
  5. Javascript Eclipse 自动代码规范化
  6. 基于C++的图片压缩设计与实现
  7. autocad2007二维图画法_AutoCAD 2007矩形绘制方法教程
  8. 疯狂java笔记(七) - Java集合之Map
  9. springboot蓝球场馆预约系统毕业设计-附源码211706
  10. 递归实现树状分级部门树《部门单表》
  11. CSDN我的收藏文章在哪
  12. Dynamics CRM 数据迁移工具DataMigrationUtility
  13. 【用户——提权——权限管理】
  14. 单元测试的必要性?一文聊聊单元测试
  15. input_dim、input_length的理解
  16. python 中的 chr ord和repr
  17. Windows电脑反编译微信小程序含分包详细操作
  18. 对于区块链的曲解和误会,多半停留在人们对于其呈现方式的狭隘的认识上
  19. 电容-去耦和退耦的注意事项
  20. 解决 pycharm 插件下载慢的问题

热门文章

  1. vs2019的nmake和cvtres异常
  2. JspStudy套件部署j2ee maven项目网址问题
  3. 信息学奥赛一本通——解题目录
  4. 社区列表根据关注人数排序(排行榜)的实现思路整理
  5. 生信技能树 电脑配置linux,2019-07-23生信Linux20题---生信技能树
  6. 生信技能树课程记录笔记(一)20220523
  7. excel小写转大写公式_excel数字小写转大写公式的教程
  8. 非极大值抑制法(NMS,non-maximum suppression)
  9. 《基于LSTM长短时神经网络的电机旋转振动单步预测》
  10. 建模与仿真matlab论文,基于MATLAB的无线信道建模与仿真.doc