Introducción

Descripción general

Dependiendo de su message log configuración para usar Kafka o Base de datos, el despliegue podría ser ligeramente diferente.

Kafka Message Log ging

overview-kafka
  • Base de datos - Utilizado por VoP para la concesión de licencias

  • Kafka - Utilizado por VoP para el registro de mensajes

  • CSM Reachability - Utilizado por VoP para la deconstrucción del IBAN si el BIC del agente de la parte no está presente en el mensaje de solicitud

Base de datos Message Log ging

overview-database
  • Base de datos - Utilizado por VoP para la concesión de licencias y el registro de mensajes

  • CSM Reachability - Utilizado por VoP para la deconstrucción del IBAN si el BIC del agente de la parte no está presente en el mensaje de solicitud

Configuración y Tiempo de Ejecución

La Verificación del Beneficiario (VoP) El solicitante es una aplicación independiente que puede ejecutarse como un servicio, al igual que cualquier otro. IPF application despliegue. El VoP El servicio de solicitante puede ejecutarse como una única instancia o múltiples.

Configuración

La configuración a continuación es la mínima requerida para el VoP Servicio de solicitante para ejecutarse utilizando FPAD como el RVM seleccionado,Kafka para el registro de mensajes y MongoDB para la concesión de licencias.

VoPEl solicitante no requiere un Akka Cluster a ser configurado.
ipf {
  mongodb.url = "mongodb://ipf-mongo:27017/vop" (1)
}

ipf.csm-reachability-api.http.client {
  host = "http://reachability-app"  (2)
  port = 8080
}

ipf.verification-of-payee.requester {
  responder.fpad.epcvop.http.client {
    host = "http://fpad-app"  (3)
    port = 8080
  }
  scheme-processing-entities = [ (4)
    {
      scheme: EPC
      processing-entities = [
        {processing-entity-code: "default", scheme-membership-id: "ICONUK02XXX"}
      ]
    }
  ]
  country-filtering.enabled = true (5)
  scheme-allowed-countries = [
    {
      scheme: EPC, (5)
      regulatory-date-timezone: "Europe/Belgrade" (5)
      allowed-countries: [
        {country-code: "de", regulatory-date: "2025-09-17"}, (5)
        {country-code: "FR", regulatory-date: "2025-07-15"},
        {country-code: "Gb"}
      ]
    }
  ]
}

common-kafka-client-settings {
  bootstrap.servers = "kafka:9092"  (6)
}

akka {
  kafka {
    producer {
      kafka-clients = ${common-kafka-client-settings}
    }
    consumer {
      kafka-clients = ${common-kafka-client-settings}
      kafka-clients.group.id = vop-requester-consumer-group
    }
  }
}

Tenga en cuenta los siguientes aspectos clave:

1 Establezca el MongoDB URL según corresponda a su entorno
2 Establezca el CSM Reachability nombre de host y puerto según corresponda a su entorno
3 Establezca el nombre de host FPAD_EPCVOP y el puerto según sea apropiado para su entorno.
4 Establezca los identificadores de membresía del esquema aplicables para cada esquema. Esto debe especificarse para el esquema habilitado (que por defecto es EPC), ver Membresía del Esquema
5 Establezca la configuración de filtrado por país y defina qué códigos de país están permitidos para qué esquema con fecha y hora regulatoria opcional, consulte Filtrado por País
6 Establezca el Kafka URL según corresponda a su entorno

Ejecutando

Docker Componer

El siguiente docker compose es un VoP Despliegue del servicio del solicitante que contiene toda la infraestructura/aplicaciones requeridas (Kafka,MongoDB, Alcanzabilidad) necesaria para ejecutar el VoP Aplicación del solicitante. Esta implementación de muestra se está ejecutando con Kafka para el registro de mensajes y MongoDB para la concesión de licencias.

Esto representa una configuración de muestra y no está destinado a representar preocupaciones de rendimiento o resiliencia, las cuales se abordarán en otra sección en futuras versiones.
Docker Compose
services:

  # Infrastructure
  ipf-mongo:
    image: ${docker.registry}/ipf-docker-mongodb:latest
    container_name: ipf-mongo
    ports:
      - "27018:27017"
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/test --quiet

  kafka:
    image: apache/kafka-native:4.0.0
    container_name: kafka
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      - KAFKA_NODE_ID=1
      - KAFKA_AUTO_CREATE_TOPICS_ENABLE=true
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9094
      - KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_PROCESS_ROLES=broker,controller
      - KAFKA_LOG_RETENTION_MINUTES=10
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
      - KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS=1
      - KAFKA_LISTENERS=PLAINTEXT://:9092,LOCAL://:9093,CONTROLLER://:9094
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LOCAL:PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,LOCAL://localhost:9093
      - KAFKA_CREATE_TOPICS=MESSAGE_LOG:1:1

  # Apps
  reachability-app:
    image: registry.ipf.iconsolutions.com/csm-reachability-application:${icon-csm-reachability-app.version}
    container_name: reachability-app
    ports:
      - "8083:8080"
      - "5003:5005"
    user: "1000:1000"
    environment:
      - IPF_JAVA_ARGS=-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false
    volumes:
      - ${docker-logs-directory}:/ipf/logs
      - ./config/reachability-app:/csm-reachability-application/conf
      - ./import:/csm-reachability-application/import
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ]
    depends_on:
      - ipf-mongo

  vop-requester-app:
    image: ${docker.registry}/verification-of-payee-requester-application:${project.version}
    container_name: vop-requester-app
    ports:
      - "8080:8080"
      - "5005:5005"
    volumes:
      - ${docker-logs-directory}:/ipf/logs
      - ./config/vop-requester-app:/verification-of-payee-requester-application/conf
    user: "1000:1000"
    environment:
      - IPF_JAVA_ARGS=-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false -Dconfig.override_with_env_vars=true
    depends_on:
      - ipf-mongo
    healthcheck:
      test: [ "CMD", "curl", "http://localhost:8080/actuator/health" ]

