Example application.yml
This configuration shows how a real service can combine MongoDB, Kafka, GraphQL,
client configuration, security, logging, registry registration, and Redis-backed runtime pieces.
catalog-service / application.yml
server:
port: ${SERVER_PORT:8080}
servlet:
context-path: ${SERVER_CONTEXT_PATH:/catalog}
spring:
data:
mongodb:
uri: ${MONGO_URI:mongodb://localhost:27017/catalog}
uuid-representation: standard
kafka:
producer:
properties:
max.block.ms: 10000
delivery.timeout.ms: 10000
request.timeout.ms: 5000
springdoc:
api-docs:
path: /api-docs
swagger-ui:
path: /swagger-ui.html
logging:
level:
io.github.spring.middleware: ${LOG_LEVEL_PACKAGE:INFO}
io.github.spring.middleware.scheduler: ERROR
io.github.spring.middleware.jms: ERROR
org.springframework.security: ERROR
org.springframework.security.web: ERROR
root: ${LOG_LEVEL_ROOT:ERROR}
middleware:
log:
apiKey: ${LOG_API_KEY}
request:
enabled: ${LOG_REQUEST_ENABLED:true}
response:
enabled: ${LOG_RESPONSE_ENABLED:true}
responseTime:
enabled: ${LOG_RESPONSE_TIME_ENABLED:false}
exclude:
urlPatterns:
- /api-docs/**
- /swagger-ui.html
- /swagger-ui/**
- /_alive
- /graphql
- /graphql/_alive
- /graphql/schema-metadata
jms:
profile: ${JMS_PROFILE:LOCAL}
host: ${JMS_HOST:amqp://rabbitmq:5672}
user: ${JMS_USER:admin}
password: ${JMS_PASSWORD:admin}
max-pool-size: ${JMS_MAX_POOL_SIZE:10}
min-idle: ${JMS_MIN_IDLE:5}
max-idle: ${JMS_MAX_IDLE:10}
rabbitmq:
base-url: ${JMS_RABBITMQ_BASE_URL:http://rabbitmq:15672}
registry:
scanner:
enabled: ${JMS_RABBITMQ_REGISTRY_SCANNER_ENABLED:true}
check-interval: ${JMS_RABBITMQ_REGISTRY_SCANNER_CHECK_INTERVAL:10000}
kafka:
enabled: ${KAFKA_ENABLED:false}
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS}
create-missing-topics: true
topics:
catalog-events:
partitions: 5
replication-factor: 3
error-handling:
enabled: ${KAFKA_ERROR_HANDLING_ENABLED:true}
max-retries: ${KAFKA_ERROR_HANDLING_MAX_RETRIES:3}
retry-backoff-ms: ${KAFKA_ERROR_HANDLING_RETRY_BACKOFF_MS:1000}
dead-letter:
enabled: ${KAFKA_ERROR_HANDLING_DEAD_LETTER_ENABLED:true}
suffix: .DLT
publishers:
catalog:
topic: ${KAFKA_TOPIC_CATALOG:catalog-events}
subscribers:
catalog:
group-id: ${KAFKA_GROUP_ID_CATALOG:catalog-service-group}
topic: ${KAFKA_TOPIC_CATALOG:catalog-events}
concurrency: 3
client:
registry-endpoint: ${REGISTRY_ENDPOINT:http://localhost:8080/registry}
product:
security:
type: OAUTH2_CLIENT_CREDENTIALS
api-key: ${API_KEY_PRODUCT_SERVICE:default-product-api-key}
listProducts:
api-key: ${API_KEY_PRODUCT_SERVICE:default-product-list-api-key}
oauth2:
client-id: ${OAUTH2_CLIENT_ID_PRODUCT_SERVICE:product-service}
client-secret: ${OAUTH2_CLIENT_SECRET_PRODUCT_SERVICE}
token-uri: ${OAUTH2_TOKEN_URI_PRODUCT_SERVICE:http://keycloak:8080/realms/spring-middleware/protocol/openid-connect/token}
connection:
timeout: 500
max-retries: 0
circuit-breaker:
wait-duration-in-open-state-ms: 10000
resourceRegister:
clusterName: ${RESOURCE_CLUSTER_NAME:catalog}
public-server:
host: ${PUBLIC_SERVER_HOST:localhost}
port: ${PUBLIC_SERVER_PORT:8080}
graphql:
enabled: ${GRAPHQL_ENABLED:true}
clusterName: ${GRAPHQL_CATALOG_CLUSTER_NAME:catalog}
namespace: ${GRAPHQL_CATALOG_NAMESPACE:catalog}
registry-consistency-scheduler:
enabled: ${REGISTRY_CONSISTENCY_SCHEDULER_ENABLED:true}
cron: ${REGISTRY_CONSISTENCY_SCHEDULER_CRON:*/10 * * * * *}
security:
type: ${SECURITY_TYPE:OAUTH2}
public-paths:
- /graphql
- /resources/register
- /api-docs/**
- /swagger-ui.html
- /swagger-ui/**
- /start-publishing
- /stop-publishing
protected-paths:
- type: ROLES
path: /api/*/catalogs/*/products
methods: [ POST ]
allowed-roles: [ ADD_PRODUCTS_TO_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*/products
methods: [ GET ]
allowed-roles: [ LIST_CATALOG_PRODUCTS, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*/products
methods: [ DELETE ]
allowed-roles: [ REMOVE_PRODUCTS_FROM_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*/products
methods: [ PUT ]
allowed-roles: [ REPLACE_PRODUCTS_FROM_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*
methods: [ GET ]
query-params:
- name: expand
required: true
values:
- products
allowed-roles: [ LIST_CATALOG_PRODUCTS, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*
methods: [ GET ]
allowed-roles: [ GET_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*
methods: [ PATCH, PUT ]
allowed-roles: [ UPDATE_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs/*
methods: [ DELETE ]
allowed-roles: [ DELETE_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs
methods: [ POST ]
allowed-roles: [ CREATE_CATALOG, ADMIN ]
- type: ROLES
path: /api/*/catalogs
methods: [ GET ]
allowed-roles: [ LIST_CATALOGS, ADMIN ]
basic-auth:
credentials:
- username: ${BASIC_AUTH_CATALOG_ADMIN}
password: ${BASIC_AUTH_CATALOG_ADMIN_PASSWORD}
roles: [ ADMIN ]
jwt:
secret: ${JWT_SECRET:dfwzsdzwh823zebdwdz772632gdsbddfr4}
oauth2:
jwk-set-uri: ${OAUTH2_ISSUER_URI_JWK_SET_URI:http://keycloak:8080/realms/spring-middleware/protocol/openid-connect/certs}
authorities-claim-path: ${OAUTH2_ISSUER_URI_AUTHORITIES_CLAIM_PATH:$.resource_access.catalog-service.roles[*]}
api-key:
header-name: X-API-KEY
credentials:
- key: ${API_KEY_CATALOG_SERVICE:default-api-key}
enabled: true
roles: [ ADMIN ]
errors:
CATALOG_NOT_FOUND: 404
redisson:
address: ${REDIS_ADDRESS:redis://localhost:6379}
database: ${REDIS_DATABASE:0}