backend, app e internet das coisas com nodejs no google cloud platform

89
Backend, App e Internet das Coisas com NodeJS e Google Cloud Platform Alvaro Viebrantz aviebrantz.com.br @alvaroviebrantz medium.com/iot-bootcamp 1

Upload: alvaro-viebrantz

Post on 05-Apr-2017

307 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Backend, App e Internet das Coisas com NodeJS e

Google Cloud Platform

Alvaro Viebrantz aviebrantz.com.br @alvaroviebrantz medium.com/iot-bootcamp

1

Page 2: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Alvaro Viebrantz DevMT e GDGCuiabá

Fullstack developer

aviebrantz.com.br // @alvaroviebrantz medium.com/iot-bootcamp

2

Page 3: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Agenda

• O que é computação em nuvem. • Google Cloud Platform Overview. • NodeJS • Estudo de Caso - PacktPub Notifier

• Backend - Google App Engine • App - React Native + Firebase • IoT - Alexa Custom Skill

3

Page 4: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

4

Page 5: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

38 anos

Computadores Primitivos Computadores Pessoais

5

Page 6: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

15 anos

Computadores Pessoais Internet

6

Page 7: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

12 anos

Internet Smartphones / Nuvem / Mobile

7

Page 8: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

“The more advanced we become the faster we become at

advancing”

"Marco Annunziata: Welcome to the Age of the Industrial Internet"8

Page 9: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

9

Page 10: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

10

Page 11: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

4.7 bilhões de

página

A Web é gigante hoje

Era do Zetabyte*

* 1000 Exabytes

36.000 anos de video

em hd

Últimos

20 anos

http://www.livescience.com/54094-how-big-is-the-internet.html

11

Page 12: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Nossa noção de sucesso mudou…

12

Page 13: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

13

Page 14: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

14

Page 15: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

http://press.spotify.com/us/category/pictures/

15

Page 16: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

16

Page 17: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Como isso é possível ?

17

Page 18: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

18

Page 19: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

19

Page 20: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Pilares

Disponibilidade Manutenção Escalável

Economia

20

Page 21: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Escalabilidade Horizontal

Escalabilidade VerticalX

21

Page 22: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

22

Page 23: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Porque Google Cloud Platform ?

23

Page 24: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

O Google Cloud Platform é construído na mesma infraestrutura que os serviços do google rodam

• Rede Global • Redundância • Infraestrutura inovadora

24

Page 25: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

25

Page 26: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Regiões

26

Page 27: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Vantagens

Preço (Cobrança por minuto)

Maquinas Customizáveis (até GPU) Facilmente Escalável

Developer Experience ❤

27

Page 28: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

28

Page 29: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

29

Page 30: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Estudo de Caso

30

Page 31: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Estudo de CasoPacktPub Notifier

Backend

App

IoT

31

Page 32: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

32

Page 33: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Node.js

• Engine V8 do Google Chrome

• Rápido e escalável

• Orientado a eventos e não bloqueante

• Muito leve

• Perfeito para aplicações real-time

33

Page 34: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

É apenas Javascript

• Navegador

• Server side

• Desktop - Electron e NW

• Mobile - Cordova, Ionic, React Native, etc.

• Embarcado - Mongoose OS e Espruino

• Geladeira, torradeira, etc

34

Page 35: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Ecossistema rico

• Muitas ferramentas feitas com Node

• Webpack ❤

• Gerenciadores de pacotes

• NPM e Yarn

• Editores

• Visual Studio Code, Atom, Webstorm

• Mais de 450 mil pacotes no npmjs.com

35

Page 36: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Web Frameworks

• Express.js

• Hapi.js

• Koa

36

Page 37: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Stack escolhido

• Hapi.js no Backend

• Aplicativos iOS e Android nativos com React Native

• Vários serviços do GCP

• Database, Cron, Tasks, HTTPS, etc

37

Page 38: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier v0.1

iOS e Android

Packt Publishing

Website

Backend

38

Page 39: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Hello World com HapiJS

const Hapi = require('hapi'); const server = new Hapi.Server();

server.connection({ host: '0.0.0.0', port: process.env.PORT || 8080 });

server.route({ method: 'GET', path: '/api/tasks/fetch-books', config: { handler: (request, reply) => { reply({ message: 'Hello World'}) } } });

server.start((err) => { if (err) { throw err; } });

39

Page 40: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Web Scrapping

'use strict';

const cheerio = require('cheerio'); const fetch = require('node-fetch'); const urlFreeLearning = 'http://www.packtpub.com/packt/offers/free-learning/';

