legado com rest para modernizar seu criando uma ......legado rodrigo engenheiro de software na...
TRANSCRIPT
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: [email protected]: @otonielsilva
Rodrigo Silvaemail: [email protected]
Twitter: @rbsilvati