• 简介
  • 相关项目
  • 使用
  • 持续集成

    简介

    Laravel集成微服务治理框架Tars

    • 支持服务打包
    • 支持Laravel/Lumen原生开发
    • 支持TarsConfig
    • 支持TarsLog
    • 支持网关注册下线
    • 支持请求开始(laravel.tars.requesting)、请求结束(laravel.tars.requested)事件
    • 支持echo输出内容
    • 支持http和tars协议
    • 支持zipkin分布式追踪(已移除,可以使用laravel-zipkin扩展包)

    相关项目

    • LaravelTars (https://github.com/luoxiaojun1992/laravel-tars)
    • LaravelTarsDemo (https://github.com/luoxiaojun1992/laravel-tars-demo)
    • LumenTarsDemo (https://github.com/luoxiaojun1992/lumen-tars-demo)
    • Laravel5.x (https://github.com/laravel/framework)
    • Lumen5.x (https://github.com/laravel/lumen)
    • TARSPHP (https://github.com/TarsPHP)
    • TARSPHP DOCKER (https://github.com/tangramor/docker-tars)

    使用

    1. 创建项目

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

    2. 安装Laravel Tars包

      更新Composer依赖

      1. composer require "luoxiaojun1992/laravel-tars:*"

      或添加 requirement 到 composer.json

      1. {
      2. "require": {
      3. "luoxiaojun1992/laravel-tars": "*"
      4. }
      5. }

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

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

      初始化Laravel Tars

      1. php artisan vendor:publish --tag=tars
    3. 修改配置文件src/config/tars.php文件proto字段,替换appName、serverName、objName

    4. 如果使用http协议,且需要自动注册到网关(目前仅支持Kong),修改配置文件src/config/tars.php

      1. 'registries' => [
      2. [
      3. 'type' => 'kong',
      4. 'url' => 'http://kong:8001/upstreams/tars_mysql8/targets', //根据实际情况填写
      5. ]
      6. ]
    5. 配置中心(TarsConfig)或者日志服务(TarsLog)

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

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

      1. 'log_level' => \Monolog\Logger::INFO
    6. 如果使用http协议,按框架原生方式编写代码,路由前缀必须为/Laravel/route

      1. $router->group(['prefix' => '/Laravel/route'], function () use ($router) {
      2. $router->get('/test', function () {
      3. \Illuminate\Support\Facades\Log::info('laravel tars test log');
      4. return 'Laravel Tars Test Success';
      5. });
      6. });
    7. 如果使用tars协议

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

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

      1. /bin/bash tars2php.sh

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

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

    8. 搭建Tars-PHP开发环境

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

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

    9. 在Tars-PHP开发环境下打包项目(在src目录下执行php artisan tars:deploy)

    10. 在Tars管理后台发布项目,请参考TARS-PHP-TCP服务端与客户端开发),测试curl 'http://{ip}:{port}/Laravel/route/{api_route}'

    持续集成

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

    1. pipeline {
    2. agent {
    3. node {
    4. label 'phpenv'
    5. }
    6. }
    7. parameters {
    8. string(defaultValue: 'upload_from_jenkins', name: 'TAG_DESC', description: '发布版本描述' )
    9. string(defaultValue: 'master', name: 'BRANCH_NAME', description: 'git分支,如:develop,master 默认: master')
    10. }
    11. environment {
    12. def JENKINS_HOME = "/root/jenkins"
    13. def PROJECT_ROOT = "$JENKINS_HOME/workspace/laravel-tars-demo"
    14. def APP_NAME = "PHPTest"
    15. def SERVER_NAME = "PHPHTTPServer"
    16. }
    17. stages {
    18. stage('代码拉取与编译'){
    19. steps {
    20. echo "checkout from git"
    21. git credentialsId:'2', url: 'https://gitee.com/lb002/laravel-tars-demo', branch: "${env.BRANCH_NAME}"
    22. script {
    23. dir("$PROJECT_ROOT/src") {
    24. echo "Composer Install"
    25. sh "composer install -vvv"
    26. }
    27. }
    28. }
    29. }
    30. stage('单元测试') {
    31. steps {
    32. script {
    33. dir("$PROJECT_ROOT/src") {
    34. echo "phpunit 测试"
    35. sh "vendor/bin/phpunit tests/"
    36. echo "valgrind 测试"
    37. }
    38. }
    39. }
    40. }
    41. stage('覆盖率测试') {
    42. steps {
    43. echo "LCOV 覆盖率测试"
    44. }
    45. }
    46. stage('打包与发布') {
    47. steps {
    48. script {
    49. dir("$PROJECT_ROOT/src") {
    50. echo "打包"
    51. sh "cp .env.example .env"
    52. sh "php artisan tars:deploy"
    53. echo "发布"
    54. sh "ls *.tar.gz > tmp.log"
    55. echo "上传build包"
    56. def packageDeploy = sh(script: "head -n 1 tmp.log", returnStdout: true).trim()
    57. sh "curl -H 'Host:172.18.0.6:3000' -F 'suse=@./${packageDeploy}' -F 'application=${APP_NAME}' -F 'module_name=${SERVER_NAME}' -F 'comment=${env.TAG_DESC}' http://172.18.0.6:3000/pages/server/api/upload_patch_package > curl.log"
    58. echo "发布build包"
    59. def packageVer = sh(script: "jq '.data.id' curl.log", returnStdout: true).trim()
    60. def postJson = '{"serial":true,"items":[{"server_id":30,"command":"patch_tars","parameters":{"patch_id":' + packageVer + ',"bak_flag":false,"update_text":"${env.TAG_DESC}"}}]}'
    61. echo postJson
    62. sh "curl -H 'Host:172.18.0.6:3000' -H 'Content-Type:application/json' -X POST --data '${postJson}' http://172.18.0.6:3000/pages/server/api/add_task"
    63. }
    64. }
    65. }
    66. }
    67. }
    68. post {
    69. success {
    70. emailext (
    71. subject: "[jenkins]构建通知:${env.JOB_NAME} 分支: ${env.BRANCH_NAME} - Build# ${env.BUILD_NUMBER} 成功 !",
    72. body: '${SCRIPT, template="groovy-html.template"}',
    73. mimeType: 'text/html',
    74. to: "luoxiaojun1992@sina.cn",
    75. )
    76. cleanWs()
    77. }
    78. failure {
    79. emailext (
    80. subject: "[jenkins]构建通知:${env.JOB_NAME} 分支: ${env.BRANCH_NAME} - Build# ${env.BUILD_NUMBER} 失败 !",
    81. body: '${SCRIPT, template="groovy-html.template"}',
    82. mimeType: 'text/html',
    83. to: "luoxiaojun1992@sina.cn",
    84. )
    85. cleanWs()
    86. }
    87. }
    88. }