Criando Microsserviços em PHP
Flávio Gomes da Silva Lisboa
www.fgsl.eti.br
Preâmbulo
O que vamos falar aqui tem muito a ver com a
disponibilidade de um sistema de software e a
manutenção em ambiente de produção.
Problemas irão ocorrer, não tenha dúvida. A
questão é como identificar a causa dos problemas
e como recuperar o funcionamento de um sistema
de software rapidamente.
Disponibilidade = Capacidade de se reerguer
Steve Rogers e Capitão América, criados por Joe Simon e Jack Kirby
Arquitetura monolítica e arquitetura distribuída
Fonte: https://cloud.google.com/kubernetes-engine/kubernetes-comic/
* wedge sneaker: tênis plataforma
* kudgy: deselegante
Arquitetura monolítica e arquitetura distribuída
INTERFACE COM O USUÁRIO
REGRAS DE NEGÓCIO
ACESSO AOS DADOS
BANCO DE DADOS
APLICAÇÃO MONOLÍTICA
Arquitetura monolítica e arquitetura distribuída
Arquitetura monolítica e arquitetura distribuída
Harvard Mark I
Arquitetura monolítica e arquitetura distribuída
Em 9 de setembro de 1945, uma traça causou um curto-circuito no Harvard Mark I
Fonte: https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2013/09/bug.jpg
Arquitetura monolítica e arquitetura distribuída
Fonte: https://cloud.google.com/kubernetes-engine/kubernetes-comic/
Arquitetura monolítica e arquitetura distribuída
APLICAÇÃO DISTRIBUÍDA
INTERFACE
COM O
USUÁRIO
REGRAS DE
NEGÓCIO
ACESSO AOS
DADOS BANCO DE DADOS
Arquitetura monolítica e arquitetura distribuída
Fonte: http://turnoff.us/geek/are-you-ready-for-microservices/
Arquitetura centralizada e arquitetura descentralizada
APLICAÇÃO DISTRIBUÍDA
MAS CENTRALIZADA
INTERFACE
COM O
USUÁRIO
REGRAS DE
NEGÓCIO
ACESSO AOS
DADOS BANCO DE DADOS
Arquitetura centralizada e arquitetura descentralizada
APLICAÇÃO DISTRIBUÍDA
DESCENTRALIZADA
INTERFACE COM O
USUÁRIO
REGRAS DE NEGÓCIO
ACESSO AOS DADOS BANCO DE DADOS
BANCO DE DADOS
BANCO DE DADOS
INTERFACE COM O
USUÁRIO
INTERFACE COM O
USUÁRIO
REGRAS DE NEGÓCIO
REGRAS DE NEGÓCIO
Arquitetura centralizada e arquitetura descentralizada
APLICAÇÃO DISTRIBUÍDA
DESCENTRALIZADA
REGRAS DE NEGÓCIO
ACESSO AOS DADOS BANCO DE DADOS
BANCO DE DADOS
BANCO DE DADOS
REGRAS DE NEGÓCIO
REGRAS DE NEGÓCIO
Arquitetura centralizada e arquitetura descentralizada
APLICAÇÃO DISTRIBUÍDA
DESCENTRALIZADA
INTERFACE COM O
USUÁRIO
REGRAS DE NEGÓCIO
ACESSO AOS DADOS BANCO DE DADOS
BANCO DE DADOS
BANCO DE DADOS
INTERFACE COM O
USUÁRIO
INTERFACE COM O
USUÁRIO
REGRAS DE NEGÓCIO
REGRAS DE NEGÓCIO
API
Gateway
Prós e Contras
Benefícios
●
Separação de interesses
– Modularidade
– Encapsulamento
●
Escalabilidade
– Escalabilidade horizontal
– Particionamento de workload
Prós e Contras
Dificuldades
●
Latência de rede
●
Depuração
●
Novos desafios arquiteturais
– Encapsulamento
●
Escalabilidade
– Escalabilidade horizontal
– Particionamento de workload
Recursos de PHP para criação de microsserviços
●
PHP é fácil de implantar
●
PHP 7 é super rápido
●
Grande comunidade
●
Bibliotecas e frameworks disponíveis
●
Comunicação assíncrona em PHP (Swoole,
ReactPHP)
https://www.zimuel.it/slides/codeeurope2018#/5
RÁPIDO
Usando um microframework para criar microsserviços
O framework PHP para aplicações middleware.
●
Suporte a PSR-7 (usando zend-diactoros)
●
Suporte a PSR-15 e piping workflow (usando
zend-stratigility)
●
Funcionalidades: roteamento, injeção de
dependências, templating e manipulação de
erros
●
Suporte de Swoole
Usando um microframework para criar microsserviços
PSR-7: HTTP Message Interface, editada por
Matthew Weier O’Phinney
PSR-15: HTTP Handlers, patrocinada por
Matthew Weier O’Phinney
Alguns conceitos, de forma sucinta
Aplicação: uma orquestração de middlewares;
Middleware: um programa que manipula uma
requisição e uma resposta HTTP – pode delegar
tarefas a outros middlewares;
Handler: um programa que recebe uma
requisição e retorna uma resposta – não delega
tarefas a middlewares.
Alguns conceitos, de forma sucinta
APLICAÇÃO
MIDDLEWARE MIDDLEWAREMIDDLEWARE MIDDLEWARE
HANDLERHANDLER HANDLER HANDLER HANDLERHANDLER
Exemplo de microsserviço implementado com Expressive
Criação de projeto PHP a partir do template do
Expressive usando Composer
Ambiente
Ambiente: Ubuntu 18.04LTS
Pacotes Debian necessários:
●
php
●
composer
Criação da aplicação com Composer
composer create-project zendframework/zend-expressive-skeleton msmn
Installing zendframework/zend-expressive-skeleton (3.2.3)
- Installing zendframework/zend-expressive-skeleton (3.2.3):
Downloading (conDownloading (100%)
Created project in msmn
> ExpressiveInstallerOptionalPackages::install
Setting up optional packages
Setup data and cache dir
Removing installer development dependencies
What type of installation would you like?
[1] Minimal (no default middleware, templates, or assets;
configuration only)
[2] Flat (flat source code structure; default selection)
[3] Modular (modular source code structure; recommended)
Make your selection (2): 3
Container de injeção de dependências
Which container do you want to use for dependency injection?
[1] Aura.Di
[2] Pimple
[3] zend-servicemanager
[4] Auryn
[5] Symfony DI Container
[6] PHP-DI
Make your selection or type a composer package name and version
(zend-servicemanager): 3
Roteador de requisições
Which router do you want to use?
[1] Aura.Router
[2] FastRoute
[3] zend-router
Make your selection or type a composer package name and version
(FastRoute): 3
Mecanismo de templating
Which template engine do you want to use?
[1] Plates
[2] Twig
[3] zend-view installs zend-servicemanager
[n] None of the above
Make your selection or type a composer package name and version
(n): 3
Manipulador de erros
Which error handler do you want to use during development?
[1] Whoops
[n] None of the above
Make your selection or type a composer package name and version
(Whoops): 1
Provedor de configuração de validação
Please select which config file you wish to inject 'ZendValidator
ConfigProvider' into:
[0] Do not inject
[1] config/config.php
Make your selection (default is 1):1
Injeção de componentes na configuração
Remember this option for other packages of the same type? (Y/n)Y
Estrutura da aplicação
configuração
ponto de entrada
handler
view template
layout template
Iniciando o servidor web com Composer
composer run --timeout=0 serve
No composer.json:
"serve" : "php -S 0.0.0.0:8080 -t public/",
Modo de desenvolvimento
Habilita modo de desenvolvimento
composer development-enable
Desabilita modo de desenvolvimento
composer development-disable
Status do modo de desenvolvimento
composer development-status
Limpeza de cache
composer clear-config-cache
Execução dos testes automatizados
composer check
Geração de código
composer expressive
Geração de código
composer expressive
Uma Web API básica
return function (Application $app, MiddlewareFactory $factory,
ContainerInterface $container) : void {
$app->get('/', AppHandlerHomePageHandler::class, 'home');
$app->get('/api/ping', AppHandlerPingHandler::class, 'api.ping');
};
URL HANDLER
msmn/config/routes.php
Uma manipulador de requisição
<?php
declare(strict_types=1);
namespace AppHandler;
use PsrHttpMessageResponseInterface;
use PsrHttpMessageServerRequestInterface;
use PsrHttpServerRequestHandlerInterface;
use ZendDiactorosResponseJsonResponse;
use function time;
class PingHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request) :
ResponseInterface
{
return new JsonResponse(['ack' => time()]);
}
}
msmn/src/App/src/Handler/PingHandler.php
Middlewares como microsserviços
Demonstração
Créditos
Esta apresentação foi baseada em parte em:
ZIMUEL, Enrico. DEVELOP MICROSERVICES IN
PHP. Disponível em:
<https://pt.slideshare.net/ZendTechnologies/devel
op-microservices-in-php>. Acesso em:
Obrigado
www.fgsl.eti.br