class PackPubCrawler { /* Código omitido */

async fetchBooksFromPacktPub() { let body = await this.fetchPageBody(); let documentSelector = cheerio.load(body);

let currentBook = this.scrapeCurrentBook(documentSelector);

return { currentBook }; } }

module.exports = PackPubCrawler;

40

Page 41: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Api de Livros

'use strict';

const Boom = require('boom'); const PackPubCrawler = require('../PacktPubCrawler');

module.exports = { method: 'GET', path: '/api/books', config: { handler: async (request, reply) => { try {

const crawler = new PackPubCrawler(); let books = await crawler.fetchBooksFromPacktPub(); console.log('Success Fetching Books'); reply({ books }); } catch (e) { console.log('Error Fetching Books', e); reply(Boom.badGateway('Xablau', e)) } } } }

41

Page 42: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Api de Livros

42

Page 43: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

43

Page 44: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Nuvem

IaaSInfrastructre as a Service

CaaSContainer/Cluster as a

Service

PaaSPlatform as a Service

SaaSSoftware as a Service

GoogleVocê

44

Page 45: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Nuvem

IaaSInfrastructre as a Service

On Premise PaaSPlatform as a Service

SaaSSoftware as a Service

• Aplicação • Dados • Runtime • Middleware • SO • Virtualização • Servidores • Storage • Redes

• Aplicação • Dados • Runtime • Middleware • SO • Virtualização • Servidores • Storage • Redes

• Aplicação • Dados • Runtime • Middleware • SO • Virtualização • Servidores • Storage • Redes

• Aplicação • Dados • Runtime • Middleware • SO • Virtualização • Servidores • Storage • Redes

Gerenciado por você

Gerenciado magicamente45

Page 46: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Google App Engine - Standard vs Flexible

46

Page 47: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

47

Page 48: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

48

Page 49: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

https://googlecloudplatform.github.io/google-cloud-node

49

Page 50: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

1. Instale o Cloud SDK (cli)

2. Configure o app.yaml

3. cloud app deploy

https://cloud.google.com/sdk/

runtime: nodejs env: flex

skip_files: - ^node_modules$

resources: cpu: .5 memory_gb: .6 disk_size_gb: 10

manual_scaling: instances: 1

#automatic_scaling: # min_num_instances: 1 # max_num_instances: 1 # cool_down_period_sec: 120 # cpu_utilization: # target_utilization: 0.8

50

Page 51: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier v0.1 - Fail

51

Page 52: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Really slow rest api

52

Page 53: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier v0.2

iOS e Android

Packt Publishing

Website

Storage Database

53

Page 54: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

We need a database

54

Page 55: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

NoSQL escolhido - Flexibilidade

55

Page 56: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Serviço de Livros - Salvandoconst Datastore = require('@google-cloud/datastore');

// Instantiates a client const datastore = Datastore({ projectId: config.projectId });

const kind = 'Book';

class BookService { /* Codigo omitido */ async save(book) { let slug = this.getSlug(book); book.slug = slug; const bookKey = datastore.key([kind, slug]);

let bookEntity = { key: bookKey, data: book };

return datastore.save(bookEntity); } }

56

Page 57: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Serviço de Livros - Consulta

// The kind for the new entity const kind = 'Book';

class BookService { /* Codigo omitido */

async all() { const query = datastore.createQuery(kind) .order('date', { descending: true }); let results = await datastore.runQuery(query); return results[0]; } }

57

Page 58: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

API de tarefa de busca e armazenamento de livros

