Você está na página 1de 63

Programação Web 2

Docente: Paulo Reis


Contato: paulo.r.santos@kroton.com.br
WhatsApp: (71) 9 8749-8129
Quem sou eu?
Paulo Reis, 38 anos. Desenvolvedor de Softwares há cerca
de 14 anos com foco em Web. Já trabalhei ao longo desses
anos com as tecnologias:

HTML, CSS, Sass, Javascript, Jquery, Vue, Angular, ASP,


ActionScript, SQL, PHP, Codeigniter, Laravel, Symfony,
Lumen, PHPUnit, Python, Flask, MongoDB, Redis, Java,
Spring, Junit, Cypress e NodeJS.

Pós-graduado em Desenvolvimento Orientado a Objetos com Java - Univ. Estácio de Sá


Bacharel em Sistemas de Informação - Unime
Tecnólogo em Gestão comercial - Unime
Apresentação da disciplina
O que aprenderemos?
- Java e Orientação a Objetos
- Desenvolvimento Web com Spring Boot
- Protocolo HTTP
- Criação e consumo de API Rest
- Teste de Softwares
- Banco de dados não relacional (MongoDB)
- Cache
- Comunicação Síncrona
- Comunicação Assíncrona
- etc…
Modelo TCP/IP Modelo OSI

Aplicação

Aplicação Apresentação

Sessão

Transporte Transporte

Internet Rede

Enlace
Acesso a rede
Física
Modelo TCP/IP Modelo OSI

Aplicação

Aplicação Apresentação

Sessão

Transporte Transporte

Internet Rede

Enlace
Acesso a rede
Física
Camada de Aplicação
Camada de Aplicação
Mas… como é que todas essas
aplicações se comunicam?
Protocolos de Rede
No que se refere às redes, um protocolo é um conjunto de regras para
formatação e processamento de dados. Os protocolos de rede são como uma
linguagem em comum para computadores. Os computadores dentro de uma
rede podem usar softwares e hardwares muito diferentes; entretanto, o uso de
protocolos permite que eles se comuniquem uns com os outros
independentemente dessas diferenças.
Protocolos de Rede
???
Água
Protocolos de Rede

Water
Protocolos de Rede
- HTTP (Hypertext Transfer Protocol)
- UDP (User Datagram Protocol)
- SMTP (Simple Mail Transfer Protocol)
- FTP(File Transfer Protocol)
- SSH (Secure Shell)
- DNS (Domain Name System)
- DHCP (Dynamic Host Configuration Protocol)
- etc…
Exemplo de uma simples Aplicação Web…

http://www.meusite.com.br/aplicacaoJava

IP

Browser DNS Server

Web Server
Exemplo de uma simples Aplicação Web…

Redis
Protocol

MySQL
Client/Server
Protocol

MongoDB
Wire
Protocol

AMQP
Conhecendo o
Nginx é um servidor web e proxy reverso de código aberto, conhecido por sua
alta performance, escalabilidade e baixo consumo de recursos. Ele foi criado por
Igor Sysoev em 2004 e atualmente é mantido pelo Nginx, Inc.

- Alta Performance;
- Proxy Reverso;
- Balanceamento de Carga;
- Cache;
- Redirecionamentos e Rewrite de URLs;
- Suporte a SSL/TLS
- etc…
Conhecendo o
Alta Performance

O Nginx foi projetado desde o início para ser altamente eficiente e escalável. Ele
usa uma arquitetura de eventos assíncronos e não bloqueantes que permite lidar
com um grande número de conexões simultâneas com baixo consumo de
recursos. Isso o torna uma ótima escolha para servir conteúdo estático e
responder a muitas requisições HTTP ao mesmo tempo.
Conhecendo o
Proxy Reverso

O Nginx atua como um servidor de front-end reverso, permitindo que ele


encaminhe as requisições recebidas para servidores de aplicativos ou outras
instâncias de servidor web em um ambiente de back-end. Isso é útil para
balancear a carga entre os servidores, executar roteamento avançado com base
em regras e melhorar a segurança, isolando a infraestrutura de back-end do
acesso direto da Internet.
Conhecendo o
Proxy Tradicional

Proxy Servidor de
Browser
Server Destino

Proxy Reverso

Servidor de
Browser
Destino
Conhecendo o
Balanceamento de Carga

O Nginx possui recursos embutidos para balanceamento de carga, que permite


distribuir as requisições entre vários servidores de aplicativos ou instâncias de
back-end. Essa funcionalidade ajuda a evitar sobrecarga em servidores
individuais e melhora a disponibilidade e a confiabilidade do sistema.
Conhecendo o
Como funciona um Load Balancer?
Conhecendo o
Cache

O Nginx suporta recursos de caching que podem armazenar em cache respostas


de requisições para reduzir o tempo de resposta e o tráfego de rede. O caching
é útil para acelerar o carregamento de páginas web e reduzir a carga em
servidores de aplicativos e bancos de dados.
Conhecendo o

Marta Lista João

Pedro Lista

Vanessa Lista
Cache
Conhecendo o

Marta Lista João

Pedro Lista Lista

Vanessa Lista
Cache
Conhecendo o
Redirecionamentos e Rewrite de URLs

O Nginx permite configurar facilmente redirecionamentos e rewrite de URLs. Isso


é útil para manter URLs amigáveis, realizar redirecionamentos permanentes ou
temporários, e fazer a manipulação de URLs para diferentes recursos.

