微服务了解吗?
微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成。微服务架构使应用程序更易于扩展和更快地开发,从而加速创新并缩短新功能的上市时间。
微服务有着自主,专用,灵活性等优点。
服务发现是怎么做的?
主要有两种服务发现机制:客户端发现和服务端发现。
客户端发现模式:当我们使用客户端发现的时候,客户端负责决定可用服务实例的网络地址并且在集群中对请求负载均衡, 客户端访问服务登记表,也就是一个可用服务的数据库,然后客户端使用一种负载均衡算法选择一个可用的服务实例然后发起请求。该模式如下图所示:
服务端发现模式:客户端通过负载均衡器向某个服务提出请求,负载均衡器查询服务注册表,并将请求转发到可用的服务实例。如同客户端发现,服务实例在服务注册表中注册或注销。
ETCD用过吗?
etcd是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在领导者节点中也可以容忍机器故障。
etcd 是用Go语言编写的,它具有出色的跨平台支持,小的二进制文件和强大的社区。etcd机器之间的通信通过Raft共识算法处理。
关于文档可以参考:v3.5 docs
GIN怎么做参数校验?
go采用validator作参数校验。
它具有以下独特功能:
- 使用验证tag或自定义validator进行跨字段Field和跨结构体验证。
- 允许切片、数组和哈希表,多维字段的任何或所有级别进行校验。
- 能够对哈希表key和value进行验证
- 通过在验证之前确定它的基础类型来处理类型接口。
- 别名验证标签,允许将多个验证映射到单个标签,以便更轻松地定义结构体上的验证
- gin web 框架的默认验证器;
中间件用过吗?
Middleware是Web的重要组成部分,中间件(通常)是一小段代码,它们接受一个请求,对其进行处理,每个中间件只处理一件事情,完成后将其传递给另一个中间件或最终处理程序,这样就做到了程序的解耦。
Go解析Tag是怎么实现的?
Go解析tag采用的是反射。
具体来说使用reflect.ValueOf方法获取其反射值,然后获取其Type属性,之后再通过Field(i)获取第i+1个field,再.Tag获得Tag。
反射实现的原理在: `src/reflect/type.go`中
你项目有优雅的启停吗?
所谓「优雅」启停就是在启动退出服务时要满足以下几个条件:
- 不可以关闭现有连接(进程)
- 新的进程启动并「接管」旧进程
- 连接要随时响应用户请求,不可以出现拒绝请求的情况
- 停止的时候,必须处理完既有连接,并且停止接收新的连接。
为此我们必须引用信号来完成这些目的:
启动:
- 监听SIGHUP(在用户终端连接(正常或非正常)结束时发出);
- 收到信号后将服务监听的文件描述符传递给新的子进程,此时新老进程同时接收请求;
退出:
- 监听SIGINT和SIGSTP和SIGQUIT等。
- 父进程停止接收新请求,等待旧请求完成(或超时);
- 父进程退出。
实现:go1.8采用Http.Server内置的Shutdown方法支持优雅关机。 然后fvbock/endless可以实现优雅重启。
参考资料:gin框架实践连载八 | 如何优雅重启和停止 - 掘金,优雅地关闭或重启 go web 项目
持久化怎么做的?
所谓持久化就是将要保存的字符串写到硬盘等设备。
- 最简单的方式就是采用ioutil的WriteFile()方法将字符串写到磁盘上,这种方法面临格式化方面的问题。
- 更好的做法是将数据按照固定协议进行组织再进行读写,比如JSON,XML,Gob,csv等。
- 如果要考虑高并发和高可用,必须把数据放入到数据库中,比如MySQL,PostgreDB,MongoDB等。