腾讯云容器微服务API设计实践

本文会在腾讯云容器服务上面构造微服务基础小项目, 通过搭建ELK集群,实现利用Logstash 采集Nginx日志,收纳及利用kibana展示的功能,同时利用Beego开发Rest API,定义ELK Service 服务,实现ELK Service GET/POST/DELETE/PUT的功能,用户可以通过访问API Gateway实现对API的调用,获取CCS上ELK服务的整体功能状态等信息。ELK 服务的所有信息存在于腾讯云CDB数据库中,当服务发生变化,状态信息会更新数据库,提供实时信息给用户。 

基于腾讯云的这个小项目基本涵盖了微服务基础架构需要的内容,比如:

a. 选择了REST,而不是RPC 

b. 选择腾讯云CCS做服务化开发

c. API Gateway提供API 鉴权及托管

d. 服务监控可以采用CCS提供的服务监控的功能,也可以搭建ELK实现日志收集, 因为Logstatsh可以采集CMQ, CKafka等等的日志都可以方便的实现。 

e. CCS提供服务前端的LB, 支撑外网访问的负载均衡

f.  关于蓝绿部署,灰度发布,由于CCS容器服务可以非常好的提供Github CI/CD, 可以非常方便的构建不同版本的 服务,发布到API Gateway提供外网访问, APIGw可以切换不同的版本环境

如果根据业务需要更加丰富的扩展,那么腾讯云也提供了非常多的考虑,比如TSF分布式微服务架构, DCDB分布式数据库, 当然Redis等缓存策略也可以在微服务设计上面进行设计构造。

主要的步骤包括:

  1. 构造测试ELK容器集群,在腾讯云上分别构建nginx-basiauth, elasticsearch, logstash, kibana 容器。
  2. 在CVM安装测试BeeGO,golong, 调试确认ELKServiceAPI功能正常运行
  3. 制作Dockerfile以及ENTRYPOINT,将ELKServiceAPI commit到GitHub,从github构建ELKServiceAPI容器镜像
  4. 构建ServiceDiscovery镜像,此容器会监控ELKService状态,并写入ElkserviceAPI的CDB数据库
  5. 用户调用API Gateway,访问ELKService的状态信息
  6. 附录参考资料,代码相关部分可以访问 https://github.com/littleking1/elkserviceapi 

首先,构造测试ELK容器集群

     总共需要安装四个容器: 

   a. ElasticSearch服务:该服务提供日志集中存储和查询

   b. Kibana服务:以web的形式提供日志的可视化展现和查询界面

   c.  Kibana登录鉴权服务:Kibana如果直接放到公网上,因为kibana本身没有鉴权机制,如果被端口扫描工具扫出 来,很容易出现他人查看操作日志的行为,为避免该 情况,在kibana前面加个nginx服务,利用nginx的basic认证来做鉴权。

  d. nginx应用服务:创建该服务的目的是为了验证是否可以将应用日志采集到ElasticSearch里。该服务用nginx的访 问日志做日志源,浏览器每访问一次nginx服务,就会生成一条access日志,和该服务在一起的logstash容器会 将 新产生的日志发到ElasticSearch里。

    首先在容器CCS上创建集群,此集群包括两个集群节点,后面用来运行多个服务及容器。由于ElasticSearch需要至少2GB内存,我们选择两个节点都配置为2核4GB。  

选择机型及主机配置:

在两台主机上分别跑下面的命令:【1】

sysctl -w vm.max_map_count=262144 --  增大虚拟内存

echo 3 > /proc/sys/vm/drop_caches   -- 内存不够,释放部分内存

接下来创建各个服务,我们选择从DockerHub拉取官方镜像: 

  1. 创建 elasticseach服务,该服务包含一个ES容器,ES容器配置硬件:

2. 创建kibana服务,该服务包含一个kibana容器,kibana和Elasticsearch 之间以服务的方式连接。

3. 创建nginx应用服务,该服务包括两个容器,一个nginx还有一个是logstash,logstash和nginx容器之间共享数据目录/var/log/nginx,logstash采集nginx的访问日志文件并将新生成的日志发给ElasticSearch。

4. 添加nginx容器:

当容器服务建立完成后,访问nginx 服务80端口, 此时会在nginx上更新产生的日志信息,然后打开kibana,确认更新的日志信息会完全呈现.

BeeGO API开发测试

接下来, 在CVM安装测试Beego,测试基本功能. beego提供了使用go语言进行Restapi开发的能力,同时很好的支持MVC模型建立和开发,实现ORMapping。

