laravel-tars: Laravel集成微服务治理框架Tars

[](#laravel-tars-driver)Laravel Tars Driver

[](#%E4%B8%AD%E6%96%87%E7%89%88)中文版

[](#%E6%8F%8F%E8%BF%B0)描述

Tars driver for laravel.

Laravel集成微服务治理框架Tars

[](#%E5%8A%9F%E8%83%BD)功能

  • 支持服务打包
  • 支持Lumen原生开发
  • 支持TarsConfig
  • 支持TarsLog
  • 支持网关注册下线
  • 支持请求开始(laravel.tars.requesting)、请求结束(laravel.tars.requested)事件
  • 支持echo输出内容
  • 支持http和tars协议
  • 支持zipkin分布式追踪

[](#%E7%8E%AF%E5%A2%83%E4%BE%9D%E8%B5%96)环境依赖

  1. Lumen5.x
  2. Tars-PHP

[](#%E5%AE%89%E8%A3%85)安装

  1. 创建项目

    创建Tars项目目录结构(scripts、src、tars),Lumen项目放在src目录下

  2. 安装Laravel Tars包

    更新Composer依赖

    composer require "luoxiaojun1992/laravel-tars:*"

    或添加 requirement 到 composer.json

    {
    "require": {
    "luoxiaojun1992/laravel-tars": "*"
    }
    }

    添加ServiceProvider,编辑src/bootstrap/app.php

    $app->register(\Lxj\Laravel\Tars\ServiceProvider::class);

    初始化Laravel Tars

    //如果使用http协议,则执行此行命令
    php artisan vendor:publish --tag=tars.http
    //如果使用tars协议,则执行此行命令
    php artisan vendor:publish --tag=tars.tars

  3. 修改配置文件src/config/tars.php文件proto字段,替换appName、serverName、objName
  4. 如果使用http协议,且需要自动注册到网关(目前仅支持Kong),修改配置文件src/config/tars.php

    'registries' => [
    [
    'type' => 'kong',
    'url' => 'http://kong:8001/upstreams/tars_mysql8/targets', //根据实际情况填写
    ]
    ]

  5. 如果需要使用配置中心(TarsConfig)、日志服务(TarsLog),修改配置文件src/config/tars.php

    'tarsregistry' => 'tars.tarsregistry.QueryObj@tcp -h 172.17.0.3 -p 17890' //根据实际情况填写,TarsConfig配置文件名称固定为'tars'

    服务启动时会自动拉取配置,如果需要记录日志,可以使用类似Log::info('test log');

    如果需要指定TarsLog记录的最低日志级别,修改配置文件src/config/tars.php

    'log_level' => \Monolog\Logger::INFO

  6. 如果使用http协议,且需要使用分布式追踪(zipkin),修改配置文件src/config/tars.php

    'trace' => [
    'zipkin_url' => 'http://127.0.0.1:9411/api/v2/spans', //根据实际情况填写
    'sample_rate' => 0, //采样频率,百分比小数,根据实际情况替换
    ],

    Trace ID可以通过header声明(x-trace-id),如果为空默认随机生成,同一个Trace ID可以实现调用链追踪

    zipkin demo

  7. 如果使用http协议,按框架原生方式编写代码,路由前缀必须为/Laravel/route

    $router->group(\['prefix' => '/Laravel/route'\], function () use ($router) {
    $router->get('/test', function () {
    \Illuminate\Support\Facades\Log::info('laravel tars test log');
    return 'Laravel Tars Test Success';
    });
    });

  8. 如果使用tars协议

    在tars目录下编写tars接口描述文件,修改配置文件src/config/tars文件proto字段,新增tarsFiles

    在scripts目录执行编译脚本生成接口代码

    /bin/bash tars2php.sh

    在src/app/Tars/impl目录下创建接口实现类,编写业务逻辑代码

    修改src/config/tars.php文件services字段,替换接口和接口实现命名空间

  9. 搭建Tars-PHP开发环境

    如果使用http协议,请参考TARS-PHP-HTTP服务端与客户端开发

    如果使用tars协议,请参考TARS-PHP-TCP服务端与客户端开发

  10. 在Tars-PHP开发环境下打包项目(在src目录下执行php artisan tars:deploy)
  11. 在Tars管理后台发布项目,请参考TARS-PHP-TCP服务端与客户端开发),测试curl 'http://{ip}:{port}/Laravel/route/{api_route}'

[](#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B)使用示例

请参考 https://github.com/luoxiaojun1992/laravel-tars-demo

[](#%E9%9B%86%E6%88%90%E9%83%A8%E7%BD%B2)集成部署

Jenkins Pipeline 配置示例(根据实际情况修改)

pipeline {
agent {
node {
label 'phpenv'
}
}
parameters {
string(defaultValue: 'upload_from_jenkins', name: 'TAG_DESC', description: '发布版本描述' )
string(defaultValue: 'master', name: 'BRANCH_NAME', description: 'git分支,如:develop,master 默认: master')
}
environment {
def JENKINS_HOME = "/root/jenkins"
def PROJECT_ROOT = "$JENKINS_HOME/workspace/laravel-tars-demo"
def APP_NAME = "PHPTest"
def SERVER_NAME = "PHPHTTPServer"
}
stages {
stage('代码拉取与编译'){
steps {
echo "checkout from git"
git credentialsId:'2', url: 'https://gitee.com/lb002/laravel-tars-demo', branch: "${env.BRANCH_NAME}"
script {
dir("$PROJECT_ROOT/src") {
echo "Composer Install"
sh "composer install -vvv"
}
}
}
}
stage('单元测试') {
steps {
script {
dir("$PROJECT_ROOT/src") {
echo "phpunit 测试"
sh "vendor/bin/phpunit tests/"
echo "valgrind 测试"
}
}
}
}
stage('覆盖率测试') {
steps {
echo "LCOV 覆盖率测试"
}
}
stage('打包与发布') {
steps {
script {
dir("$PROJECT_ROOT/src") {
echo "打包"
sh "php artisan tars:deploy"
echo "发布"
sh "ls *.tar.gz > tmp.log"
echo "上传build包"
def packageDeploy = sh(script: "head -n 1 tmp.log", returnStdout: true).trim()
sh "curl -H 'Host:172.18.0.3:3000' -F 'suse=@./${packageDeploy}' -F 'application=${APP_NAME}' -F 'module_name=${SERVER\_NAME}' -F 'comment=${env.TAG_DESC}' http://172.18.0.3:3000/pages/server/api/upload_patch_package > curl.log"
echo "发布build包"
def packageVer = sh(script: "jq '.data.id' curl.log", returnStdout: true).trim()
def postJson = '{"serial":true,"items":[{"server_id":30,"command":"patch_tars","parameters":{"patch_id":' + packageVer + ',"bak_flag":false,"update_text":"${env.TAG_DESC}"}}]}'
echo postJson
sh "curl -H 'Host:172.18.0.3:3000' -H 'Content-Type:application/json' -X POST --data '${postJson}' http://172.18.0.3:3000/pages/server/api/add_task"
}
}
}
}
}
post {
success {
emailext (
subject: "[jenkins]构建通知:${env.JOB\_NAME} 分支: ${env.BRANCH_NAME} - Build# ${env.BUILD_NUMBER} 成功 !",
body: '${SCRIPT, template="groovy-html.template"}',
mimeType: 'text/html',
to: "luoxiaojun1992@sina.cn",
)
cleanWs()
}
failure {
emailext (
subject: "[jenkins]构建通知:${env.JOB\_NAME} 分支: ${env.BRANCH_NAME} - Build# ${env.BUILD_NUMBER} 失败 !",
body: '${SCRIPT, template="groovy-html.template"}',
mimeType: 'text/html',
to: "luoxiaojun1992@sina.cn",
)
cleanWs()
}
}
}


Original url: Access
Created at: 2019-02-13 09:57:59
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论