背景

在以前的文章《漫谈微服务》我已经简单的介绍过微服务,微服务特性是轻量级跨平台和跨语言的服务,也列举了比较了集中微服务通讯的手段的利弊,本文将经过RPC通讯的方式实现一个增删查Redis的轻量级微服务示例,大部份内容翻译自文章《Microservice in golang, using Redis and gRPC》,中间加上本身的实践和理解。html

 

实验环境

Mac OSjava

go version go1.12.4 darwin/amd64git

Docker version 18.09.2, build 6247962github

 

代码仓库

 

微服务实践

gRPC代码生成

选用gRPC的缘由是由于gRPC自己是一款开源且高性能的RPC框架,支持跨平台,支持golang,java,c,C++ 等10多种编程语言。由于咱们要实现一个经过gRPC通讯的基于Redis 数据库的增删改微服务,因此咱们首先须要定义一个gRPC的通讯描述文件server.proto:redis

 

想要将上面的server.proto文件转换为golang代码须要安装protocol buffer的编译器:docker

数据库

2.解压拷贝里面的二进制protoc及google子目录到该示例工程目录下。编程

3.经过上面定义的server.proto 生成golang代码,能够看到proto目录下生成了service.pb.go文件。api

若是还不行能够参考protocol buffer官方安装详细步骤 https://github.com/protocolbuffers/protobuf

工程代码目录结构以下:

Redis服务

定义了一个Database的接口,里面含有增删查三种方法,只要实现了这三种方法的数据库均可以做为该微服务的数据库,因此提供一个工厂函数供用户后续扩展,目前只实现了Redis一种存储。Redis的实现直接引用了开源第三方Redis操做用github/go-redis/redis 而后封装了上面增删查三种方法。这里就不展开讲redis实现了。

主程序

而后就是咱们的golang主程序,程序逻辑为开启gRPC服务端,提供增删查三个接口及响应。代码以下:

 

启动服务

为了测试方便用docker-compose定义了咱们的微服务,对docker-compose不太熟悉的朋友能够简单的看下我以前写的《利用Docker Compose快速搭建本地测试环境》这篇文章。该服务的docker-compose.yaml内容以下:

能够看出咱们经过暴露4040端口提供咱们的服务,服务依赖于redis,因此redis服务会在咱们服务以前以容器的方式被拉起来。微服务的启动命令能够从Dockerfile中获取:

拉起服务:  

经过docker ps看到启动了两个容器,一个是redis,一个是咱们的主程序:

测试

测试的客户端用的gRPC的图形化工具BloomRPC,安装方法比较简单:brew cask install bloomrpc

而后导入咱们的gRPC定义文件server.proto就能点击测试:

 

总结

本文从工程实践的角度带读者实现了一个经过gRPC通讯的增删查Redis的微服务,但愿对读者有所启发。