2.1   Ubuntu 16.04 CVM安装Golong

  •  添加apt-get源并刷新

        $ sudo add-apt-repository ppa:gophers/archive 

        $ sudo apt-get update          

  • 安装Go 1.8

$ sudo apt-get install golang-1.8

  • 设置环境变量

等安装完毕后,Go会被安装到/usr/lib/go-1.8目录。我们要执行go命令和建         立自己项目的话,需要增加一 些环境变量。

  • 代码要放在当前用户下的Go目录下,需要先创建2个目录:

$ mkdir -p ~/go/bin 

$ mkdir -p ~/go/src

  • 然后设置当前用户的环境变量:

vi ~/.profile

  • 在结尾增加以下内容:

export GOROOT=/usr/lib/go-1.8 

export PATH="$PATH:$GOROOT/bin" 

export GOPATH=$HOME/go 

export PATH="$PATH:$GOPATH/bin"

  • 保存后,重新刷新环境变量

source ~/.profile

  • 下载需要的go项目,在后面建立ORMapping的时候需要使用:

$ go get -u github.com/astaxie/beego

$ go get -u github.com/beego/bee

$ go get github.com/go-sql-driver/mysql

  •  使用腾讯云CDB ,配置好密码及用户。 

         登录mysql, mysql -u root -p XXXX, 创建elkservice table

CREATE TABLE `elkservice` (

  `Id` int(11) NOT NULL,

  `Name` varchar(10),

  `Status` varchar(10) ,

  `Running` tinyint(1) ,

  `FailedCount` int(11),

  PRIMARY KEY (`Id`)

)

定义ELKService结构如下:

       type Elkservice struct {

Id int

Name string

Status string

Running bool

FailedCount int }

2.2  开发ELKServiceAPI

  • 创建API项目模板 ELKTestAPI

  bee api ELKTestAPI 

  • 修改项目文件 go/src/ELKTestAPI/models/ELKTestAPI.go, 增加GET/POST/PUT/DELETE 函数(参考Github repository)

3.  测试程序可以成功运行:

     bee run -gendoc=true -downdoc=true 

构造Dockerfile及镜像

编写Dockerfile,将ELKService做成镜像,上传到腾讯云容器中,可以参考Github上面的Dockerfile进行制作https://github.com/littleking1/elkserviceapi  

Dockerfile中使用下面的ENTRYPOINT ,在容器开始启动RestAPI运行: 

#!/bin/bash

bee api testuserapi

cd /root/go/src/ELKTestAPI

bee run -gendoc=true -downdoc=true

Github Repository

上传程序源文件到Github,在腾讯云容器CCS中新建镜像仓库 -- elkapitest

建立镜像构建配置:

Dockerfile文件在根目录,所以不需要添加路径,如果不在根目录,需要格外添加修改,例如你的项目名称为test,Dockerfile在目录123/456下面,那么Dockerfile路径应该填写为 123/456/Dockerfile. 

配置完成后,点击立即构建镜像,大概需要5~10分钟构建: 

镜像构建完成后,在CCS上创建服务。如果定义了触发条件,每次源码发生变化,就可以触发服务更新,使用最新的容器镜像:

查看容器中正在运行的进程,确认项目已经在运行:

查询ELKService的状态,收到回复如下所示:

构造服务发现镜像

目前BeeGo Orm我们采用腾讯云的CDB作为API数据后端,用于存储ELKService的状态信息。ServiceDiscovery会监控ELKService,主要包括三个容器服务,当有任何一个服务的状态为不正常的时候,会发送消息到CMQ, CMQ收到当前ELKService的状态信息, 触发SCF将ELKService的状况写入CDB,此时开发人员可以通过 ELKService的GET 方法获取服务的状态信息。同时,在API前端使用腾讯云API Gateway提供安全防护,启用TLS等安全加密措施。  

  1. 构造ServiceDiscovery  
  2. 构造SCF实现读取CMQ,并更新CDB
  3. 构造API Gateway

首先,下载腾讯云Python API SDK到开发环境, https://github.com/QcloudApi/qcloudapi-sdk-python ,由于目前SDK中不包含CMQ, CMQ-Topic的读写功能,所以我们需要修改底层的module,实现CMQ的API调用功能。 

$ git clone https://github.com/QcloudApi/qcloudapi-sdk-python
$ cd qcloudapi-sdk-python

进入module目录, 新建文件cmq.py ,并贴入下面的内容: 

from QcloudApi.modules import base

class Cmq(base.Base):

    requestHost = 'cmq-queue-sh.api.qcloud.com'

~

回到QcloudApi目录,打开qcloudapi.py,添加cmq信息:

