Mostrando entradas con la etiqueta conectividad. Mostrar todas las entradas
Mostrando entradas con la etiqueta conectividad. Mostrar todas las entradas

miércoles, 8 de julio de 2026

MuleSoft para desarrolladores de APIs

MuleSoft es una plataforma de integración que te permite conectar aplicaciones, datos y APIs de manera centralizada.

Para un desarrollador Java con Spring Boot, sirve como un puente que complementa su backend con capacidades de gestión de APIs, orquestación de servicios y conectividad con sistemas externos.

MuleSoft en pocas palabras

  1. Plataforma de integración: MuleSoft (con su runtime Mule 4) permite crear flujos de integración entre sistemas heterogéneos (bases de datos, servicios REST/SOAP, colas de mensajería, SaaS).
  2. Anypoint Platform: Incluye herramientas como Anypoint Studio (IDE), API Designer (para diseño contract-first), y API Manager (para aplicar políticas de seguridad, rate limiting, etc.).
  3. SDK para Java: Puedes extender Mule creando conectores y módulos en Java usando Maven y el Mule SDK.

¿Para qué sirve en tu contexto Spring Boot?

Como desarrollador Java con experiencia en Spring Boot, MuleSoft nos aporta:

Diseño contract-first: Puedes definir tu API en RAML u OAS en Anypoint Designer y luego implementar la lógica en Spring Boot. Esto asegura consistencia entre diseño y código.

Gestión de APIs: MuleSoft API Manager permite aplicar políticas como:

  • Validación JWT con Keycloak.
  • Rate limiting para proteger tu backend.
  • Control de tráfico y seguridad centralizada.

Integración embebida: Existe un Spring Boot Starter para Mule 4, que te permite correr Mule Runtime dentro de tu aplicación Spring Boot. Esto facilita:

  • Monitoreo con Spring Boot Admin.
  • Exposición de servicios de despliegue Mule vía REST.
  • Control de tráfico y seguridad centralizada.

Comparativa: Spring Boot vs MuleSoft

Tabla comparativa entre Spring Boot y MuleSoft:

Aspecto Spring Boot MuleSoft
Foco principal Desarrollo rápido de microservicios y APIs Integración, gestión y orquestación de APIs
Diseño API Implementación directa con Spring MVC Contract-first con RAML/OAS + mockeo
Gestión de tráfico Necesitas librerías externas (Resilience4j, Spring Cloud Gateway) Políticas listas en API Manager
Extensibilidad Beans, filtros, interceptores Conectores y módulos vía Mule SDK
Despliegue Microservicios en contenedores Integraciones como aplicaciones Mule, embebibles en Spring Boot

Consideraciones y trade-offs

  • Licenciamiento: MuleSoft Enterprise puede ser costoso; evalúa si tu proyecto requiere gestión avanzada de APIs o si basta con Spring Cloud Gateway.
  • Curva de aprendizaje: Aunque conoces Java, MuleSoft introduce conceptos propios (flows, connectors, RAML).
  • Complementariedad: No reemplaza Spring Boot, sino que lo potencia en escenarios de integración compleja.

MuleSoft puede ser algo complejo para aprender. Existen mucha información, tutoriales y cursos en internet que podrían servirte para aprender a usarlo.

Enlaces:

https://www.mulesoft.com/
https://es.wikipedia.org/wiki/MuleSoft
https://www.seidor.com/es-mx/blog/salesforce-mulesoft-que-es
https://rootstack.com/es/blog/mulesoft-todo-lo-que-tienes-que-saber

sábado, 20 de febrero de 2016

JDBI como alternativa a JDBC


En el post anterior hablábamos de una librería que nos permite realizar operaciones con bases de datos de una manera más sencilla y similar a lo que se hace con JDBC.

JDBI promete, al menos en teoría, hacer que el manejo de información en bases de datos no sea tan complicada. Haremos un ejemplo práctico para ver si es tan fácil o no.

Supongamos que tenemos una base de datos llamada "test" y una tabla llamada "persona". Obtendremos la información contenida en la tabla persona creando los siguientes archivos (clases):
  • ModeloPersona.java  que servirá como "entidad" en nuestra aplicación.
  • ModeloPersonaMapper. java que servirá como "mapeador" de la entidad.
  • PersonaDAO.java donde definiremos las operaciones de consulta.
  • TestPersona.java que servirá como clase principal.

Nuestra tabla "persona" contiene los siguientes campos: id, nombre, apellidoP, apellidoM, edad,peso, talla. Por lo tanto, nuestra entidad ModeloPersona.java también debe cubrir esos campos.

ModeloPersona.java

