我们有许多用于多个任务的微服务,其中大多数都有一些常见的功能,如日志配置、指标配置和 kafka 配置等。 我们计划拥有一个具有通用功能的通用 JAR,并在所有微服务中使用。
当我们使用
application.yml
创建自定义 springboot jar 时,它具有这些通用配置和一些其他 @Component 和 @Service 类,并作为依赖项包含在微服务中,它不会从 JAR 内特定的 application.yml
读取任何属性。
自定义 springboot jar -
src/main/java -
@Configuration
public class KafkaConfiguration {}
@Service
public class CommonProcessor {}
src/main/资源-
application.yml
logging:
level:
org.apache: DEBUG
spring:
cloud:
stream:
kafka:
binder:
autoCreateTopics: false
brokers: localhost:9092
configuration:
sasl:
jaas:
config: org.apache.kafka.common.security.plain.PlainLoginModule required username="" password="";
在
KafkaConfiguration.java
中,我正在阅读上面的属性并创建kafka连接、kafka模板对象等,如果我在这个jar中编写示例消费者/生产者并作为springboot项目运行,一切都会正常。
Bu我想在我的微服务中使用这个jar作为依赖项,并利用kafka连接/kafka模板等,即当它无法从上面加载任何属性时
application.yml
并且无法创建bean。
微服务结构-
src/main/java
@Component
public class Consumer {
@Autowired
KafkaTemplate kafkaTemplate;
}
src/main/资源
application.yml
test:
property: test
example:
service:
url: https://localhost:8080/service
pom.xml
<dependency>
<groupId>com.test</groupId>
<artifactId>common-jar</artifactId>
<version>1.0</version>
我在这里缺少什么,因为我的 JAR 文件无法通过加载属性来创建在其中定义的 bean?这种拥有 2 个 application.yml 的方法不正确吗?在一个地方拥有共同属性的最佳方式是什么?
第一个问题
如果依赖项具有不同的包名称,则使用
@ComponentScan
如下所示从另一个包加载任何 bean。
@ComponentScan(basePackages = "com.test.dependency")
您还可以在主应用程序中以编程方式声明 beans。
第二个问题
有很多方法可以做到这一点。你可以
对于问题3:
IMO,依赖项必须允许覆盖主应用程序的属性。作为默认值,您可以保留依赖项中的值,但是否选择默认值必须由主应用程序决定。这种方法可以在许多其他 sdk 甚至 spring 模块本身中看到。