修改完成保存后,运行命令安装SDK:

python setup.py install

进入tests目录,打开demo.py,并编写ServiceDiscovery程序, 具体参考https://github.com/littleking1/elkserviceapi/tree/master/ServiceDis/tests

接下里构造SCF,实现读取CMQ Topic,并将信息写入到CDB, 参考https://github.com/littleking1/elkserviceapi/tree/master/SCF

创建CMQ Topic触发,确定消息可以成功触发SCF,并成功写入CDB. 

构造API Gateway

接下来,我们可以在API前端构造API Gateway,来实现对API的托管功能了。 

API 网关是用于实现完整 API 托管的服务,用于协助开发者轻松完成 API 的创建、维护、发布、监控等整个生命周期的管理。通过 API 网关,可以封装后端各种服务,以 API 的形式,提供给各方使用。同时,API 网关可以协助完成 API 文档管理、API 测试和 SDK 生成等。

同时,由于API Gateway利用 TGW(Tencent Gateway) 的强大能力,依赖其多地域多机分布式集群,提供高性能高可靠的服务,用于承载大规模大流量的 API 访问。同时利用腾讯云 API key 的secretid, secretkey提供非常安全的API鉴权功能,保证API不会被非法使用。

在API Gateway 创建服务测试:

配置后端路径:

设置返回类型为Json:

调试API,确认可以返回结果:

服务测试

手动将ELK其中一项服务(例如elasticsearch)关停,或者扩容实例,此时服务会从normal状态变换到其他状态:

service Discovery将服务信息写入CMQ,  SCF被调用:

通过postman 查看API Gateway, 调用ELKService 接口, 可以查到elkservice的状态已经发生变化:

【附录】

 [1] https://cloud.tencent.com/developer/article/1005427 

 [2] https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/05.5.md 

 [3] https://docs.docker.com/engine/reference/builder/#entrypoint

 [4] http://www.linuxidc.com/Linux/2018-01/150348.htm

 [5] https://www.gfzj.us/2015/07/07/dockerfile_set_PATH.html

 [6] https://yeasy.gitbooks.io/docker_practice/content/basic_concept/image.html

 [7] https://cloud.tencent.com/document/product/457/9115

 [8] https://cloud.tencent.com/document/product/583/9734 

[9] https://github.com/littleking1/elkserviceapi

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

云极客Frey

1 篇文章2 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04使用Buildbot建立持续集成系统

Buildbot是一个基于Python的持续集成系统,用于自动化软件构建,测试和发布过程。

23830
来自专栏叔叔的博客

Docker Swarm

docker-machine ls, 看看有没有虚拟主机,没有就Docker Machine创一个

17220
来自专栏python学习之旅

TestLink笔记(一):环境配置+安装

本文的安装环境是Windows操作系统。 (一)     前期准备 1、XAMPP下载(下载5.6的版本)          https://www.apach...

57960
来自专栏云原生架构实践

Jenkins 配置CI/CD任务

任务内容是部署/更新一个mysql数据库的容器,类似任务都在yourcompany-database任务视图下。

19750
来自专栏哎_小羊

Git Review + Gerrit 安装及使用完成 Code-Review

目录 Code Review 介绍 Gerrit 介绍 环境、软件准备 Git-Review 安装 Gerrit 安装 简单的 Demo 示例 1、Code R...

1.8K90
来自专栏散尽浮华

Tomcat自带的Session共享方案实施记录

一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到...

31420
来自专栏linux驱动个人学习

udev实现热插拔

一、UDEV是什么? Udev是一个针对Linux内核2.6的可提供自动创建的设备节点和命名的解决方法的一个文件系统;其实与/etc/目录下的fstab文件类似...

52440
来自专栏finleyMa

docker学习系列14 使用haproxy实现mysql集群的负载均衡

在上节中我们创建了 mysql 集群。 实际工作中,我们不希望让某一数据库节点处理所有的请求,这样的话单个负载高,性能差。

84120
来自专栏哎_小羊

minikube 安装 Kubernetes Dashboard 并集成 Heapster

目录 Kubernetes Dashboard 介绍 环境、软件准备 Kubernetes Dashboard 安装 Heapster 插件安装 简单演示使用 ...

1.8K80
来自专栏Debian社区

Debian 光盘安装简易教程

这篇文章我会尽可能详细地说明如何快速安装纯净的Debian 8.2.0,需要懂一点vi编辑器的使用方法。 如果是新手,没用过 vim 编辑器也不用担心,我会尽量...

36520

扫码关注云+社区

领取腾讯云代金券