package com.codemonekey.model;

public class  ModeloPersona implements java.io.Serializable{
 
private static final long serialVersionUID=1L;

private String id;
private String nombre;
private String apellidoP;
private String apellidoM;
private String edad;
private String peso;
private String talla;

public ModeloPersona(String id, String nombre,String apellidoP,String apellidoM,String edad,String peso,String talla){
    super();
    this.id=id;
    this.nombre=nombre;
    this.apellidoP=apellidoP;
    this.apellidoM=apellidoM;
    this.edad=edad;
    this.peso=peso;
    this.talla=talla;
}

//setters y getters
// Setters
public void setId(String id) {
    this.id = id;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public void setApellidoP(String apellidoP) {
    this.apellidoP = apellidoP;
}

public void setApellidoM(String apellidoM) {
    this.apellidoM = apellidoM;
}

public void setEdad(String edad) {
    this.edad = edad;
}

public void setPeso(String peso) {
    this.peso = peso;
}

public void setTalla(String talla) {
    this.talla = talla;
}

// Getters
public String getId() {
    return id;
}

public String getNombre() {
    return nombre;
}

public String getApellidoP() {
    return apellidoP;
}

public String getApellidoM() {
    return apellidoM;
}

public String getEdad() {
    return edad;
}

public String getPeso() {
    return peso;
}

public String getTalla() {
    return talla;
}


}

ModeloPersonaMapper.java

package com.codemonekey.datos;
 
public class ModeloPersonaMapper implements ResultSetMapper<ModeloPersona> {

    @Override
    public ModeloPersona map(int arg0, ResultSet r, StatementContext arg2) throws SQLException {
        ModeloPersona mpersona=new ModeloPersona();
        mpersona.setClave(r.getString("clave"));
        mpersona.setNombre(r.getString("nombre"));
        mpersona.setApellidoP(r.getString("apellidoP"));
        mpersona.setApellidoM(r.getString("apellidoM"));
        mpersona.setEdad(r.getString("edad"));
        mpersona.setPeso(r.getString("peso"));
        mpersona.setTalla(r.getString("talla"));
        return null;
    }

}

PersonaDAO.java
import org.codemonkey.model.ModeloPersona;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;

@RegisterMapper(ModeloPersonaMapper.class)
public interface PersonaDAO {
    @SqlQuery("SELECT test.persona.clave, test.persona.nombre, test.persona.apellidoP, test.persona.apellidoM, test.persona.edad, test.persona.peso, test.persona.talla FROM test.persona WHERE test.persona.clave = :id")
    ModeloPersona findById(@Bind("id") long id);
    @SqlQuery("SELECT test.persona.clave, test.persona.nombre, test.persona.apellidoP, test.persona.apellidoM, test.persona.edad, test.persona.peso, test.persona.talla FROM test.persona")
    List<ModeloPersona> verTodo();
    void close();
}

Finalmente la clase TestPersona.java

package org.codemonkey.test1;

import org.codemonkey.dao.PersonaDAO;
import org.codemonkey.model.ModeloPersona;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import static java.lang.System.out;

public class TestPersona {

    public static void main(String[] args) {
        DBI dbi = new DBI("jdbc:mysql://localhost:3306/test",
                "root",
                "5432");
        Handle h = dbi.open();
        if(!dbi.open().isInTransaction()){
            out.println("No esta realizando alguna transaccion");
        }
       
        PersonaDAO pers=null;
        try{
            pers=dbi.open(PersonaDAO.class);
            if(pers.verTodo().size() > 0){
                out.println("Lista de persona llena!!:"+pers.verTodo().size());
                out.println(""+pers.verTodo().toString());
                for(int i=0 ; i < pers.verTodo().size(); i++){
                    out.println("id:"+pers.verTodo().get(i).getClave());
                    out.println("nombre:"+pers.verTodo().get(i).getNombre());
                    out.println("apellido paterno:"+pers.verTodo().get(i).getApellidoP());
                    out.println("apellido materno:"+pers.verTodo().get(i).getApellidoM());
                    out.println("edad:"+pers.verTodo().get(i).getEdad());
                    out.println("peso:"+pers.verTodo().get(i).getPeso());
                    out.println("talla:"+pers.verTodo().get(i).getTalla());   
                   
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            pers.close();
        }
       
        h.close();
    }

}


Continuaremos en próximas entregas.

Enlaces:

https://jdbi.org/

Jai un lenguaje de programación inspirado en C++

Hoy hablaremos de un nuevo lenguaje de programación llamado Jai . Se trata de un lenguaje de programación que está desarrolland...

Etiquetas

Archivo del blog