- http://www.site.com.br?secao=institucional&page=contato
- http://www.site.com.br/contato
- http://www.site.com.br/artigos.php&cat=91824&id=123994
- http://www.site.com.br/artigos/conhecendo-o-nginx
Conhecendo o
Suporte a SSL/TLS

O Nginx oferece suporte nativo para SSL/TLS, permitindo a configuração de


comunicações seguras via HTTPS. Ele pode ser configurado para realizar o
offloading de SSL, liberando a carga de processamento de criptografia de
SSL/TLS das aplicações de back-end.
Conhecendo o
Conhecendo o
Requisição HTTPS

1. Cliente Hello
2. Server hello (Including Certificate)
3. Client certificate request Servidor de
Browser
Destino
4. Client certificate
5. Client send key info
6. Certificate verify
7. Finished message
Finished message
Modelo 1: Aplicação Full Stack Monolítica
Modelo 2: Aplicação SPA + API Monolítica
Modelo 3: Aplicação SPA + API Distribuída
Quais as vantagens do padrão monolítico?
- Facilidade de manutenção do ambiente de desenvolvimento

- Facilidade de configuração do ambiente de produção

- Facilidade de rastreabilidade da aplicação

- Baixo custo com infraestrutura (em um primeiro momento)

- Facilidade de implantação em times pouco experientes

- Facilidade de atualização de Frameworks e Bibliotecas

- Baixa latência de rede


Quais as desvantagens do padrão monolítico?
- Desenvolvedor fica preso a uma Stack

- Pouca flexibilidade para o Desenvolvedor

- Deploy mais complicado e demorado

- Probabilidade de erros de um componente afetar outros

- Escalabilidade vertical

- Dificuldade em trabalhar com balanceamento de carga

- Grande probabilidade de gerar código legado


Quais as vantagens do padrão microservices?
- Flexibilidade para adotar diferentes tecnologias

- Deploy mais rápido e simplificado

- Serviços desacoplados e agnósticos

- Escalabilidade horizontal

- Facilidade de Reuso

- Melhor utilização de recursos computacionais

- Facilidade de implantação de testes automatizados


Quais as desvantagens do padrão microservices?
- Alta complexidade de manutenção do ambiente de desenvolvimento

- Alta complexidade de configuração do ambiente de produção

- Dificuldade de rastreabilidade da aplicação

- Alto custo com infraestrutura

- Necessidade de profissionais mais experientes

- Dificuldade de manter atualizados Frameworks e Bibliotecas

- Alta latência de rede


Quiz: Monolito x Microservices
Em quais dos softwares abaixo você utilizaria o padrão monolítico?

A) Software de controle de estoques para a padaria do seu bairro

B) Portal do aluno da UNIME

C) iFood

D) Site da sua igreja


Anatomia de uma Requisição
Protocolo HTTP
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Meu primeiro Website!</title>
<link rel="stylesheet" href="assets/styles.css">
</head>
<body>

<h1>Meu primeiro Website!</h1>


<img src="imgs/logo.png">

<script src="assets/scripts.js"></script>

</body>
</html>
Protocolo HTTP
http://localhost:8080/alunos/?page=2&size=20
Verbos HTTP
GET: Utilizado quando precisamos obter um ou mais recursos
POST: Utilizado quando precisamos criar um novo recurso
PATCH: Utilizado quando precisamos atualizar parcialmente um recurso
PUT: Utilizado quando precisamos atualizar por completo um recurso
DELETE: Utilizado quando precisamos excluir um recurso
Status Code HTTP
1XX: Informational Response
2XX: Successful Response
3XX: Redirection Response
4XX: Cliente Error Response
5XX: Server Error Response
Desenvolvimento com Spring Boot
package br.edu.unime.pauloreis.myapi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyapiApplication {

public static void main(String[] args) {


SpringApplication.run(MyapiApplication.class, args);
}

}
Hello World com Spring Boot
package br.edu.unime.pauloreis.myapi.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

@GetMapping("/")
public String hello() {
return "Olá mundo!!!";
}

}
Exemplo de uso do Lombok
package br.edu.unime.pauloreis.myapi.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.time.LocalDate;

@Data
@AllArgsConstructor
public class Aluno {

private String nome;


private String sobrenome;
private LocalDate dataDeNascimento;

}
package br.edu.unime.pauloreis.myapi.controller;

import br.edu.unime.pauloreis.myapi.entity.Aluno;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
public class AlunoController {

@GetMapping("/")
public Aluno index() {
LocalDate localDate = LocalDate.of(1985, 2, 6);
return new Aluno("Michael", "Jackson", localDate);
}

}
Exemplo de gravação no MongoDB
# application.properties

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=api_example
spring.data.mongodb.auditing.enabled=true
package br.edu.unime.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.config.EnableMongoAuditing;

@SpringBootApplication
@EnableMongoAuditing
public class ApiApplication {

public static void main(String[] args) {


SpringApplication.run(ApiApplication.class, args);
}

}
package br.edu.unime.pauloreis.myapi.entity;

import ...

@Data
@AllArgsConstructor
public class Aluno {

private String nome;


private String sobrenome;
private LocalDate dataDeNascimento;

@CreatedDate
private LocalDateTime dataDeCriacao;

@LastModifiedDate
private LocalDateTime dataDeAtualizacao;

}
Recebendo dados do usuário
@PathVariable
@RequestParam
@RequestBody
@RequestHeader

Você também pode gostar