Tenho lido sobre microservices. A ideia é ótima. Em vez de construir um script monolítico usando uma linguagem/framework, você cria serviços isolados e constrói sua aplicação utilizando esses serviços (conversando em HTTP entre serviços e aplicação).
Isso significa que teremos vários microservices e precisaremos utilizá-los, e talvez algumas vezes trocar um serviço pelo outro. Neste artigo, quero construir um pequeno container para lidar com esses microservices. Uma ideia parecida com os containers para injeção de dependência.
Como vamos “falar” HTTP, precisamos de um cliente HTTP. Podemos construir um usando curl, mas no mundo PHP temos o Guzzle, uma ótima biblioteca para cliente HTTP. Na verdade, Guzzle tem algo parecido com a ideia deste artigo: Guzzle services, mas eu quero algo mais simples.
Imagine que temos dois services diferentes:
Um service Silex (PHP + Silex)
use Silex\Application; $app = new Application(); $app->get('/hello/{username}', function($username) { return "Hello {$username} from silex service"; }); $app->run();
Outro service PHP. Este, usando o framework Slim.
use Slim\Slim; $app = new Slim(); $app->get('/hello/:username', function ($username) { echo "Hello {$username} from slim service"; }); $app->run();
E, finalmente, um service Python usando o framework Flask
from flask import Flask, jsonify app = Flask(__name__) @app.route('/hello/<username>') def show_user_profile(username): return "Hello %s from flask service" % username if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port=5000)
Agora, nosso simples container pode utilizar um service ou outro
use Symfony\Component\Config\FileLocator; use MSIC\Loader\YamlFileLoader; use MSIC\Container; $container = new Container(); $ymlLoader = new YamlFileLoader($container, new FileLocator(__DIR__)); $ymlLoader->load('container.yml'); echo $container->getService('flaskServer')->get('/hello/Gonzalo')->getBody() . "\n"; echo $container->getService('silexServer')->get('/hello/Gonzalo')->getBody() . "\n"; echo $container->getService('slimServer')->get('/hello/Gonzalo')->getBody() . "\n";
E é isso. Você pode ver o projeto no meu GitHub.
***
Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://gonzalo123.com/2015/06/29/microservice-container-with-guzzle/