本文会在腾讯云容器服务上面构造微服务基础小项目, 通过搭建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等缓存策略也可以在微服务设计上面进行设计构造。
主要的步骤包括:
总共需要安装四个容器:
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拉取官方镜像:
2. 创建kibana服务,该服务包含一个kibana容器,kibana和Elasticsearch 之间以服务的方式连接。
3. 创建nginx应用服务,该服务包括两个容器,一个nginx还有一个是logstash,logstash和nginx容器之间共享数据目录/var/log/nginx,logstash采集nginx的访问日志文件并将新生成的日志发给ElasticSearch。
4. 添加nginx容器:
当容器服务建立完成后,访问nginx 服务80端口, 此时会在nginx上更新产生的日志信息,然后打开kibana,确认更新的日志信息会完全呈现.
接下来, 在CVM安装测试Beego,测试基本功能. beego提供了使用go语言进行Restapi开发的能力,同时很好的支持MVC模型建立和开发,实现ORMapping。
2.1 Ubuntu 16.04 CVM安装Golong
$ sudo add-apt-repository ppa:gophers/archive
$ sudo apt-get update
$ sudo apt-get install golang-1.8
等安装完毕后,Go会被安装到/usr/lib/go-1.8目录。我们要执行go命令和建 立自己项目的话,需要增加一 些环境变量。
$ 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 get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee
$ go get github.com/go-sql-driver/mysql
登录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
bee api ELKTestAPI
3. 测试程序可以成功运行:
bee run -gendoc=true -downdoc=true
编写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,在腾讯云容器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等安全加密措施。
首先,下载腾讯云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前端构造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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。