导语
TSF Mesh 微服务平台(Tencent Service Mesh framework,以下简称 TSF Mesh)是一个基础设施层,用于处理服务间的通信。TSF Mesh 是由一系列轻量级的网络代理(又称 Sidecar)组成,这些代理与应用程序部署在一起,通过劫持应用流量进行服务通信,而应用程序不感知 Sidecar 的存在。TSF Mesh 可以支持不同框架、不同语言的应用程序,包括前端应用以及后端应用,以统一的方式运行在腾讯微服务平台 TSF(Tencent Service framework)中。
本文将通过一个 java 应用和一个基于 nginx 的静态应用,来介绍如何通过 TSF Mesh 进行前后端应用的统一托管。
Demo下载地址:
(复制链接到浏览器查看详情)
https://cloud.tencent.com/document/product/649/30436
作
者
介
绍
王维
多年开发架构经验,熟悉电商、支付业务。熟悉微服务架构的开发与落地。目前主要聚焦于微服务、消息队列及周边中间件。
一、环境准备
首先,需要登录 TSF 控制台,进行相关环境与资源的创建。
1.应用
单击【应用管理】>【新建应用】按钮。填写应用信息,选择部署方式【容器部署】,选择应用类型【Mesh应用】,点击【提交】按钮,创建应用。
2.集群
单击【集群】>【新建集群】按钮。填写集群信息,选择容器类型【容器集群】,点击【提交】按钮,创建容器集群,然后导入云主机。
3.部署组
单击【部署组】>【新建部署组】按钮。填写部署组信息,并单击【保存&下一步】按钮,创建部署组。具体操作步骤,请参考TSF官方操作指南中【环境与资源管理】及【应用部署】部分。
>>>复制链接到浏览器查看详情:
https://cloud.tencent.com/document/product/649/36499
二、构建 java 应用镜像
将应用程序打包,添加配置文件,编写 Dockerfile 文件,构建镜像,推送到指定镜像仓库。
1.应用打包
以 java 程序为例说明程序包: userService.tar.gz,包内文件结构如下:文件结构
文件说明
文件示例
userService/apis/user.yaml
openapi: 3.0.0info: version: "1.0.0" title: user servicepaths: /api/v6/user/create: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found /api/v6/user/account/query: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found /health: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found
spec.yaml
apiVersion: v1kind: Applicationspec: services: - name: user # 服务名 ports: - targetPort: 8089 # 服务监听端口 protocol: http # 目前支持 HTTP、HTTP2 和 gRPC healthCheck: path: /health # 健康检查 URL
<左右滑动查看更多>
⚠️ 注意
healthCheck 是健康检查的接口,请确认本地调用curl -i -H 'Host: local-service' {ip}:{Port}/health能返回200,否则,健康检查失败会导致此服务实例变为离线状态,其它服务将无法调用该服务实例;如果不提供此健康检查接口,sidecar 会通过 TCP 的方式探测 targetPort 是否连通来判断此服务实例是否健康。
Host: local-service是代理加的 header,业务如果对 Host 有检查(如 Nginx 配置的 server_name),则需将 local-service 加到白名单。
start.sh
#!/bin/bashmkdir -p /opt/tsf/app_config/apis cp /root/app/userService/spec.yaml /opt/tsf/app_config/cp -r /root/app/userService/apis /opt/tsf/app_config/cd /root/app/userService/java -jar tsf-user-demo-1.0-SNAPSHOT.jar
<左右滑动查看更多>
文件打包
将以上文件放入到文件夹(如:userService),通过以下命令,将上述文件打包成tar.gz(如:userService.tar.gz)。
tar -zcvf userService.tar.gz userService/
如果是在 mac 操作系统上则需加 COPYFILE_DISABLE=1 参数去除掉特有的隐藏文件。
COPYFILE_DISABLE=1 tar -zcvf userService.tar.gz userService/
<左右滑动查看更多>
1.Dockerfile
在应用程序包同级目录中新建 dockerfile 文件,如下:
Dockerfile 文件内容示例:
FROM centos:7RUN yum update -y && yum install -y java-1.8.0-openjdk# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo "Asia/Shanghai" > /etc/timezoneRUN mkdir /root/app/# 其中 userService.tar.gz 是 Mesh 应用压缩包ADD userService.tar.gz /root/app/# 指定到jar的当前目录执行WORKDIR /root/app/userServiceENTRYPOINT ["bash", "start.sh"
<左右滑动查看更多>
⚠️ 注意
基础镜像,请根据具体情况进行替换
3.构建镜像
打开命令行工具,进入程序包所在文件夹。执行如下命令构建镜像:
docker build . -t ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag
<左右滑动查看更多>
4.推送镜像
登录镜像仓库
docker login --username={user_name} ccr.ccs.tencentyun.com
<左右滑动查看更多>
推送镜像
docker push ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag}
<左右滑动查看更多>
⚠️ 注意
ccr.ccs.tencentyun.com/
{tsf_uid}/{app_name}到控制台镜像仓库对应的应用记录中复制即可。
{tsf_uid}为tsf登录账号对应的uid,{app_name}为应用名称,与TSF控制台应用名称保持一致,{tag}为镜像的版本,自行指定即可(如:v1)。
三、构建 nginx 静态应用镜像
1.应用打包
以 tsf_demo_nginx_mesh 程序为例说明,文件结构如下。文件结构
文件说明
文件示例
apis/ngnix-service.yaml
openapi: 3.0.0info: version: "1.0.0" title: ngnix-servicepaths: /webs/hello.html: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found /webs/health.html: get: responses: '200': description: OK '401': description: Unauthorized '402': description: Forbidden '403': description: Not Found
spec.yaml
apiVersion: v1kind: Applicationspec: services: - name: ngnix-service # 服务名 ports: - targetPort: 80 # 服务监听端口 protocol: http # 目前支持 HTTP、HTTP2 和 gRPC healthCheck: path: /webs/health.html # 健康检查 URL
<左右滑动查看更多>
start.sh
#!/bin/bash# 拷贝配置文件mkdir -p /opt/tsf/app_config/apis cp /usr/share/nginx/html/spec.yaml /opt/tsf/app_config/cp -r /usr/share/nginx/html/apis /opt/tsf/app_config/# 启动 nginxnginx -g "daemon off;"
<左右滑动查看更多>
2.Dockerfile
在应用程序文件夹同级目录中新建 Dockerfile 文件,如下:
Dockerfile 文件内容示例:
# 基础镜像FROM nginx#将本地文件拷贝到镜像中,tsf_demo_nginx_mesh 文件夹名称可自行定义COPY ./tsf_demo_nginx_mesh /usr/share/nginx/html/WORKDIR /usr/share/nginx/html/RUN chmod x start.shENTRYPOINT ["bash","./start.sh"]
<左右滑动查看更多>
3.构建镜像
打开命令行工具,进入程序包所在文件夹。执行如下命令构建镜像:
docker build . -t ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag}
<左右滑动查看更多>
4.推送镜像
登录镜像仓库
docker login --username={user_name} ccr.ccs.tencentyun.com
<左右滑动查看更多>
推送镜像
docker push ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag}
<左右滑动查看更多>
5.nginx 配置说明
以上为nginx默认配置使用方式,如需要更改默认配置(如:端口号、重定向等),请自行修改对应的 nginx.conf 文件,并一起打包到镜像中。nginx.conf 文件示例:
user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events { worker_connections 1024;}http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main 'remote_addr:$remote_addr - remote_user:$remote_user [$time_local] "$request" ' 'status:$status request_time:$request_time body_bytes_sent:$body_bytes_sent http_referer:"$http_referer" ' 'http_user_agent:"$http_user_agent" http_x_forwarded_for:"$http_x_forwarded_for" ' 'upstream_status:$upstream_status upstream_addr:$upstream_addr upstream_response_time:$upstream_response_time'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; client_max_body_size 20m; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /baidu { proxy_pass http://www.baidu.com/; } # 通过服务名访问后端服务 user location /user { proxy_pass http://user/api/v6/user/account/query; proxy_http_version 1.1; } # 通过服务名访问后端服务 user location /health { proxy_pass http://user/health; proxy_http_version 1.1; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }}
<左右滑动查看更多>
⚠️ 注意
如有需要,可以通过tsf中的服务名称进行对后端服务的访问,如上述 location /user 配置。
在 Dockerfile 中将上述 nignx.conf 拷贝到指定目录
FROM nginxCOPY ./tsf_demo_nginx_mesh /usr/share/nginx/html/ADD nginx.conf /etc/nginx/nginx.confWORKDIR /usr/share/nginx/html/RUN chmod x start.shENTRYPOINT ["bash","./start.sh"]
<左右滑动查看更多>
如果需要在nginx访问后端服务,则需要确保 istio_proxy 先于 nginx 启动,这样才能实现通过服务名称对后端服务进行访问。start.sh 文件示例:
#!/bin/bash# 拷贝配置文件mkdir -p /opt/tsf/app_config/apis cp /usr/share/nginx/html/spec.yaml /opt/tsf/app_config/cp -r /usr/share/nginx/html/apis /opt/tsf/app_config/# 检测 isito-proxy 状态是否就绪while [ true ]do already_run=`curl 127.0.0.1:15021/status` echo $already_run if [ "$already_run" == "CONFIG_READY" ]; then echo "ready go" break fi sleep 10done# 启动 nginxnginx -g "daemon off;"
<左右滑动查看更多>
四、部署应用
选择部署组列表中对应条目中【部署应用】按钮,部署应用。
选择对应版本镜像,指定端口号,点击【完成】按钮进行部署。部署成功后,在【服务治理】页面,可以展示出服务实例信息。进入相应微服务,在【接口列表】页签,可以看到对应的API列表。具体操作步骤,请参考TSF官方操作指南中【应用部署】及【服务治理】部分。
>>>复制链接到浏览器查看详情:
https://cloud.tencent.com/document/product/649/36499
五、验证
经过上述操作,应用部署成功后,可进行如下验证。通过浏览器访问 java 服务中的 API。
通过浏览器访问 nginx 服务的首页。
通过浏览器访问 nginx 服务中的静态页面。
通过浏览器访问 nginx 服务,并重定向到后端 java 服务。
小结
上文通过简单的示例,展示了 java 应用与 nginx 静态应用通过 TSF Mesh 以统一的形式托管并运行于 TSF 之上。同样,TSF Mesh 也支持其他语言开发的应用程序(如:PHP,Python,Go等)。正是因为 TSF Mesh 具备这种跨多语言、多框架的能力,所以,TSF Mesh 非常适用于具有不同技术栈的团队,以及新老应用并存的场景。从而,可以为企业在微服务架构转型的过程中带来更多的助力。
- End -
,