【智能排班系统】聚合服务开发

本文介绍了在微服务项目中如何创建聚合服务以减少内存消耗,包括添加依赖、处理FeignClient冲突、整合配置文件和路由配置的修改。通过解决Bean冲突问题,优化远程调用配置,实现资源的有效利用和系统性能提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🎯 导读:本文档详细介绍了在一个微服务架构下,如何通过创建聚合服务来整合多个独立的服务,以此来优化资源利用并减少服务器内存占用。文档中包含了聚合服务的构建步骤,包括添加必要的Maven依赖、配置Spring Boot应用、以及整合Quartz定时任务的相关配置。此外,文档还说明了如何调整网关服务的路由配置,并解决了在聚合过程中出现的Bean冲突问题,提供了具体的解决方案。最后,文档提供了详细的配置文件示例,帮助开发者更好地理解和实现聚合服务。
🏠️ 项目仓库:智能排班系统
📙 项目介绍:【智能排班系统】开源说明

聚合服务

为什么需要开发聚合服务?

答:微服务项目中,往往会将系统的功能进行分析,然后进行服务划分,将系统划分为多个微服务,这些微服务合力完成系统的功能。但是在部署项目时需要将每个微服务启动起来,这样对于内存不大的服务器会产生较大的压力,通过开发聚合服务来将其他微服务的功能聚合起来,在部署的时候就不需要部署那么多微服务,可以节省服务器内存

创建聚合服务

在这里插入图片描述

添加依赖

该依赖需要将其他微服务模块都引入进来

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.dam</groupId>
        <artifactId>smart-scheduling-system-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <packaging>jar</packaging>
    <artifactId>sss-aggregation</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.dam</groupId>
            <artifactId>sss-enterprise</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.dam</groupId>
            <artifactId>sss-third-party</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.dam</groupId>
            <artifactId>sss-system-server</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.dam</groupId>
            <artifactId>shift-scheduling-calculate-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定该 Main Class 为全局的唯一入口 -->
                    <mainClass>com.dam.AggregationApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!-- 将依赖到的包都放进去 -->
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

启动类

package com.dam;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @Author dam
 * @create 2024/3/4 18:57
 */
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(value = {
        "com.dam.dao"
})
public class AggregationApplication {
    public static void main(String[] args) {
        SpringApplication.run(AggregationApplication.class, args);
    }
}

问题

启动之后会报如下错误,原因是FeignClient的Bean冲突了,存在多个一样的Bean

在这里插入图片描述

在配置文件添加如下配置即可禁用Spring的默认重复Bean检测

在这里插入图片描述

spring:
  main:
    allow-bean-definition-overriding: true

这样只能解决报错问题,却会造成隐藏问题,例如排班服务和system服务里面都有EnterpriseFeignService,但是两个接口里面引用的方法不同,在聚合服务中,只会加载其中一个Bean,可能导致部分方法找不到,如下图所示:

在这里插入图片描述
解决方法:将远程调用的代码抽取出来放到一个模块中,然后供所有服务使用。

在这里插入图片描述
相关代码改动可以参考这次提交

在这里插入图片描述

整合所有微服务的配置文件到聚合服务中

[application.yml]

