文章目录
- 聚合服务
- 创建聚合服务
- 添加依赖
- 启动类
- 问题
- 整合所有微服务的配置文件到聚合服务中
- 文件结构
- 其他微服务修改
- 网关服务修改
- 启动
聚合服务
为什么需要开发聚合服务?
答:微服务项目中,往往会将系统的功能进行分析,然后进行服务划分,将系统划分为多个微服务,这些微服务合力完成系统的功能。但是在部署项目时需要将每个微服务启动起来,这样对于内存不大的服务器会产生较大的压力,通过开发聚合服务来将其他微服务的功能聚合起来,在部署的时候就不需要部署那么多微服务,可以节省服务器内存
创建聚合服务
添加依赖
该依赖需要将其他微服务模块都引入进来
<?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
整合所有微服务的配置文件到聚合服务中
[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
启动
当一切都修改结束之后,只需要启动网关服务和聚合服务即可使用整个系统,这样可以节约服务器的内存