Tenga en cuenta los siguientes aspectos clave:

  • MongoDBy Kafka los contenedores son imágenes de terceros y no son suministradas por Icon Soluciones

  • El CSM Reachability la imagen es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

  • El VoP La aplicación del solicitante es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

Kubernetes

El siguiente Kubernetes la configuración es un VoP Solicitud de implementación del servicio de solicitante que contiene la configuración recomendada para implementar un VoP Aplicación del solicitante. Esta implementación de muestra se está ejecutando con Kafka para el registro de mensajes.

Esto representa una configuración de muestra y no está destinado a representar preocupaciones de rendimiento que se tratarán en otra sección en futuras versiones.
Configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: requester-config
  labels:
    app: verification-of-payee-requester
    product: ipfv2
data:
  application.conf: |
    ipf.mongodb.url = "mongodb://mongo:27017/vop"
    
    ipf.verification-of-payee.requester {
      scheme-processing-entities = [
        {
          scheme: EPC
          processing-entities = [
            {processing-entity-code: "default", scheme-membership-id: "ICONGB01"}
          ]
        }
      ]
      country-filtering.enabled = true
      scheme-allowed-countries = [
        {
          scheme: EPC,
          regulatory-date-timezone: "Europe/Belgrade"
          allowed-countries: [
            {country-code: "de", regulatory-date: "2025-09-17"},
            {country-code: "FR", regulatory-date: "2025-07-15"},
            {country-code: "Gb"}
          ]
        }
      ]
    }  
  
    ipf.csm-reachability-api.http.client {
      host = reachability-app
      port = 8080
    }
    
    common-kafka-client-settings {
      bootstrap.servers = "kafka:9092"
    }
    akka {
      kafka {
        producer {
          kafka-clients = ${common-kafka-client-settings}
        }
        consumer {
          kafka-clients = ${common-kafka-client-settings}
          kafka-clients.group.id = vop-responder-consumer-group
        }
      }
    }
Despliegue
apiVersion: apps/v1
kind: Deployment
metadata:
  name: verification-of-payee-requester
  labels:
    app: verification-of-payee-requester
    product: ipfv2
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  selector:
    matchLabels:
      app: verification-of-payee-requester
      product: ipfv2
  template:
    metadata:
      labels:
        app: verification-of-payee-requester
        product: ipfv2
    spec:
      terminationGracePeriodSeconds: 10
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - verification-of-payee-requester
                topologyKey: "kubernetes.io/hostname"

      containers:
        - name: verification-of-payee-requester-application
          image: registry.ipf.iconsolutions.com/verification-of-payee-requester-application:latest
          volumeMounts:
            - name: application-config
              mountPath: /verification-of-payee-requester-application/conf/application.conf
              subPath: application.conf
          env:
            - name: "IPF_JAVA_ARGS"
              value: "-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false"
          ports:
            - containerPort: 8080
              name: actuator
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: actuator
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 5
            timeoutSeconds: 1
            failureThreshold: 3
            successThreshold: 1
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: actuator
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 5
            timeoutSeconds: 1
            failureThreshold: 3
            successThreshold: 1
          startupProbe:
            httpGet:
              path: /actuator/health
              port: actuator
              scheme: HTTP
            failureThreshold: 30
            periodSeconds: 10

      imagePullSecrets:
        - name: registry-credentials
      volumes:
        - name: application-config
          configMap:
            name: requester-config
Servicio
apiVersion: v1
kind: Service
metadata:
  name: verification-of-payee-requester-application
spec:
  selector:
    app: verification-of-payee-requester-application
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: actuator

Tenga en cuenta los siguientes aspectos clave:

  • Servicios de infraestructura como Kafka no se han proporcionado en la configuración anterior y no son suministrados por Icon Soluciones.

  • El CSM Reachability la imagen es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

  • El VoP La aplicación del solicitante es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

  • El número de réplicas se ha establecido en 3 por razones de balanceo de carga.

  • Las sondas de Liveness, Readiness y Startup han sido configuradas para soportar la estabilidad de nodos y pods, pero estas pueden ser modificadas si es necesario.

  • La anti-afinidad de pods ha sido configurada para distribuir los pods a través de múltiples nodos para prevenir un único punto de falla.

Errores de Inicio

VoPEl solicitante requiere una conexión a la base de datos durante el inicio de la aplicación, independientemente del tipo de registro de mensajes configurado, debido a Licenciamiento de IPF. Si la aplicación no puede conectarse a la base de datos durante el inicio, se marcará como no saludable. Seguirá intentando reconectarse, y una vez que se establezca una conexión con éxito, la aplicación pasará a un estado saludable. Todos los fallos de conexión y los intentos de reintento se registrarán en el registro de la aplicación en el WARN nivel.

Cuando kafka se selecciona como el tipo de registro de mensajes, la aplicación también intentará conectarse a Kafka al iniciar. Sin embargo, la falta de conexión a Kafka se registrará pero no afectará el estado de salud de la aplicación por defecto. Esto es para evitar que el registro de mensajes se detenga. VoP solicitudes en proceso.

Si se considera crítico el registro de mensajes y Kafka los problemas de conectividad deberían afectar la salud y la funcionalidad principal de la aplicación, puede habilitar este comportamiento configurando:

message.logger.send-connector.resiliency-settings.enabled = true

Si la base de datos se vuelve inaccesible después de la VoP El solicitante ha comenzado, luego el VoP El servicio de solicitante se volverá indisponible.