legado com REST para modernizar seu Criando uma ......legado Rodrigo Engenheiro de Software na CI&T....

Post on 22-Jun-2020

1 views 0 download

Transcript of legado com REST para modernizar seu Criando uma ......legado Rodrigo Engenheiro de Software na CI&T....

Evolução guiada por APIs Option #2Criando uma arquitetura híbrida com REST para modernizar seu legado

Rodrigo● Engenheiro de Software na CI&T.

● Atuou na criação da FIFA World

Cup 2014 Happiness Flag da Coca

Cola.

● Atua em vários sistemas da NSK.

Otoniel● Engenheiro de Software na CI&T.

● Participou da criação da FIFA World

Cup 2014 Happiness Flag.

● Certificado como Google Cloud

Developer em 2014.

● Com experiência em SOAP e REST,

atuou na NSK para conciliar as duas

tecnologias.

Como uma API REST pode ajudar na evolução de um

sistema legado?

O que é REST?

Estilo arquitetural

HTTP

Simples

Rápido

JSONAPI’s

Contextualizando...

O que são esses sistemas?

Aplicações Web

SOAP/JMS

ERP

Manufatura

B2B Etiquetagem

Financeiro

Portal de Vendas

Transportadoras

BIPlanejamento

Alguns númerosArquivos Linhas de Código

Java 17 mil 1,6 milhões

JSP 1 mil 173 mil

XML 117 36 mil

XSD 41 4 mil

Outros ... ...

Total 19 mil 1,9 milhões

Aplicação

Struts

Form Bean

ActionHTML

Struts e as dificuldades...

Exemplo: Salvar um form com listas

<html:form action="/save" ><logic:iterate id="user" name="usersForm"

property="users" indexId="usrId"><logic:iterate id="role" name="user" property="roles" indexId="rleId">

<bean:message key="label.role.name"/>

<input type="text"name="users[${usrId}].roles[${roleId}].name" value="${role.name}"/>

</logic:iterate></logic:iterate>

</html:form>

public class UsersForm extends ValidatorForm {

private String name;

private List<User> users = null;

public User getUsers(int index) {

if(this.users == null) { this.users = new ArrayList<User>();

}

while (this.users.size() <= index) { this.users.add(new User()); }

return (User) this.users.get(index);}

}

public class UsersAction {

protected ActionForward open (final ActionMapping mapping ,final ActionForm form, final HttpServletRequest request ,final HttpServletResponse response )

throws Exception {UsersForm formEditNaAsn = (UsersForm) form;

for (User user : usersForm.getUsers ()) {

//Faz algo com o userfor (Role role : user.getRoles()) {

//Faz algo com a role}

}

return mapping.getInputForward();}

}}

Por que não eliminar o Struts?

O que poderia resolver esses problemas?

Aplicação

Struts

Form Bean

Action

API REST

JSON

HTML

AngularJS

API RESTStruts

AJAX

JSON

HTML

Requisição

Aplicação

Struts

Form Bean

Action

API REST

JSON

HTML

AngularJS

Action

public class LoginAction {

protected ActionForward open(final ActionMapping mapping ,final ActionForm form, final HttpServletRequest request ,final HttpServletResponse response )

throws Exception {return mapping.getInputForward();

}}

}

Aplicação

Struts

Form Bean

Action

API REST

JSON

HTML

AngularJS

<%@ taglib uri="/tags-html" prefix="html"%><%@ taglib uri="/tags-logic" prefix="logic"%>

<div ng-controller="loginController" ><html:form action="loginAction">

<div ng-repeat="role in roles"><span ng-bind=”role.name”></span>

</div>

</html:form>

<script src="js/loginController.js" ></script>HTML

Aplicação

Struts

Form Bean

ActionHTML

API REST

JSONAngularJS

module.controller('loginController' , function($scope, $http) {

$http({

method: 'GET', url: '/rs/login/roles, }).success(function(roles) { $scope.roles = roles; });});AngularJS

Aplicação

Struts

Form Bean

Action

API REST

JSON

HTML

AngularJS

@Path("/login")public class LoginResource {

@POST@Produces(MediaType.APPLICATION_JSON)@Path("/login")public LoginResponse login (LoginRequest loginRequest) {

return authenticator.login(loginRequest);}

@GET@Produces(MediaType.APPLICATION_JSON)public Role list() {

return authenticator.roles();}

}

API REST

Minimizamos as dificuldades!

REST x SOAP

Exemplo de mensagem SOAP

<?xml version="1.0"?><soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:u="http://www.qconexample.com/user"> <u:User> <u:name>Otoniel</u:name> </u:User> </soap:Body>

</soap:Envelope>

GET /users/otoniel{ "id" : 1, "name" : "Otoniel", "roles" : [ { "name" : "admin" } ]}

POST /users/otoniel{ "name" : "Otoniel da Silva", "roles" : [ { "name" : "admin" } ]}

PUT /users/otoniel{ "id" : 1, "name" : "Otoniel da Silva", "roles" : [ { "name" : "admin" } ]}

DELETE /users/otoniel{ "id" : 1}

BackendSPA

Novas possibilidades!

HTML JSONAPI RESTful

REST também nos levou a criar uma API de registro

de eventos! :)

HTTP RequestPOST /events/create

{

"uid" : "dd8947f3-bc47-4a54-8bae-99758a710a23",

"userId" : "OTONIEL",

"dateTime" : "1335205592410",

"eventName" : "send_xml_to_ftp",

"message" : "<xml>...</xml>",

}

Logs da Aplicação

...

2015-03-18 17:21:20,222

[dd8947f3-bc47-4a54-8bae-99758a710a23]

INFO [SendXmlToFtpService: 72]: Sending file: new.xml

Manufatura

B2B

Portal de Vendas

Mobile

Browser

Log de Eventos

Então vale a pena usar uma API REST?

● Facilitar o uso de frameworks MVC JavaScript.

● Mais fácil de expor serviços.● Produtivo e melhora a qualidade de

código.● Novidade tecnológica para os

desenvolvedores. :)

Benefícios

● Múltiplas tecnologias convivendo.● Sistema muito grande e com alto valor

para o cliente.● Possibilidade de alguma falha na

modernização e impactar a entrega de novas funcionalidades.

Riscos

Sim, vale a pena! ;)

Perguntas?

Obrigado!

Otoniel da Silvaemail: otoniel@ciandt.comTwitter: @otonielsilva

Rodrigo Silvaemail: rodrigos@ciandt.com

Twitter: @rbsilvati