La serialización de Java es el caballo de batalla de la JVM, donde los fallos de seguridad no parecen llegar a su fin. Además, con las arquitecturas de microservicios en la nube, el intercambio de información entre múltiples plataformas de forma rápida y segura se ha vuelto mas indispensable que nunca. JSON se ha impuesto como el intercambio de datos en la WEB, pero tiene sus limitaciones: transformar a objetos de json puede resultar lento por su naturaleza basada en texto.
Protocol Buffers, Protobuf, es un mecanismo para serializar datos de forma binaria entre múltiples plataformas. Protobuf es estructurado, compacto, rápido y simple.
¿Cómo utilizar Protobuf en tus aplicaciones distribuídas y servicios? ¿Merece la pena?
En esta charla, través de ejemplos sencillos con proyectos que utilizan Protobuf, espero que descubras esto y mucho más.
2. @karesti
Objetivo y reto de la próxima hora
Compartir el interés de utilizar Protocol Buffers en Java.
Mostrar ejemplos de proyectos que lo utilizan.
5. @karesti
Serialization in Java - Desde 1997
public class PersonalShopper implements Serializable
{
private String id;
private String name;
private City city;
...
- ObjectInputStream
- ObjectOutputStream
6. @karesti
“The gift that keeps on giving”
"Ask The Architect" session from the
Devoxx UK 2018 conference,
Oracle's chief architect, Mark
Reinhold, shared his thoughts
about Java’s serialization
mechanism which he called a
“horrible mistake” and a
virtually endless source of security
vulnerabilities.
https://www.infoq.com/articles/java-serialization-aug18/
8. @karesti
JSON
✅ HTTP/JSON es el estandard en la web, REST API standard
✅ Formato que podemos leer los seres humanos
✅ Javascript Nativo
❗Marshalling lento para formatos numéricos (problemas de latencia)
❗No es tan eficiente en la red (compresión de datos ayuda)
❗Sistema de tipos pobre
❗Java <-> Json Jackson, Gson
10. @karesti
Protocol buffers - Protobuf
● Google (utilizado masivamente en interno)
● Formato Binario
● Open Source desde 2008
● Interoperabilidad entre muchos lenguajes languages: C++, C#, Java, Dart,
Python,Go
● Estructurado tipo XML, más ligero, compacto y rápido
● Mejor rendimiento que JSON
https://github.com/protocolbuffers/protobuf
11. @karesti
Paso 1: Define tu *.proto esquema
syntax = "proto2";
package mycompany;
message PersonalShopper {
optional string id = 1;
optional string name = 2;
optional string city = 3;
}
12. @karesti
Paso 2: Compila y genera el código
People.PersonalShopper shopper1 =
People.PersonalShopper.newBuilder()
.setId(UUID.randomUUID().toString())
.setCity("BILBAO")
.setName("Oihana").build();
…
shopper1.writeTo(output);
19. @karesti
Caso 2: Infinispan (Datagrid )
● 100% Open-source, In-memory Distributed Data
Store*
○ ~ Redis, Apache Ignite, Hazelcast
● Cachés distribuidas con múltiples casos de uso
● Diseñado para soportar 50.000 peticiones en
paralelo
● High Availability/High Scalability
24. @karesti
To go further
● Protobuf
https://developers.google.com/protocol-buffers
● gRPC
https://grpc.io/
● Infinispan Getting Started
https://infinispan.org/get-started/
● Demo with Spring-Boot
https://github.com/karesti/protobuf-marshalling-guide
25. @karesti
Conclusiones
Que la serialización de Java descanse en paz pronto.
Protobuf es una muy buena opción que merece la pena
utilizar en vuestros sistemas distribuidos.