laravel+react实战打造企业级高并发分布式电商小程序(一) 整体使用laravel7+react打造整个电商小程序。里面会涉及到高并发的知识,mysql的分库分表,主从读写分离的配置,redis集群的使用,缓存系统的使用,队列系统的使用等。
先初始化一个laravel的项目。然后配置好.env
文件。
基础建设 我们使用前后端分离就要考虑跨域问题和安全问题。跨域使用cors
解决,laravel7里面内置了cors
的解决方案,我们只要修改config/cors.php
配置文件就好了。
把里面的值更改一下。修改这个值的原因是因为我们会使用jwt传一个token的请求头过来进行验证。这个时候还是报跨域的错误,所以将supports_credentials
值修改为true,如果不报错就不需要修改了。
1 2 3 'supports_credentials' => true ,
把这个参数的值修改为true。
安全问题使用jwt
的解决方案,安装jwt
的包。
composer require lcobucci/jwt
在routes/api.php路由文件中增加下面的路由
1 2 3 4 Route ::post ('/require_token' , 'JWT\RequireTokenController@requireToken' );
在config下面新建jwt.php
文件,里面内容如下
1 2 3 4 5 6 7 8 <?php return [ 'JWT_SECRET' => env ('JWT_SECRET' ,'DvYUz+woS7vVJe6ldY+PqWoUbhIyY9rShzM0NAfzxdU=' ), 'JWT_EXP_TIME' => env ('JWT_EXP_TIME' ,'36000' ), ];
在.env
中增加下面的内容
1 2 3 4 5 JWT_SECRET=DvYUz+woS7vVJe6ldY+PqWoUbhIyY9rShzM0NAfzxdU= JWT_EXP_TIME=36000
在app/http/middleware
中创建中间件jwtCheck.php
,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php namespace App \Http \Middleware ;use App \Models \Sys \ErrorModel ;use Closure ;use \Lcobucci \JWT \Parser ;use \Lcobucci \JWT \Signer \Hmac \Sha256 ;class jwtCheck { public function handle ($request , Closure $next ) { $parser = new Parser; $signer = new Sha256; $secret = config ('jwt.JWT_SECRET' ); if ($request ->hasHeader ('Authorization' )){ $token = $request ->header ('Authorization' ); $parse = $parser ->parse ($token ); if (!$parse ->verify ($signer , $secret )) { return response ()->json (['code' =>ErrorModel ::JWT_ERROR, 'msg' =>'令牌错误!' ]); } if ($parse ->isExpired ()) { return response ()->json (['code' =>ErrorModel ::JWT_ERROR, 'msg' =>'令牌过期!' ]); } }else { return response ()->json (['code' =>ErrorModel ::JWT_ERROR, 'msg' =>'令牌缺失!' ]); } request ()->offsetSet ('token' , $token ); return $next ($request ); } }
在app/http
下面的Kernel.php
文件里面的$routeMiddleware
变量里面增加下面内容,把中间件注册到系统中。
1 2 'jwtCheck' => \App\Http\Middleware\jwtCheck ::class ,
控制器 创建控制器
在app/http/controller
下面创建jwt
文件夹,然后在jwt
文件夹里面创建RequireTokenController.php
文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?php namespace App \Http \Controllers \JWT ;use App \Http \Controllers \Controller ;use Illuminate \Http \Request ;use \Lcobucci \JWT \Builder ;use \Lcobucci \JWT \Signer \Hmac \Sha256 ;use Illuminate \Support \Facades \Redis ;class RequireTokenController extends Controller { public function requireToken (Builder $builder , Sha256 $signer ) { $secret = config ('jwt.JWT_SECRET' ); $time = time (); $expTime = config ('jwt.JWT_EXP_TIME' ); do { $builder ->setIssuer ("cmp.wliot.com" ) ->setAudience ("cmp.wliot.com" ) ->setId ("abc" , true ) ->setIssuedAt ($time ) ->setExpiration ($time + $expTime ) ->set ('uid' , 30061 ); $builder ->sign ($signer , $secret ); $token = (string )$builder ->getToken (); } while (Redis ::exists ($token )); return $this ->success ($token ); } }
在这里面使用到了$this->success()
方法,这个方法来自controller类,我们需要编写这个方法。
在app/http
下面创建Utils
文件夹,在里面创建Success.php
文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php namespace App \Http \Utils ;use App \Models \Sys \ErrorModel ;trait Success { function success ($data = [] ) { $res = ['code' =>'0' ,'msg' =>'请求成功!' , 'data' =>$data ]; return response ()->json ($res ); } }
修改app/http/controllers/controller.php
文件
1 2 3 4 5 6 7 use App \Http \Utils \Success ; class Controller extends BaseController { use AuthorizesRequests , DispatchesJobs , ValidatesRequests , Success ; }
在这里面使用到了redis,所以我们需要启动你本地的redis服务器。启动之后就可以访问我们上面填写的路由了,使用postman访问你的路由。
可以看到返回了正确的token。
在后面的访问请求中我们需要使用这个token。我们把它加入请求头。在请求头新建一个Authorization
的key,他的值就是我们的token。