Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Implementando microserviços confiáveis baseados em PHP

Implementando microserviços confiáveis baseados em PHP

Event: Darkmira Tour PHP 2020

Arquitetura de microserviços é totalmente possível usando PHP. PHP tem crescido e melhorado cada vez mais, se tornando uma linguagem totalmente atualizada e com excelente performance. Vamos entender alguns novos conceitos e tecnologias que irão nos ajudar a desenvolver microserviços para durarem.

7bb3a66a199daec275d5ad339724c754?s=128

Junior Grossi

December 12, 2020
Tweet

More Decks by Junior Grossi

Other Decks in Programming

Transcript

  1. IMPLEMENTANDO MICROSERVIÇOS CONFIÁVEIS BASEADOS EM PHP ou pelo menos, como

    eles poderiam ser
  2. eaê, eu sou Junior Grossi twitter.com/junior_grossi github.com/jgrossi grossi.dev

  3. None
  4. https://github.com/corcel/corcel

  5. PHPMG Conference 2019 21/09/2019 - Belo Horizonte, Brazil https://conf.phpmg.com

  6. ahhhh os #elePHPants https://elephpant.me/herd/junior_grossi

  7. remote-first company php / golang / java / js https://glofox.com/careers

  8. Tentando explicar de forma simples conceitos complexos do mundo da

    programação. 1º episódio sobre Clean Architecture em produção
  9. / 2004 php / 2016 / 2019 ✈

  10. bora falar sobre microserviços

  11. EU IREI COMPARTILHAR: o que tenho aprendido nos últimos 2

    anos o que estou aprendendo no momento
  12. Implementando microserviços confiáveis baseados em PHP

  13. Implementando microserviços confiáveis baseados em PHP

  14. Implementando microserviços confiáveis baseados em PHP

  15. PARTE 1 Implementando microserviços confiáveis baseados em PHP

  16. microserviços? de novo? tutorial de 1 minuto

  17. "microserviços" é um estilo de arquitetura ele não irá resolver

    problemas que você não tem ainda! (pode ser que você nunca os tenha)
  18. o que é um monolito? ideia copiada na cara dura

    do @_wsilva
  19. None
  20. o que é uma arquitetura de microserviços?

  21. COM MICROSERVIÇOS precisa de boas implementações compartilha dos mesmos problemas

    dos monolitos
  22. "não use microserviços se você não precisa deles"

  23. PARTE 2 Implementando microserviços confiáveis baseados em PHP

  24. CONFIABILIDADE comunicação logs responsabilidade produtividade

  25. COMUNICAÇÃO síncrona (sync) / HTTP, gRPC assíncrona (async) / event-oriented,

    filas
  26. COMUNICAÇÃO SÍNCRONA

  27. COMUNICAÇÃO ASSÍNCRONA Frontend API Gateway Queue Service A Service B

    Service C book for a class BOOKING_REQUEST 202 (listening to B_R event) GET /v2/bar {"bar":"123"} BOOKING_CONFIRMED results via websockets if required (listening to B_C event) Send notification
  28. COMUNICAÇÃO ASSÍNCRONA um serviço "subscribe" a um evento usa os

    dados (payload) para fazer alguma coisa event identif er "BOOKING_REQUEST" event payload { "userId": "1234567890", "classId": "2345", "classStartDate": "2020-05-14T15 19 21+00 00" }
  29. CONFIABILIDADE comunicação logs responsabilidades produtividade

  30. INVESTIGAÇÃO DE BUG Frontend API Gateway Queue Service A Service

    B Service C book for a class BOOKING_REQUEST 202 (listening to B_R event) GET /v2/bar {"bar":"123"} BOOKING_CONFIRMED results via websockets if required (listening to B_C event) Send notification
  31. NÃO ECONOMIZE NOS LOGS log de todos os requests enviados

    e recebidos log de todas as respostas enviadas e recebidas log de todos os dados de eventos emitidos log de todos os dados de eventos consumidos log de todas as decisões importantes "em microserviços, logs são tipo um best-friend."
  32. None
  33. CONFIABILIDADE comunicação logs responsabilidade produtividade

  34. RESPONSABILIDADE cada serviço precisa de uma razão pra existir é

    permitido duplicar código, mas não dados precisa de algum dado? peça outro serviço! pense 2x antes de sincronizar/copiar dados entre serviços
  35. O QUE EVITAR: 2 ou mais serviços compartilhando o mesmo

    DB (quem mudou o dado? "source of truth"?) implementação parcial de domínio (quando vc tem lógicas iguais/parecidas em serviços diferentes / legado)
  36. CONFIABILIDADE comunicação logs responsabilidade produtividade

  37. PRODUTIVIDADE evitar a "sopa de linguagens" (2 ou 3 no

    máximo) vc contratou a Maria. ela é fodassa em PHP ela começou um serviço novo em Scala ela continua mantendo o serviço de boas Maria sai da empresa agora vc precisa de 2 pessoas: PHP + Scala
  38. PRODUTIVIDADE usar arquitetura de software e padrões similares mais fácil

    de lidar com vários projetos mais fácil de lidar com várias linguagens mais fácil de manter mais fácil de integrar "DDD/Clean Architecture" se encaixam muito bem!
  39. PRODUTIVIDADE compartilhe processos entre serviços compartilhe padrões Git/VCS padrões docker

    compartilhe práticas de CI/CD compartilhe processos de deploy
  40. PARTE 3 Implementando microserviços confiáveis baseados em PHP

  41. TÓPICOS arquitetura de software execução do PHP

  42. ARQUITETURA DE SOFTWARE precisamos de algo flexível precisamos de algo

    organizado precisamos de qualidade precisamos de poder
  43. Robert C. Martin "The goal of software architecture is to

    minimize the human resources required to build and maintain the required system."
  44. mudar a arquitetura é caro pacacete!

  45. ARQUITETURA EM CAMADAS "deixe opções em aberto" (acredite, elas mudam)

    camadas independentes casos de uso independentes comandos independentes
  46. DOMAIN-DRIVEN DESIGN Implementing Domain-Driven Design Vaughn Vernon

  47. HEXAGONAL ARCHITECTURE "Hexagonal Architecture - Message-Oriented Software Design" Matthias Noback

    - @matthiasnoback https://youtu.be/K1EJBmwg9EQ
  48. OBJETIVOS: independente de framework (framework-as-a-tool) testável sem qualquer elemento externo

    independente de UI (Web / Console) independente de banco de dados independente de qualquer agente externo
  49. CLEAN ARCHITECTURE

  50. Clean Architecture Robert C. Martin (Uncle Bob)

  51. SCREAMING ARCHITECTURE "a arquitetura fala por si só" sobre o

    que é seu serviço? (resposta pelo código!) pagamentos? reservas? autenticação? ou é uma aplicação escrita em Laravel, Slim ou Symfony?
  52. None
  53. https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

  54. THE DEPENDENCY RULE "source code dependencies must point only inward,

    toward higher-level policies" ninguém de uma camada "interna" pode saber algo concreto de uma camada "externa".
  55. blz, mas como que eu faço isso? usando interfaces/abstrações!

  56. "code is not reusable. abstractions are." Marco Pivetta (@Ocramius)

  57. EXECUÇÃO DO PHP saindo da zona de conforto ☠

  58. "NodeJS is better for microservices"

  59. Coroutine based Async PHP programming framework Build high-performance, scalable, concurrent

    TCP, UDP, Unix Socket, HTTP, WebSocket services with PHP and fluent Coroutine API. https://www.swoole.co.uk/
  60. como o PHP funciona naturalmente php-fpm / "blocking I/O" CPU

    I/O
  61. como Swoole & Node.js funcionam "non-blocking I/O" / async CPU

    I/O
  62. > pecl install swoole built-in async, coroutine support, multiple threads

    I/O modules async/await yield
  63. None
  64. Master Reactor Reactor Reactor Timer Manager TaskWorker TaskWorker TaskWorker Worker

    Worker Worker Request
  65. None
  66. Initialisation Execute Task Clean up PHP-FPM Execute Task Swoole

  67. AVISO ⚠ use somente para novos serviços (não é uma

    boa ideia pro legadão que vc trabalha)
  68. PRA FICAR DE ALERTA! ☢ variable scope / DI Container

    (singleton) exception handling static content
  69. https://docs.mezzio.dev/mezzio-swoole/ https://github.com/mezzio/mezzio-swoole

  70. http://roadrunner.dev/

  71. install RoadRunner $ make psr worker.php while ($request = $psr7

    acceptRequest()) { $response = new \Zend\Diactoros\Response(); $response getBody() write("hello world"); $psr7 respond($response); } conf g f le http: address: :8080 workers: command: "php psr worker.php" pool: numWorkers: 4 run $ ./rr serve v d
  72. Coroutine Based Concurrency with PHP and Swoole Bruce Dou |

    @doubaokun Feb 2020 PHPUK2020 https://speakerdeck.com/doubaokun/coroutine-based-concurrency-with-php-and-swoole
  73. OBRIGADO! PALESTRA JÁ DISPONÍVEL ⭐ http://speakerdeck.com/jgrossi http://twitter.com/junior_grossi