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 message log ging

  • CSM Reachability - Utilizado por VoP para la deconstrucción de 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 message log ging

  • CSM Reachability - Utilizado por VoP para la deconstrucción de 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 Solicitud de Verificación de Beneficiario (VoP) es una aplicación independiente que puede ejecutarse como un servicio, al igual que cualquier otro. IPF application despliegue. El servicio de Solicitud de VoP puede ejecutarse como una única instancia o múltiples.

Configuración

La configuración a continuación es la mínima requerida para que el servicio VoP Requester funcione utilizando FPAD como el RVM seleccionado,Kafka para message log ging y MongoDB para la concesión de licencias.

El solicitante de VoP 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"}
      ]
    }
  ]
}

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

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 el Kafka URL según corresponda a su entorno

Ejecutando

Docker Componer

El siguiente docker compose es un servicio de implementación de VoP Requester que contiene toda la infraestructura/aplicaciones requeridas (Kafka,MongoDB, Alcance) necesario para ejecutar la aplicación VoP Requester. Esta implementación de muestra se está ejecutando con Kafka para message log ging 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:

  • MongoDB y Kafka los contenedores son imágenes de terceros y no son proporcionadas por Icon Solutions

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

  • La aplicación VoP Requester es creada por Icon Solutions y se aloja en nuestro ipf-lanzamientos repositorio en Nexus.

Kubernetes

El siguiente Kubernetes La configuración es un despliegue del servicio VoP Requester que contiene los ajustes recomendados para desplegar una aplicación VoP Requester. Este despliegue de muestra se está ejecutando con Kafka para message log ging.

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"}
          ]
        }
      ]
    }  
  
    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 Solutions.

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

  • La aplicación VoP Requester es creada por Icon Solutions y se aloja 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 apoyar 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

El solicitante de VoP requiere una conexión a la base de datos durante el inicio de la aplicación, independientemente de la configuración.message log tipo de ging, 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.state. 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 es seleccionado como el message log tipo de ging, 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 prevenir message log Deteniendo las solicitudes de VoP para que no sean procesadas.

Si message log ging se considera crítico 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 que el Solicitante de VoP haya comenzado, entonces el servicio del Solicitante de VoP se volverá inaccesible.