module.exports = { method: 'GET', path: '/api/tasks/fetch-books', config: { handler: async (request, reply) => { const crawler = new PackPubCrawler(); let books = await crawler.fetchBooksFromPacktPub(); const service = new BooksService();

let slug = service.getSlug(books.currentBook); let exists = await service.exists(slug); if (!exists) { // Save new book await service.save(books.currentBook); //TODO: Notify clients that subscribed to this } reply({ books }); } } }

58

Page 59: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

API de Livros

const BooksService = require('../BooksService');

module.exports = { method: 'GET', path: '/api/books', config: { handler: async (request, reply) => { let service = new BooksService(); let books = await service.all(); reply({ books }); } } }

59

Page 60: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

API de Livros

60

Page 61: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Datastore console

61

Page 62: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier v0.2

iOS e Android

Packt Publishing

Website

62

Page 63: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Agendamento de tarefas

Como fazer em ambiente distribuido ?

63

Page 64: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Agendamento de tarefas

64

Page 65: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Agendamento de tarefas - Gambiarra

65

Page 66: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

1. Sintaxe do unix cron ou mais natural

2. Configure um cron.yaml

3. cloud app deploy cron.yaml

Google App Engine - cron.yaml

cron: - description: fetch book every 30 mins url: /api/tasks/fetch-books schedule: every 30 mins target: default

66

Page 67: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Google App Engine - cron.yaml

67

Page 68: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Google App Engine - Logs, monitoramento e trace

1. Pacote @google/cloud-trace

2. Just works

if (process.env.NODE_ENV === 'production') { require('@google/cloud-trace').start(); }

68

Page 69: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Google App Engine - Logs, monitoramento e trace

69

Page 70: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Google App Engine - Logs, monitoramento e trace

70

Page 71: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier v0.5

iOS e Android

Packt Publishing

Website

71

Page 72: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Push Notifications

72% Abrem o app quando

recebe uma notificação

72

Page 73: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Fluxo Push Notifications

Android iOS

Backend

GCM APNS

Device Token

73

Page 74: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

74

Page 75: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

75

Page 76: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

const admin = require("firebase-admin");

let credential = admin.credential.applicationDefault();

admin.initializeApp({ credential, databaseURL: "https://iot-bootcamp-158521.firebaseio.com" });

const messaging = admin.messaging();

const TOPIC_NAME = 'receive_book_notification';

class BookNotificationService {

async notifyAllClients(book) { var payload = { notification: { title: `${book.title} is free today!`, body: `Open the app to claim this book.` } }; return messaging.sendToTopic(TOPIC_NAME, payload); } }

Firebase Admin SDK

76

Page 77: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Client Side - React Native

import Firestack from 'react-native-firestack'; import FCM from 'react-native-fcm';

const TOPIC_NAME = 'receive_book_notification';

async subscribe() { let { wantsToReceiveNotifications } = this.state; if (!wantsToReceiveNotifications) { FCM.requestPermissions(); FCM.subscribeToTopic(TOPIC_NAME); firestack.analytics.logEventWithName('subscribe', {}); } else { FCM.unsubscribeFromTopic(TOPIC_NAME); firestack.analytics.logEventWithName('unsubscribe', {}); } this.setState({ wantsToReceiveNotifications: !wantsToReceiveNotifications }) }

77

Page 78: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Firebase Analytics e Push

78

Page 79: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

iOS e Android

PacktPub Notifier v0.8

Packt Publishing

Website

79

Page 80: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

80

Page 81: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Fluxo Alexa Custom Skill

Backend

Usuário

Alexa, Ask Packt Publishing Fan what’s the book of the day

The free book of the day is title Learning Raspberry Pi

Alexa SkillHTTPS

81

Page 82: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Api de integração com a Alexaconst BooksService = require('../BooksService');

module.exports = { method: 'POST', path: '/api/alexa', config: { handler: async (request, reply) => { let service = new BooksService(); let book = await service.getLastBook(); let message = `The free book of the day is titled ${book.title}`; reply({ "version": "1.0", "sessionAttributes": {}, "response": { "shouldEndSession": true, "outputSpeech": { "type": "SSML", "ssml": `<speak>${message}</speak>` }, } }); } } } 82

Page 83: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

PacktPub Notifier - Final

iOS e Android

Amazon Echo

Alexa Custom

Skill

Packt Publishing

Website

83

Page 84: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Futuro ?

84

Page 85: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

• Funções escritas em NodeJS • Escalabilidade automatica • Serverless • Podem ser chamadas por eventos

• Mudanças de arquivo, banco, http, etc.

85

Page 86: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Serverless

86

Page 87: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Duvidas ?

Alvaro Viebrantz aviebrantz.com.br @alvaroviebrantz medium.com/iot-bootcamp

https://github.com/alvarowolfx/packtpub-notifier-gcp

87

Page 88: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Links úteis

• https://cloud.google.com/sdk/

• https://developers.google.com

• https://cloud.google.com/products/

• https://firebase.google.com

• https://nodejs.org/en/

• https://developer.amazon.com

• https://facebook.github.io/react-native/

88

Page 89: Backend, app e internet das coisas com NodeJS no Google Cloud Platform

Referência

• https://pt.slideshare.net/FrancescoMarchitelli1/google-cloud-platform-47074110

• https://www.infoq.com/br/presentations/plataforma-digital-com-google-cloud-platform

• https://cloud.google.com/icons/

89