导读
目前企业微服务架构中,以 Java 为开发语言、Spring Cloud 为开发框架的体系仍占大部分市场,间接导致了以类似 Node.js 为主要开发环境的前端开发人员缺少对应的微服务落地实践。本文以 Node.js(服务)+ Nginx(静态资源托管)的架构,使得前端研发人员可以快速构建应用,“零侵入”的获得注册发现、服务治理、监控运维、配置变更等整套微服务相关能力,大大减少了应用的接入、改造、运维成本。
传统微服务如何平滑迁移至 Service Mesh 呢?
点击了解如何构建基于 Service Mesh 的云原生微服务框架
作者介绍
崔凯
腾讯云 CSIG 微服务产品中心产品架构师 多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务架构技术平台的落地和实施 目前专注于微服务架构相关中间件的研究推广和最佳实践的沉淀,致力于帮助企业完成数字化转型
背景介绍
TSF Mesh 是腾讯云微服务平台 TSF 团队遵循 Service Mesh 设计理念,基于 CNCF 云原生开源软件 lstio/Envoy 进行构建的一款服务框架产品。
TSF Mesh 能够为用户提供如下价值:
本文将依托 TSF Mesh 技术以服务形式托管 Node.js 和 Nginx ,最终验证 Node.js 与 Nginx 可以以服务形式注册、发现及成功调用,概要架构图如下:
整个实践的大致步骤如下:
Node.js 镜像制作
1. 准备 Node.js 应用代码
后台发送关键字【demo】获取完整demo文件。
Node.js 可参考 demo 中配置文件进行构建,其它语言的 TSF mesh 的 demo 示例可参考:
https://cloud.tencent.com/document/product/649/30436
2. 制作 Node.js+express 应用镜像( node:14 版本镜像请先自行制作, WORKDIR 可根据自身需求修改)
Dockerfile 文件示例内容如下:
FROM node:14RUN mkdir -p /usr/src/appWORKDIR /usr/src/appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["./start.sh"] #注意这里要通过start.sh文件启动
3. 编写相关配置文件(以容器运行不需要添加 stop.sh 和 cmdline 文件,虚拟机需要)
start.sh文件内容如下:
#!/bin/bash
already_run=`ps-ef|grep "node"|grep -v grep|wc -l`if [${already_run} -ne 0 ];then echo "nodejs-john alreadyRunning!!!!" exit -1fi mkdir -p/opt/tsf/app_config/apiscp/usr/src/app/spec.yaml /opt/tsf/app_config/cp -r/usr/src/app/apis /opt/tsf/app_config/cd/usr/src/app/nohupnode ./bin/www 1>./logs/nodejs-service.log 2>&1
spec.yaml文件内容如下:
apiVersion:v1kind:Applicationspec: services: - name: nodejs-service # 服务名 ports: - targetPort: 3000 # 服务监听端口 protocol: http # 目前支持 HTTP 和 HTTP2,您可使用 HTTP2 部署 gRPC 服务 healthCheck: path: /users # 健康检查 URL 测试命令:curl http://nodejs-service/users
apis/nodejs-service.yaml文件内容如下:
openapi:3.0.0info: version: "1.0.0" title: nodejs-servicepaths: /users: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found
4. 项目目录可参考如下
5. 根据 Dockerfile 生成本地镜像并上传到腾讯云镜像仓库(注意修改用户 uid )
cd {Dockerfile所在目录}docker pull node:14docker build -t mesh-nodejs:v1.0
sudo docker login --username={uid} ccr.ccs.tencentyun.comsudo docker tag {镜像id} ccr.ccs.tencentyun.com/tsf_{uid}/nodejs:v1.0sudo docker push ccr.ccs.tencentyun.com/tsf_{uid}/nodejs:v1.0
push 后即可在镜像仓库中看到 push 的镜像
Nginx 镜像制作
1. 制作 Nginx 应用镜像
Dockerfile 文件示例内容如下:
FROMnginx:stable-alpineRUN echo"ip_resolve=4" >> /etc/yum.confRUN/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo"Asia/Shanghai" > /etc/timezoneWORKDIR/usr/share/nginx/htmlCOPY . . #根据需要拷贝静态资源文件到html目录下RUNchmod +x start.sh stop.shCMD["./start.sh"] #一定要通过start.sh调起Nginx进程,并且要在sh脚本中生成/opt/tsf/app_config目录否则会被清空
2. 编写相关配置文件
start.sh文件内容如下:
#!/bin/sh
mkdir -p/opt/tsf/app_configcpspec.yaml /opt/tsf/app_config/ #这里由于使用的Nginx镜像已自启动,所以此处轮询持续监测即可while [true ]; do already_run=`ps -ef|grep"nginx"|grep -v grep|wc -l` if [ ${already_run} -eq 0 ]; then nohup nginx -c/etc/nginx/nginx.conf 1>/var/log/nginx/nginx-service.log 2>&1 & fi sleep 10Done
3. 完成部署后实例正常运行
部署 TSF Mesh 应用
1. 将主机资源导入容器集群
2. 创建 Nginx 及 Node.js 应用
3. 创建 Nginx 及 Node.js 的部署组
4. 通过部署组完成镜像的部署
Node.js 测试
1. 直接访问 Node.js 应用
2. 在服务治理中测试 API 接口
3. 进入到容器内确认接口是否可通过服务名调用
sudo docker ps #查找容器id
sudo docker exec -it cfa4343f4a22 /bin/bash #进入容器内部
Docker 容器内部测试通过服务名进行调用
Nginx 测试
1. 容器中目录结构及测试( WORKDIR 可根据自身需求修改)
2. 通过外网访问静态资源
停止服务后
3. 服务治理中显示服务已上线
4. 在 Node.js 服务容器内 curl 访问 Nginx 服务成功
总结
TSF Mesh 通过数据面及控制面的组合,以 sidecar 的形式作为本地的 L7 层代理,和服务运行在同一个 pod 中,与 pod 共享网络。也正是通过这一组合,完成整体微服务架构的内部治理及运维。
虽然上述测试仅做了基本的连通性测试,但 TSF 平台上服务治理、监控运维、构建部署、配置变更等相关能力都是具备的。同时可以看到 TSF Mesh 在接入非 java 的应用时,如 Node.js、PHP、Python 等,接入成本非常低,对代码可以达到“零侵入”,非常适合异构语言、遗留老旧系统的微服务改造,这也是微服务团队研发 TSF Mesh 的初衷。
往期
推荐
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!
戳原文,了解更多腾讯微服务平台的信息
点亮在看,你最好看