Criando microsserviços em PHP

  • 1.
    Criando Microsserviços emPHP Flávio Gomes da Silva Lisboa www.fgsl.eti.br
  • 2.
    Preâmbulo O que vamosfalar aqui tem muito a ver com a disponibilidade de um sistema de software e a manutenção em ambiente de produção. Problemas irão ocorrer, não tenha dúvida. A questão é como identificar a causa dos problemas e como recuperar o funcionamento de um sistema de software rapidamente.
  • 3.
    Disponibilidade = Capacidadede se reerguer Steve Rogers e Capitão América, criados por Joe Simon e Jack Kirby
  • 4.
    Arquitetura monolítica earquitetura distribuída Fonte: https://cloud.google.com/kubernetes-engine/kubernetes-comic/ * wedge sneaker: tênis plataforma * kudgy: deselegante
  • 5.
    Arquitetura monolítica earquitetura distribuída INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS APLICAÇÃO MONOLÍTICA
  • 6.
    Arquitetura monolítica earquitetura distribuída
  • 7.
    Arquitetura monolítica earquitetura distribuída Harvard Mark I
  • 8.
    Arquitetura monolítica earquitetura distribuída Em 9 de setembro de 1945, uma traça causou um curto-circuito no Harvard Mark I Fonte: https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2013/09/bug.jpg
  • 9.
    Arquitetura monolítica earquitetura distribuída Fonte: https://cloud.google.com/kubernetes-engine/kubernetes-comic/
  • 10.
    Arquitetura monolítica earquitetura distribuída APLICAÇÃO DISTRIBUÍDA INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS
  • 11.
    Arquitetura monolítica earquitetura distribuída Fonte: http://turnoff.us/geek/are-you-ready-for-microservices/
  • 12.
    Arquitetura centralizada earquitetura descentralizada APLICAÇÃO DISTRIBUÍDA MAS CENTRALIZADA INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS
  • 13.
    Arquitetura centralizada earquitetura descentralizada APLICAÇÃO DISTRIBUÍDA DESCENTRALIZADA INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS BANCO DE DADOS BANCO DE DADOS INTERFACE COM O USUÁRIO INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO REGRAS DE NEGÓCIO
  • 14.
    Arquitetura centralizada earquitetura descentralizada APLICAÇÃO DISTRIBUÍDA DESCENTRALIZADA REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS BANCO DE DADOS BANCO DE DADOS REGRAS DE NEGÓCIO REGRAS DE NEGÓCIO
  • 15.
    Arquitetura centralizada earquitetura descentralizada APLICAÇÃO DISTRIBUÍDA DESCENTRALIZADA INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO ACESSO AOS DADOS BANCO DE DADOS BANCO DE DADOS BANCO DE DADOS INTERFACE COM O USUÁRIO INTERFACE COM O USUÁRIO REGRAS DE NEGÓCIO REGRAS DE NEGÓCIO API Gateway
  • 16.
    Prós e Contras Benefícios ● Separaçãode interesses – Modularidade – Encapsulamento ● Escalabilidade – Escalabilidade horizontal – Particionamento de workload
  • 17.
    Prós e Contras Dificuldades ● Latênciade rede ● Depuração ● Novos desafios arquiteturais – Encapsulamento ● Escalabilidade – Escalabilidade horizontal – Particionamento de workload
  • 18.
    Recursos de PHPpara criação de microsserviços ● PHP é fácil de implantar ● PHP 7 é super rápido ● Grande comunidade ● Bibliotecas e frameworks disponíveis ● Comunicação assíncrona em PHP (Swoole, ReactPHP)
  • 19.
  • 20.
    Usando um microframeworkpara criar microsserviços O framework PHP para aplicações middleware. ● Suporte a PSR-7 (usando zend-diactoros) ● Suporte a PSR-15 e piping workflow (usando zend-stratigility) ● Funcionalidades: roteamento, injeção de dependências, templating e manipulação de erros ● Suporte de Swoole
  • 21.
    Usando um microframeworkpara criar microsserviços PSR-7: HTTP Message Interface, editada por Matthew Weier O’Phinney PSR-15: HTTP Handlers, patrocinada por Matthew Weier O’Phinney
  • 22.
    Alguns conceitos, deforma sucinta Aplicação: uma orquestração de middlewares; Middleware: um programa que manipula uma requisição e uma resposta HTTP – pode delegar tarefas a outros middlewares; Handler: um programa que recebe uma requisição e retorna uma resposta – não delega tarefas a middlewares.
  • 23.
    Alguns conceitos, deforma sucinta APLICAÇÃO MIDDLEWARE MIDDLEWAREMIDDLEWARE MIDDLEWARE HANDLERHANDLER HANDLER HANDLER HANDLERHANDLER
  • 24.
    Exemplo de microsserviçoimplementado com Expressive Criação de projeto PHP a partir do template do Expressive usando Composer
  • 25.
    Ambiente Ambiente: Ubuntu 18.04LTS PacotesDebian necessários: ● php ● composer
  • 26.
    Criação da aplicaçãocom Composer composer create-project zendframework/zend-expressive-skeleton msmn Installing zendframework/zend-expressive-skeleton (3.2.3) - Installing zendframework/zend-expressive-skeleton (3.2.3): Downloading (conDownloading (100%) Created project in msmn > ExpressiveInstallerOptionalPackages::install Setting up optional packages Setup data and cache dir Removing installer development dependencies What type of installation would you like? [1] Minimal (no default middleware, templates, or assets; configuration only) [2] Flat (flat source code structure; default selection) [3] Modular (modular source code structure; recommended) Make your selection (2): 3
  • 27.
    Container de injeçãode dependências Which container do you want to use for dependency injection? [1] Aura.Di [2] Pimple [3] zend-servicemanager [4] Auryn [5] Symfony DI Container [6] PHP-DI Make your selection or type a composer package name and version (zend-servicemanager): 3
  • 28.
    Roteador de requisições Whichrouter do you want to use? [1] Aura.Router [2] FastRoute [3] zend-router Make your selection or type a composer package name and version (FastRoute): 3
  • 29.
    Mecanismo de templating Whichtemplate engine do you want to use? [1] Plates [2] Twig [3] zend-view installs zend-servicemanager [n] None of the above Make your selection or type a composer package name and version (n): 3
  • 30.
    Manipulador de erros Whicherror handler do you want to use during development? [1] Whoops [n] None of the above Make your selection or type a composer package name and version (Whoops): 1
  • 31.
    Provedor de configuraçãode validação Please select which config file you wish to inject 'ZendValidator ConfigProvider' into: [0] Do not inject [1] config/config.php Make your selection (default is 1):1
  • 32.
    Injeção de componentesna configuração Remember this option for other packages of the same type? (Y/n)Y
  • 33.
    Estrutura da aplicação configuração pontode entrada handler view template layout template
  • 34.
    Iniciando o servidorweb com Composer composer run --timeout=0 serve No composer.json: "serve" : "php -S 0.0.0.0:8080 -t public/",
  • 35.
    Modo de desenvolvimento Habilitamodo de desenvolvimento composer development-enable Desabilita modo de desenvolvimento composer development-disable Status do modo de desenvolvimento composer development-status
  • 36.
    Limpeza de cache composerclear-config-cache
  • 37.
    Execução dos testesautomatizados composer check
  • 38.
  • 39.
  • 40.
    Uma Web APIbásica return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void { $app->get('/', AppHandlerHomePageHandler::class, 'home'); $app->get('/api/ping', AppHandlerPingHandler::class, 'api.ping'); }; URL HANDLER msmn/config/routes.php
  • 41.
    Uma manipulador derequisição <?php declare(strict_types=1); namespace AppHandler; use PsrHttpMessageResponseInterface; use PsrHttpMessageServerRequestInterface; use PsrHttpServerRequestHandlerInterface; use ZendDiactorosResponseJsonResponse; use function time; class PingHandler implements RequestHandlerInterface { public function handle(ServerRequestInterface $request) : ResponseInterface { return new JsonResponse(['ack' => time()]); } } msmn/src/App/src/Handler/PingHandler.php
  • 42.
  • 43.
  • 44.
    Créditos Esta apresentação foibaseada em parte em: ZIMUEL, Enrico. DEVELOP MICROSERVICES IN PHP. Disponível em: <https://pt.slideshare.net/ZendTechnologies/devel op-microservices-in-php>. Acesso em:
  • 45.