Java中yml相关配置内容

文章详细列出了Java应用中关于数据库连接(包括DruidDataSource和P6spy监控)、MybatisPlus配置以及Feign客户端的日志级别设定。此外,还展示了如何配置网关路由规则和使用Nacos进行服务发现。

Java中yml相关配置内容(配置中的功能不需要直接删掉)

数据库相关

# DataSource Config
spring:
  main:
    banner-mode: off # 关闭SpringBoot启动图标(banner)	
  datasource:
    username: root #数据库用户名
    password: 123456 #数据库密码
    type: com.alibaba.druid.pool.DruidDataSource #数据库连接池类型
    driver-class-name: com.mysql.cj.jdbc.Driver #数据库连接驱动
    url: jdbc:mysql:///mybatis_plus?userUnicode=true&characterEncoding=utf-8 #数据库连接路径

MybatisPlus相关

#MyBatisPlus config
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启mp日志(输出到控制台)
  global-config:
  	banner: off # 关闭mybatisplus启动图标
    db-config:
      id-type: assign_id #id生成策略
      table-prefix: tbl_ #表前缀
      logic-delete-field: deleted # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

P6spy相关

P6spy的application.yml配置

#P6spy Config
spring:
  datasource:
    username: root #数据库用户名
    password: 123456 #数据库密码
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver #数据库连接驱动
    url: jdbc:p6spy:mysql:///mybatis_plus?userUnicode=true&characterEncoding=utf-8 #数据库连接路径

P6spy的spy.properties配置

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

Feign的application.yml的配置

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

