腾云忆想技术大牛手把手教你基于TSF Mesh的前后端应用统一托管

2021-08-31 11:17:22 浏览数 (2)

导语

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

代码语言:javascript复制
openapi: 3.0.0
info:
  version: "1.0.0"
  title: user service
paths:
  /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

代码语言:javascript复制
apiVersion: v1
kind: Application
spec:
  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

代码语言:javascript复制
#!/bin/bash

mkdir -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)。

代码语言:javascript复制
tar -zcvf userService.tar.gz userService/

如果是在 mac 操作系统上则需加 COPYFILE_DISABLE=1 参数去除掉特有的隐藏文件。

代码语言:javascript复制
COPYFILE_DISABLE=1 tar -zcvf userService.tar.gz userService/

<左右滑动查看更多>

1.Dockerfile

在应用程序包同级目录中新建 Dockerfile 文件,如下:

Dockerfile 文件内容示例:

代码语言:javascript复制
FROM centos:7
RUN yum update -y && yum install -y java-1.8.0-openjdk

# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone

RUN mkdir /root/app/
# 其中 userService.tar.gz 是 Mesh 应用压缩包
ADD userService.tar.gz /root/app/

# 指定到jar的当前目录执行
WORKDIR /root/app/userService

ENTRYPOINT ["bash", "start.sh"

<左右滑动查看更多>

⚠️ 注意

基础镜像,请根据具体情况进行替换

3.构建镜像

打开命令行工具,进入程序包所在文件夹。 执行如下命令构建镜像:

代码语言:javascript复制
docker build . -t ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag

<左右滑动查看更多>

4.推送镜像

登录镜像仓库

代码语言:javascript复制
docker login --username={user_name}  ccr.ccs.tencentyun.com

<左右滑动查看更多>

推送镜像

代码语言:javascript复制
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

代码语言:javascript复制
openapi: 3.0.0
info:
  version: "1.0.0"
  title: ngnix-service
paths:
  /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

代码语言:javascript复制
apiVersion: v1
kind: Application
spec:
  services:
    - name: ngnix-service # 服务名
      ports:
        - targetPort: 80 # 服务监听端口
          protocol: http # 目前支持 HTTP、HTTP2 和 gRPC
      healthCheck:
        path: /webs/health.html # 健康检查 URL

<左右滑动查看更多>

start.sh

代码语言:javascript复制
#!/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/

# 启动 nginx
nginx -g "daemon off;"

<左右滑动查看更多>

2.Dockerfile

在应用程序文件夹同级目录中新建 Dockerfile 文件,如下:

Dockerfile 文件内容示例:

代码语言:javascript复制
# 基础镜像
FROM nginx
#将本地文件拷贝到镜像中,tsf_demo_nginx_mesh 文件夹名称可自行定义
COPY ./tsf_demo_nginx_mesh /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html/
RUN chmod  x start.sh
ENTRYPOINT ["bash","./start.sh"]

<左右滑动查看更多>

3.构建镜像

打开命令行工具,进入程序包所在文件夹。 执行如下命令构建镜像:

代码语言:javascript复制
docker build . -t ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag}

<左右滑动查看更多>

4.推送镜像

登录镜像仓库

代码语言:javascript复制
docker login --username={user_name}  ccr.ccs.tencentyun.com

<左右滑动查看更多>

推送镜像

代码语言:javascript复制
docker push ccr.ccs.tencentyun.com/{tsf_uid}/{app_name}:{tag}

<左右滑动查看更多>

5.nginx 配置说明

以上为nginx默认配置使用方式,如需要更改默认配置(如:端口号、重定向等),请自行修改对应的 nginx.conf 文件,并一起打包到镜像中。 nginx.conf 文件示例:

代码语言:javascript复制
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 拷贝到指定目录

代码语言:javascript复制
FROM nginx
COPY ./tsf_demo_nginx_mesh /usr/share/nginx/html/
ADD nginx.conf /etc/nginx/nginx.conf
WORKDIR /usr/share/nginx/html/
RUN chmod  x start.sh
ENTRYPOINT ["bash","./start.sh"]

<左右滑动查看更多>

如果需要在nginx访问后端服务,则需要确保 istio_proxy 先于 nginx 启动,这样才能实现通过服务名称对后端服务进行访问。 start.sh 文件示例:

代码语言:javascript复制
#!/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 10
done

# 启动 nginx
nginx -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 -

0 人点赞