perf: 增加remote module 请求转发模式

This commit is contained in:
daodao97
2020-06-19 14:49:25 +08:00
parent 46b41b5711
commit 0d5613a33e
9 changed files with 171 additions and 14 deletions

View File

@@ -194,11 +194,9 @@ class MenuController extends AdminAbstractController
'permission|权限标识' => [
'type' => 'select',
'default' => [],
'options' => function ($field, $data) {
return $this->permission_service->getSystemRouteOptions();
},
'props' => [
'multiple' => true,
'selectApi' => '/system/routes?module={module}'
],
],
'pid|上级类目' => [
@@ -272,7 +270,7 @@ class MenuController extends AdminAbstractController
[
'text' => '加子菜单',
'type' => 'form',
'target' => '/menu/form?pid[]={id}&module={tab_id}',
'target' => '/menu/form?pid[]={id}&module={module}',
'formUi' => [
'form' => [
'labelWidth' => '80px',
@@ -330,6 +328,7 @@ class MenuController extends AdminAbstractController
'columns' => [
['field' => 'id', 'hidden' => true],
['field' => 'pid', 'hidden' => true],
['field' => 'module', 'hidden' => true],
[
'field' => 'label',
'width' => '250px',

View File

@@ -1,10 +1,9 @@
<?php
namespace HyperfAdmin\Admin\Controller;
use HyperfAdmin\Admin\Model\ExportTasks;
use Hyperf\Utils\Str;
use HyperfAdmin\Admin\Service\CommonConfig;
use HyperfAdmin\Admin\Service\ExportService;
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
use HyperfAdmin\Admin\Service\ModuleProxy;
class SystemController extends AdminAbstractController
{
@@ -26,4 +25,19 @@ class SystemController extends AdminAbstractController
return $this->success($config);
}
public function routes()
{
$module_proxy = make(ModuleProxy::class);
if ($module_proxy->needProxy()) {
return $this->success($module_proxy->request()['payload']);
}
$kw = $this->request->input('kw', '');
$routes = $this->permission_service->getSystemRouteOptions();
$routes = array_filter($routes, function ($item) use ($kw) {
return Str::contains($item['value'], $kw);
});
return $this->success(array_values($routes));
}
}

View File

@@ -5,18 +5,25 @@
*/
namespace HyperfAdmin\Admin\Middleware;
use FastRoute\Dispatcher;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
use Hyperf\HttpServer\CoreMiddleware;
use Hyperf\HttpServer\Router\Dispatched;
use Hyperf\Logger\LoggerFactory;
use HyperfAdmin\Admin\Service\AuthService;
use HyperfAdmin\Admin\Service\CommonConfig;
use HyperfAdmin\Admin\Service\ModuleProxy;
use HyperfAdmin\Admin\Service\PermissionService;
use HyperfAdmin\BaseUtils\AKSK;
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
use HyperfAdmin\BaseUtils\Guzzle;
use HyperfAdmin\BaseUtils\Log;
use HyperfAdmin\BaseUtils\Redis\Redis;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use HyperfAdmin\Admin\Service\PermissionService;
use HyperfAdmin\Admin\Service\AuthService;
use HyperfAdmin\BaseUtils\AKSK;
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
class PermissionMiddleware extends CoreMiddleware
{
@@ -61,6 +68,18 @@ class PermissionMiddleware extends CoreMiddleware
$uri = $request->getUri();
$path = $uri->getPath();
$method = $request->getMethod();
$module_proxy = make(ModuleProxy::class);
if ($module_proxy->needProxy()) {
$res = $module_proxy->request();
if(isset($res['payload']) && $res['payload'] === []) {
$res['payload'] = (object)[];
}
$response = $this->response->json($res);
Log::get('http')->info('proxy_end', ['module' => $module_proxy->getTargetModule(), 'path' => $path, 'response' => $response]);
return $response;
}
// 其他系统调用走AKSK中间件验证
$client_token = $request->getHeader('Authorization')[0] ?? '';
if ($client_token) {

View File

@@ -0,0 +1,52 @@
<?php
namespace HyperfAdmin\Admin\Service;
use HyperfAdmin\BaseUtils\Guzzle;
use HyperfAdmin\BaseUtils\Redis\Redis;
class ModuleProxy
{
protected $request;
protected $modules;
protected $target_module;
public function __construct()
{
$this->request = request();
$this->modules = Redis::getOrSet('hyperf_admin:system_modules', 500, function () {
$list = CommonConfig::getConfigByName('website_config')['value']['system_module'];
array_change_v2k($list, 'name');
return $list;
});
$this->target_module = $this->request->input('module') ?? (request_header('x-module')[0] ?? '');
}
public function needProxy()
{
$no_proxy = request_header('x-no-proxy')[0] ?? false;
if ($no_proxy) {
return false;
}
if (!isset($this->modules[$this->target_module])) {
return false;
}
if ($this->modules[$this->target_module]['type'] != 'remote') {
return false;
}
return true;
}
public function request()
{
return Guzzle::proxy($this->modules[$this->target_module]['remote_base_uri'] . $this->request->getUri()->getPath(), $this->request);
}
public function getTargetModule()
{
return $this->target_module;
}
}

View File

@@ -243,7 +243,8 @@ class PermissionService
}
}
$user_open_apis = $this->getOpenResourceList('user_open_api');
return array_merge($resources, $user_open_apis);
$system_user_open = config('system.user_open_resource', ['/system/routes']);
return array_merge($resources, $user_open_apis, $system_user_open);
}
public function getOpenResourceList($field = 'open_api')

View File

@@ -38,3 +38,4 @@ register_route('/cconf', CommonConfigController::class, function ($controller) {
});
Router::get('/system/config', [SystemController::class, 'config']);
Router::get('/system/routes', [SystemController::class, 'routes']);