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.
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. |