spring:
  application:
    name: sss-aggregation
  main:
    allow-bean-definition-overriding: true
  # 设置不参与热部署的文件或文件夹
  devtools:
    restart:
      # 不需要热部署的文件,修改这些建议重启项目
      exclude: static/**,public/**,config/application.yml
      # 打开热部署开关
      enabled: true
      additional-paths: src/main/java
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  cache:
    type: redis
    redis:
      time-to-live: 86400000 #过期时间毫秒(设置一天)
      #      key-prefix: CACHE_ #设置缓存的前缀
      #      use-key-prefix: true #不开启默认使用分区的名称为前缀
      cache-null-values: true #是否缓存空值,解决缓存击穿问题
  profiles:
    # 启动项目所使用的环境
    #    active: prod
#        active: dev
    active: dam

aggregation:
  remote-url: http://127.0.0.1:${server.port}

#hystrix的超时时间,调用远程服务的可接受时间,设置太短的话,调用远程服务很容易报超时异常
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 30000
#ribbon的超时时间
ribbon:
  ReadTimeout: 30000
  ConnectTimeout: 30000
#多线程配置
sss:
  thread:
    core-size: 20
    max-size: 200
    keep-alive-time: 10

最后要记得额外添加如下配置,用来在调用远程服务的时候使用

aggregation:
  remote-url: http://127.0.0.1:${server.port}

[application-dev.yml]

server:
  port: 6010
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3308/smart_scheduling_system?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 12345678
  rabbitmq:
    # 虚拟机
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        #        开启消息手动确认机制(手动Ack),避免消息自动确认而丢失
        acknowledge-mode: manual
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: 127.0.0.1:8333
        port: 8719
    # oss配置
    alicloud:
      access-key:
      secret-key:
      oss:
        endpoint:
        bucket:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 12345678
    database: 0
    timeout: 1800000
    jedis:
      pool:
        max-active: 20 #最大连接数
        max-wait: -1    #最大阻塞等待时间(负数表示没限制)
        max-idle: 5    #最大空闲
        min-idle: 0     #最小空闲
  # 链路追踪
#  zipkin:
#    base-url: http://127.0.0.1:9411/
#    discovery-client-enabled: false
#    sender:
#      type: web
#  sleuth:
#    sampler:
#      probability: 1
logging:
  level:
    org:
      springframework:
        cloud:
          openfeign: debug
          # 链路最终控制台输出
          sleuth: debug
# 线程池设置
sss:
  thread:
    core-size: 20
    max-size: 200
    keep-alive-time: 10
#微信登录(感谢尚硅谷的app_id和app_secret)
wx:
  open:
    app_id: wxed9954c01bb89b47
    app_secret: a7482517235173ddb4083788de60b90e
    redirect_url: http://localhost:8160/api/ucenter/wx/callback

[application-dev.properties]

# QQ Mail Configuration
spring.mail.host=smtp.qq.com
spring.mail.port=587
spring.mail.username=
spring.mail.password=
spring.mail.default-encoding=utf-8
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

[myQuartz.properties]

org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=DefaultQuartzScheduler
#如果您希望Quartz Scheduler通过RMI作为服务器导出本身,则将“rmi.export”标志设置为true
#在同一个配置文件中为'org.quartz.scheduler.rmi.export'和'org.quartz.scheduler.rmi.proxy'指定一个'true'值是没有意义的,如果你这样做'export'选项将被忽略
org.quartz.scheduler.rmi.export=false
#如果要连接(使用)远程服务的调度程序,则将“org.quartz.scheduler.rmi.proxy”标志设置为true。您还必须指定RMI注册表进程的主机和端口 - 通常是“localhost”端口1099
org.quartz.scheduler.rmi.proxy=false
org.quartz.scheduler.wrapJobExecutionInUserTransaction=false


#实例化ThreadPool时,使用的线程类为SimpleThreadPool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#threadCount和threadPriority将以setter的形式注入ThreadPool实例
#并发个数  如果你只有几个工作每天触发几次 那么1个线程就可以,如果你有成千上万的工作,每分钟都有很多工作 那么久需要50-100之间.
#只有1到100之间的数字是非常实用的
org.quartz.threadPool.threadCount=5
#优先级 默认值为5
org.quartz.threadPool.threadPriority=5
#可以是“true”或“false”,默认为false
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true


#在被认为“misfired”(失火)之前,调度程序将“tolerate(容忍)”一个Triggers(触发器)将其下一个启动时间通过的毫秒数。默认值(如果您在配置中未输入此属性)为60000(60秒)
org.quartz.jobStore.misfireThreshold=5000
# 默认存储在内存中,RAMJobStore快速轻便,但是当进程终止时,所有调度信息都会丢失
#org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

#持久化方式,默认存储在内存中,此处使用数据库方式
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#您需要为JobStore选择一个DriverDelegate才能使用。DriverDelegate负责执行特定数据库可能需要的任何JDBC工作
# StdJDBCDelegate是一个使用“vanilla”JDBC代码(和SQL语句)来执行其工作的委托,用于完全符合JDBC的驱动程序
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#可以将“org.quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串,
#因此可以作为名称 - 值对存储而不是在BLOB列中以其序列化形式存储更多复杂的对象。从长远来看,这是更安全的,因为您避免了将非String类序列化为BLOB的类版本问题

org.quartz.jobStore.useProperties=true
#表前缀
org.quartz.jobStore.tablePrefix=QRTZ_
#数据源别名,自定义
org.quartz.jobStore.dataSource=qzDS


#使用阿里的druid作为数据库连接池
org.quartz.dataSource.qzDS.connectionProvider.class=com.dam.config.druid.DruidPoolingconnectionProvider

# 开发环境
org.quartz.dataSource.qzDS.URL=jdbc:mysql://127.0.0.1:3308/smart_scheduling_system?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
org.quartz.dataSource.qzDS.user=root
org.quartz.dataSource.qzDS.password=12345678

org.quartz.dataSource.qzDS.driver=com.mysql.cj.jdbc.Driver
org.quartz.dataSource.qzDS.maxConnections=10
#设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表,则此属性必须设置为“true”,否则您将遇到破坏
org.quartz.jobStore.isClustered=true

文件结构

在这里插入图片描述

其他微服务修改

在其他微服务的远程调用代码的@FeignClient中添加url属性,当存在url属性的时候,不会通过nacos来调用服务,而是直接使用url

在这里插入图片描述

网关服务修改

网关服务中创建application-aggregation.yml文件,因为所有微服务都被整合到聚合服务中了,路由配置需要重写

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 让gateway根据注册中心找到其他服务
          enabled: true
      routes:
        - id: system_route
          uri: lb://sss-aggregation/system/**
          predicates:
            - Path=/system/**

        - id: enterprise_route
          uri: lb://sss-aggregation/enterprise/**
          predicates:
            - Path=/enterprise/**

        - id: third_party_route
          uri: lb://sss-aggregation/thirdParty/**
          predicates:
            - Path=/thirdParty/**

        - id: shiftSchedulingCalculate_route 
          uri: lb://sss-aggregation/scheduling/**
          predicates:
            - Path=/scheduling/**

    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 6001

启动

当一切都修改结束之后,只需要启动网关服务和聚合服务即可使用整个系统,这样可以节约服务器的内存

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Dam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值