gateway相关配置

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
<think> 我们已经在之前的回答中解释了如何通过消费者优先级实现优先从第一台服务接收消息。 但是,用户现在的问题是:是否可以在yml文件中配置RabbitMQ两台服务连接并优先从第一台接收消息。 分析: 1. RabbitMQ的yml配置通常用于设置连接参数(如host, port, username, password)和通用消费者参数(如prefetch, acknowledge-mode等)。 2. 消费者优先级(x-priority)是在消费者订阅队列时设置的,属于消费者端的参数。在Spring Boot中,我们通过创建不同的`SimpleRabbitListenerContainerFactory`并设置其`consumerArguments`来为不同的消费者容器设置优先级。 3. 在yml文件中,我们无法直接为两个不同的消费者容器(分别对应两台服务)配置不同的优先级。因为yml是全局配置,而我们需要为两个消费者实例配置不同的优先级(一个高,一个低)。 结论: 在yml文件中无法直接配置两个RabbitMQ服务连接(分别对应两个消费者容器)并设置优先级。但是,我们可以通过以下方式实现: 方案: 1. 在yml配置RabbitMQ连接信息(可以配置多个连接,但通常一个应用只需要连接一个RabbitMQ集群,然后通过多个消费者容器实例来实现不同的优先级)。 2. 在Java配置类中,定义两个`SimpleRabbitListenerContainerFactory`,并分别设置不同的`consumerArguments`(即优先级)。 3. 在两个消费者方法上,通过`@RabbitListener`的`containerFactory`属性指定使用不同的容器工厂。 因此,虽然yml不能直接配置优先级,但我们可以通过Java配置结合yml中的基础连接信息来实现。 具体步骤(结合ymlJava配置): 步骤1:在yml配置RabbitMQ连接信息(两台服务使用同一个RabbitMQ,所以连接信息相同) 例如: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest ``` 步骤2:创建两个容器工厂,分别设置高优先级和低优先级 ```java @Configuration public class RabbitMQPriorityConfig { @Bean public ConnectionFactory connectionFactory() { // Spring Boot已经自动配置了ConnectionFactory,这里我们可以直接使用自动配置的 // 但为了创建两个容器工厂,我们需要使用同一个连接工厂 // 所以不需要额外创建,直接注入即可 return null; } // 高优先级容器工厂 @Bean(name = "highPriorityContainerFactory") public SimpleRabbitListenerContainerFactory highPriorityContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); // 设置消费者参数,包括优先级 factory.setConsumerArguments(Collections.singletonMap("x-priority", 10)); return factory; } // 低优先级容器工厂 @Bean(name = "lowPriorityContainerFactory") public SimpleRabbitListenerContainerFactory lowPriorityContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setConsumerArguments(Collections.singletonMap("x-priority", 1)); return factory; } } ``` 步骤3:在两个消费者类中,分别使用不同的容器工厂 ```java @Component public class HighPriorityConsumer { @RabbitListener(queues = "priority.queue", containerFactory = "highPriorityContainerFactory") public void receive(String message) { // 处理消息 } } @Component public class LowPriorityConsumer { @RabbitListener(queues = "priority.queue", containerFactory = "lowPriorityContainerFactory") public void receive(String message) { // 处理消息 } } ``` 注意:这里两个消费者可以部署在同一台服务器(同一个应用)上,也可以部署在不同的服务器(两个应用)上。但是,如果部署在两个不同的应用上,那么每个应用都需要配置自己的容器工厂(在各自的应用中配置),并且设置不同的优先级。 如果用户希望两个服务分别部署在两个不同的Java项目中(即两个独立的应用): - 应用A(高优先级):在其配置中创建高优先级容器工厂,并在消费者中使用。 - 应用B(低优先级):在其配置中创建低优先级容器工厂,并在消费者中使用。 这样,当两个应用都连接到同一个RabbitMQ的同一个队列时,RabbitMQ会优先将消息分发给高优先级的消费者(应用A)。 因此,虽然yml文件不能直接设置消费者优先级,但我们可以通过Java配置来设置,而yml文件只提供基础的连接信息。 总结回答用户问题: 在yml文件中无法直接配置两个服务连接(即两个消费者容器)并设置优先级。但是,可以在yml配置RabbitMQ的连接信息(如host, port等),然后在Java代码中通过定义两个不同的消费者容器工厂(分别设置高优先级和低优先级)来实现优先从第一台服务(高优先级)接收消息。 相关问题: 用户可能还会问如何在同一应用中配置多个容器工厂,或者如何在不同的应用中分别设置优先级。 生成相关问题: 1. 如何在Spring Boot中为同一个RabbitMQ队列配置多个不同优先级的消费者? 2. 如果两个消费者分别部署在不同的Java项目中,如何设置各自的优先级? 3. RabbitMQ消费者优先级设置不生效可能的原因有哪些? </think> ### Java项目中RabbitMQ多服务连接与优先消息接收的配置方案 在Java项目中,**无法直接在yml文件中配置RabbitMQ两台服务的连接优先级**,但可以通过yml配置结合代码实现需求。以下是详细解决方案: #### 核心限制与解决方案 1. **yml配置的限制**: - yml文件只能配置RabbitMQ连接参数(如host、port等)[^1][^2][^3] - 无法在yml中直接指定服务优先级或消息路由策略 - RabbitMQ的消费者优先级需要通过编程方式设置 2. **实现方案**: ```mermaid graph LR A[yml配置公共连接] --> B[定义高优先级消费者容器] A --> C[定义低优先级消费者容器] B --> D[服务A:x-priority=10] C --> E[服务B:x-priority=1] ``` #### 具体实现步骤 ##### 步骤1:yml配置公共连接(两台服务共用) ```yaml spring: rabbitmq: host: rabbitmq-server1 # 主服务地址 port: 5672 username: guest password: guest # 可选:添加第二台服务作为备份 addresses: rabbitmq-server1:5672,rabbitmq-server2:5672 ``` - `addresses`参数可配置多台服务器实现自动故障转移[^2] - 所有服务实例使用相同的队列名称(如`priority.queue`) ##### 步骤2:Java代码配置消费者优先级 ```java @Configuration public class RabbitPriorityConfig { // 高优先级消费者容器 (服务A) @Bean public SimpleRabbitListenerContainerFactory highPriorityFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setConsumerArguments(Map.of("x-priority", 10)); // 设置最高优先级 return factory; } // 低优先级消费者容器 (服务B) @Bean public SimpleRabbitListenerContainerFactory lowPriorityFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setConsumerArguments(Map.of("x-priority", 1)); // 设置最低优先级 return factory; } } ``` ##### 步骤3:消费者实现 ```java // 服务A(高优先级) @Component public class HighPriorityConsumer { @RabbitListener( queues = "priority.queue", containerFactory = "highPriorityFactory" // 指定高优先级容器 ) public void handleMessage(String message) { System.out.println("服务A接收: " + message); } } // 服务B(低优先级) @Component public class LowPriorityConsumer { @RabbitListener( queues = "priority.queue", containerFactory = "lowPriorityFactory" // 指定低优先级容器 ) public void handleMessage(String message) { System.out.println("服务B接收: " + message); } } ``` #### 工作原理 1. RabbitMQ通过`x-priority`参数识别消费者优先级[^4] 2. 消息分配逻辑: - 当服务A在线时,100%消息由服务A处理 - 服务A不可用时,自动切换到服务B - 服务A恢复后,自动重新接管消息处理 3. 优先级范围:`0-255`(数值越大优先级越高) #### 验证配置 发送测试消息后观察日志输出: ``` // 正常情况 服务A接收: Test Message 1 服务A接收: Test Message 2 // 停止服务A后 服务B接收: Test Message 3 ``` #### 注意事项 1. **队列声明**:确保所有服务使用相同队列参数 ```java @Bean public Queue priorityQueue() { return new Queue("priority.queue", true, false, false, Map.of("x-max-priority", 10)); } ``` 2. **部署要求**: - 服务A和服务B需部署不同实例 - 相同服务集群需保证优先级配置一致 3. **故障转移**:`addresses`参数已实现连接级容错,但消费者优先级是应用层逻辑
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值