6

【超详细】前端程序员只需六步,实现微服务架构转型初实践

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzAxMTQ2NTA1Mg%3D%3D&%3Bmid=2247487653&%3Bidx=1&%3Bsn=b7a940914133a3d0a06a6594c1ffb2cf
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MRF3iy3.gif!mobile

导读

目前企业微服务架构中,以 Java 为开发语言、Spring Cloud 为开发框架的体系仍占大部分市场,间接导致了以类似 Node.js 为主要开发环境的前端开发人员缺少对应的微服务落地实践。本文以 Node.js(服务)+ Nginx(静态资源托管)的架构,使得前端研发人员可以快速构建应用,“零侵入”的获得注册发现、服务治理、监控运维、配置变更等整套微服务相关能力,大大减少了应用的接入、改造、运维成本。

传统微服务如何平滑迁移至 Service Mesh 呢?

点击了 如何构建基于 Service Mesh 的云原生微服务框架

MRF3iy3.gif!mobile

作者介绍

崔凯

腾讯云 CSIG 微服务产品中心产品架构师

多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务架构技术平台的落地和实施

目前专注于微服务架构相关中间件的研究推广和最佳实践的沉淀,致力于帮助企业完成数字化转型

u6vY7be.png!mobile

背景介绍

TSF Mesh 是腾讯云微服务平台 TSF 团队遵循 Service Mesh 设计理念,基于 CNCF 云原生开源软件 lstio/Envoy 进行构建的一款服务框架产品。

TSF Mesh 能够为用户提供如下价值:

  • TSF 为您提供一站式应用生命周期管理服务。 提供从应用部署到应用运行的全流程管理,包括创建、删除、部署、回滚、扩容、下线、启动和停止应用并支持版本回溯能力。

  • TSF 为您提供高效的服务注册发现能力 支持秒级的服务注册发现并提供本地注册信息缓存、服务实例注册发现异常告警、注册中心跨 AZ 区容灾等完善的高可用保障机制。

  • TSF 为您提供细粒度服务治理能力。 支持服务和 API 多级服务治理能力,通过配置标签形式进行细粒度的流量控制,实现灰度发布、就近路由、熔断限流、服务容错、访问鉴权等功能。

  • TSF 为您提供立体化应用数据运营。 提供完善应用性能指标监控和分布式调用链分析、服务依赖拓扑、日志服务工具,帮助您高效分析应用性能瓶颈及故障问题排查。

本文将依托 TSF Mesh 技术以服务形式托管 Node.js 和 Nginx ,最终验证 Node.js 与 Nginx 可以以服务形式注册、发现及成功调用,概要架构图如下:

nQbIZ3I.png!mobile

整个实践的大致步骤如下:

  1. Node.js 镜像制作及上传

  2. Nginx 镜像制作及上传

  3. TSF 平台上部署 Node.js

  4. TSF 平台上部署 Nginx

  5. 单独通过 IP:PORT/服务名访问 Node.js 和 Nginx

  6. Node.js 和 Nginx 通过服务名互相访问

u6vY7be.png!mobile

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:14
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["./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 -1
fi

mkdir -p/opt/tsf/app_config/apis
cp/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:v1
kind:Application
spec:
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.0
info:
version: "1.0.0"
title: nodejs-service
paths:
/users:
get:
responses:
'200':
description: OK
'401':
description: Unauthorized
'402':
description: Forbidden
'403':
description: Not Found

4. 项目目录可参考如下

RbuMVfU.png!mobile

5. 根据 Dockerfile 生成本地镜像并上传到腾讯云镜像仓库(注意修改用户 uid )

cd {Dockerfile所在目录}
docker pull node:14
docker build -t mesh-nodejs:v1.0

2aIjIrN.png!mobile

sudo docker login --username={uid} ccr.ccs.tencentyun.com
sudo docker tag {镜像id} ccr.ccs.tencentyun.com/tsf_{uid}/nodejs:v1.0
sudo docker push ccr.ccs.tencentyun.com/tsf_{uid}/nodejs:v1.0

push 后即可在镜像仓库中看到 push 的镜像

qYvieyq.png!mobile

u6vY7be.png!mobile

Nginx 镜像制作

1. 制作 Nginx 应用镜像

Dockerfile 文件示例内容如下:

FROMnginx:stable-alpine
RUN echo"ip_resolve=4" >> /etc/yum.conf
RUN/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo"Asia/Shanghai" > /etc/timezone
WORKDIR/usr/share/nginx/html
COPY . . #根据需要拷贝静态资源文件到html目录下
RUNchmod +x start.sh stop.sh
CMD["./start.sh"] #一定要通过start.sh调起Nginx进程,并且要在sh脚本中生成/opt/tsf/app_config目录否则会被清空

2. 编写相关配置文件

start.sh文件内容如下:

#!/bin/sh


mkdir -p/opt/tsf/app_config
cpspec.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 10
Done

3. 完成部署后实例正常运行

u6vY7be.png!mobile

部署 TSF Mesh 应用

1. 将主机资源导入容器集群

aAz6r2E.png!mobile

2. 创建 Nginx 及 Node.js 应用

nuMfaiY.png!mobile

eYJv2aZ.png!mobile

3. 创建 Nginx 及 Node.js 的部署组

Un6BBni.png!mobile

eI7zyme.png!mobile

4. 通过部署组完成镜像的部署

FRNVfa.png!mobile

e6NJbmq.png!mobile

u6vY7be.png!mobile

Node.js 测试

1. 直接访问 Node.js 应用

B3Qnaaa.png!mobile

2. 在服务治理中测试 API 接口

ZbUJNnE.png!mobile

3.  进入到容器内确认接口是否可通过服务名调用

sudo docker ps   #查找容器id
sudo docker exec -it cfa4343f4a22 /bin/bash  #进入容器内部

Docker  容器内部测试通过服务名进行调用

u6vY7be.png!mobile

Nginx 测试

1.  容器中目录结构及测试( WORKDIR 可根据自身需求修改)

zmIFRbF.png!mobile

2. 通过外网访问静态资源

fE3aYzZ.png!mobile

停止服务后

mQJBn2v.png!mobile

3.  服务治理中显示服务已上线

eaIFfa6.png!mobile

4.  在 Node.js 服务容器内 curl 访问 Nginx 服务成功

AVzMfeE.png!mobile

u6vY7be.png!mobile

总结

TSF Mesh 通过数据面及控制面的组合,以 sidecar 的形式作为本地的 L7 层代理,和服务运行在同一个 pod 中,与 pod 共享网络。也正是通过这一组合,完成整体微服务架构的内部治理及运维。

虽然上述测试仅做了基本的连通性测试,但 TSF 平台上服务治理、监控运维、构建部署、配置变更等相关能力都是具备的。同时可以看到 TSF Mesh 在接入非 java 的应用时,如 Node.js、PHP、Python 等,接入成本非常低,对代码可以达到“零侵入”,非常适合异构语言、遗留老旧系统的微服务改造,这也是微服务团队研发 TSF Mesh 的初衷。

往期

推荐

BruQnqn.png!mobile

RjMJjq3.jpg!mobile

VNb2qmY.png!mobile

扫描下方二维码关注本公众号,

了解更多微服务、消息队列的相关信息!

解锁超多鹅厂周边!

MRzQVfU.png!mobile

戳原文,了解更多腾讯微服务平台的信息

点亮 在看 ,你最好看


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK