我想在我的 Spring 应用程序中为固定线程池定义线程数。我应该在哪里做呢?我对 yaml 和 application.properties 文件感到困惑。
Spring 有多种设置属性的方法。如果合适的话,您可以使用其中一种以上的机制。这里要记住的最重要的事情是
PROPERTY_NAME
环境变量为 property.name
属性提供值,并且环境变量会覆盖 application.yml
文件。
一些选项:
src/main/resources/application.properties
文件被编译到您的 jar 文件和容器映像中。它对于提供事物的默认值或为使用属性配置的 Spring 层提供配置很有用。不过,请避免将特定于环境的设置(例如主机名)放在这里;您不想为每个新的部署环境重建应用程序。
Kubernetes
deployment.yaml
文件可以提供环境变量,这些也可以提供 Spring 属性值
env:
- name: PROPERTY_NAME # for @Value("property.name")
value: property value
如果您使用的是 Helm 部署工具,您也可以在此处使用其模板语言。这将使您在部署时实际提供一个值。
# templates/deployment.yaml
env:
- name: OTHERSERVICE_URL # @Value("other-service.url")
value: {{ .Values.otherServiceUrl }}
# values.yaml
# otherServiceUrl provides the location of the other service.
otherServiceUrl: http://other-service
# at the command line
helm install my-service ./ \
--set otherServiceUrl=http://other-service.other-namespace
您可以使用 Kubernetes ConfigMaps 和 Secrets 来提供单独的配置。引用 ConfigMap 或 Secret 值的语法有点冗长
env:
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: database
key: password
如果您已经在使用 Helm,我不会尝试将单独的配置值放入 ConfigMap,因为它非常冗长,并且比模板渲染方法没有任何实际好处。如果没有,并且您发现自己经常
kubectl edit
配置值,并且它们在多个容器之间共享,那么 ConfigMap 可能是合理的。将凭证存储在 Secrets 而不是 ConfigMap 中通常被认为是一种很好的做法,尽管 Secrets 在实践中并不是那么秘密。
最后,可以在 ConfigMap 中提供完整的 Spring 配置。这在值键包含任意映射的情况下很有用;一个例子是为您的指标系统设置标签。在这种情况下,环境变量映射可能不起作用。这种方法读起来可能更清晰;设置很多,但每个应用程序只需一次;在 Helm 上下文中,您也可以在此处使用模板;但它不能引用 Secret 值。
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: spring-properties # typically a little more boilerplate in a Helm chart
data:
applicaton.yml: |
management:
metrics:
tags:
namespace: {{ .Release.Namespace}} {{/*- Helm syntax */}}
# templates/deployment.yaml
volumes:
- name: app-properties
configMap:
name: spring-properties
containers:
- name: application
volumeMounts:
- name: app-properties
mountPath: /app/properties
env:
- name: SPRING_CONFIG_ADDITIONALLOCATION
value: file:///app/properties
您应该在
application.properties file
中定义固定线程池的线程数。这是 Spring 应用程序的默认配置文件,也是推荐存储配置设置的位置。您可以使用属性 spring.task.execution.pool.core-size
指定固定线程池的线程数。
例如,如果您想定义一个包含 10 个线程的固定线程池,您可以将以下内容添加到您的 application.properties 文件中:
spring.task.execution.pool.core-size=10
YAML 文件无法使用 @PropertySource 或 @TestPropertySource 注释。因此,如果您需要加载 这样,您需要使用属性文件。