专栏首页云极客Frey腾讯云容器微服务API设计实践
原创

腾讯云容器微服务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 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2018,营销所面对的5大阻碍(2):微服务和API

    这是这个系列文章的第二部分,如果您还没有阅读第1部分,您可以点击链接:2018,营销所面对的5大阻碍(1):数字化转型。 2、微服务和API(2018更新版) ...

    iCDO互联网数据官
  • OPPO和一点资讯牵手,手机厂商正式接管分发大权?

    7月上旬,有消息称腾讯将以80亿美元的价格投资今日头条,旋即被张一鸣单方面变向否决,并表示出今日头条Go Big的雄心壮志。昨晚今日头条对手一点资讯传出重磅消息...

    罗超频道
  • Dubbo服务治理篇——分布式服务子系统的划分

    2.基础服务为上游业务的功能 实现提供支撑,基础服务应用本身无状态,可随着系统的负荷灵活伸缩来提供服务能力。

    冰河
  • 使用ACS和Kubernetes部署Red Hat JBoss Fuse

    红帽JBoss Fuse 十多年来一直是构建Java Web / RESTful服务的实际标准。但是,如何在当今以云为中心的世界中该怎样高效运行?如您所见,基础...

    青橙.
  • 市民云总经理王兆进:手机APP中的智慧城市

    12月1日下午,由上海大数据联盟、数据猿主办的第20期魔方大数据在上海宝华万豪酒店成功举办。本期魔方大数据以“政务大数据”为主题,邀请了技术方和产业方大咖共聚一...

    数据猿
  • 云中巨象——作为一种服务的Hadoop

    Ashish Thusoo, Qubole的CEO和联合创始人,最近在 Enterprise Data World Conference (EDW)上谈到了作为...

    静一
  • iview 表格多选框的选中事件

    〆 千寻、
  • 深度学习: global pooling (全局池化)

    今天看SPPNet论文时,看到“global pooling”一词,不是很明白是啥概念。上网查了一下定义,在StackOverflow 上找到了答案:

    JNingWei
  • 「主数据架构」介绍下一代主数据管理(MDM)

    主数据管理是旨在创建和维护权威、可靠、可持续、准确、及时和安全的环境的过程和技术框架。这个环境代表了一个单一版本的事实,作为跨不同的系统、业务单元和用户社区的可...

    首席架构师智库
  • 案例 | 农业银行“金穗汇”率先上线小程序 探索银行服务创新体验

    微信小程序引爆了人们对互联网新生态的无限畅想,近日,由微盛网络提供技术支持的农业银行无锡支行“金穗汇”小程序正式上线。 “金穗汇”小程序赋能银行“线下-线上”服...

    微盛企微管家

扫码关注云+社区

领取腾讯云代金券