Back-End

4 set, 2015

Container para Microservices com Guzzle

Publicidade

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/