宝塔面板-微服务项目部署
以港口能量管理系统微服务项目为例,它常用的服务有
服务名称 | 用途 | 是否必须 |
---|---|---|
nacos | 服务注册发现和统一配置中心 | 是 |
rabitmq | 消息中间件 | 否 |
xxl-job-admin | 分布式定时任务 | 是 |
sentinel | Sentinel监控 | 否 |
gateway | 网关微服务,统一的数据入口 | 是 |
system | jeecg系统服务,提供登录,系统配置等功能 | 是 |
demo | 业务代码微服务,实现主要的业务功能 | 是 |
zncb | 智能抄表微服务,与硬件设备对接 | 是 |
1.安装宝塔面板
官网下载安装地址:[https://www.bt.cn/new/download.html](https://www.bt.cn/new/download.html)2.创建数据库
2.1创建naocs数据库
添加数据库选择Mysql数据库,配置数据库名添加完成后导入数据sql,如下附件
2.2创建xxl-job数据库
添加数据库选择Mysql数据库,配置数据库名添加完成后导入数据sql,如下附件
2.3创建Jeecg系统数据库
添加数据库选择Mysql数据库,配置数据库名添加完成后导入数据sql,如下附件
ydb-wei-jeecg_2024-08-08_01-30-02_mysql_data.sql.gz
2.4创建MongoDB数据库
MongoDB作为一款高性能高可用的灵活数据库可方便处理海量数据(每秒2.5万次数据处理),用来存储硬件设备发来的数据.在宝塔上安装MongoDB数据库,然后添加一个数据库
2.5创建时序数据库InfluxDB
InfluxDB时序数据库只关注新增数据,不处理修改和删除数据,所以能做到海量数据的插入和查询,在亿级数据的查询上能做到毫秒级响应,丰富的查询语句和方式可以更好的查询数据.官方文档:安装 InfluxDB |InfluxDB OSS 2.7 文档 (influxdata.com)
安装完成后创建一个存储桶
2.5创建Redis缓存
直接在宝塔面板的软件管理中搜索redis进行安装,设置端口和密码3.修改项目配置
启动环境都搭建好了以后,就可以根据设置的环境修改项目配置,但是微服务项目中大部分的配置都在nacos中进行配置,所以当前介绍的是其他微服务如何连接nacos和nacos数据库配置,还有xxl-job分布式定时任务的配置3.1Nacos配置
nacos作为一个注册和配置中心,我们只需要关注他连接的数据库,配置数据库的相关配置即可.3.2打包Nacos
修改完成后即可将项目打包,因为其他的配置项需要在nacos中进行配置,需要先部署nacos3.3部署Nacos
在宝塔面板上添加java项目,选择springboot类型3.4Nacos操作
nacos部署成功后可以通过浏览器进行访问,我部署在内网服务器上,地址为http://nacos.jyjb.org/nacos/index.html
默认账号密码都是nacos
3.4.1创建命名空间
命名空间是一个概念,相当于工作空间,将不同的环境进行区分和隔离,比如测试和生产环境可以放到不同的命名空间下,每个命名空间下都可以配置不同的配置文件,服务注册后也在不同的空间下相互隔离每个命令空间都会有自己唯一的ID,需要复制这个ID到项目的配置中,比如我的测试环境的命名空间是7e2140cf-c4e2-4760-81f5-19ef78b8d93d
3.4.2配置命令空间和注册地址
找到项目最核心的POM文件,修改其中的命令空间,dev,test,prod都有自己的命名空间和注册地址,生产环境中配置时需要将prod的命名空间ID修改,注册地址修改到当前环境下的nacos部署地址和端口3.5XXL-JOB配置
分布式定时任务xxl-job我们需要关注的是他连接的数据源和accessTokenlogin中配置的是启动后的登录用户和密码,accessToken是其他服务启动后像定时任务注册时需要提供的秘钥
3.6微服务配置
以上都是在项目文件中进行配置,各个微服务的配置还没有进行配置,还要nacos能统一管理服务配置,不需要我们每次都修改项目文件配置,只需要在界面上操作即可,以下是测试环境的命名空间下的配置文件列表如果是新的生产环境可能没有这些配置文件,需要从其他地方进行复制,其中文件名中的test都需要更改成prod,比如jeecg-test.yaml需要改成jeecg-prod.yaml,附件中是test环境的一些配置文件
nacos_config_export_20240808161509.zip
其中基础的配置文件jeecg.yaml不需要更改其中配置
server:
tomcat:
max-swallow-size: -1
error:
include-exception: true
include-stacktrace: ALWAYS
include-message: ALWAYS
compression:
enabled: true
min-response-size: 1024
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
management:
health:
mail:
enabled: false
endpoints:
web:
exposure:
include: "*"
health:
sensitive: true
endpoint:
health:
show-details: ALWAYS
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
mail:
host: smtp.163.com
username: jeecgos@163.com
password: ??
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
quartz:
job-store-type: jdbc
initialize-schema: embedded
auto-startup: false
startup-delay: 1s
overwrite-existing-jobs: true
properties:
org:
quartz:
scheduler:
instanceName: MyScheduler
instanceId: AUTO
jobStore:
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
misfireThreshold: 12000
clusterCheckinInterval: 15000
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
aop:
proxy-target-class: true
activiti:
check-process-definitions: false
async-executor-activate: false
job-executor-activate: false
jpa:
open-in-view: false
freemarker:
suffix: .ftl
content-type: text/html
charset: UTF-8
cache: false
prefer-file-system-access: false
template-loader-path:
- classpath:/templates
mvc:
static-path-pattern: /**
pathmatch:
matching-strategy: ant_path_matcher
resource:
static-locations: classpath:/static/,classpath:/public/
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
mybatis-plus:
mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
global-config:
banner: false
db-config:
id-type: ASSIGN_ID
table-underline: true
configuration:
call-setters-on-nulls: true
3.6.1System微服务配置
system微服务使用的配置文件是jeecg-test.yaml,同时demo微服务也使用的这个配置文件,其中配置如下,需要将MongoDB配置,mysql配置,redis配置,rabbitmq配置,influxDB配置都修改成实际环境的配置,请注意#配置根据实际环境修改spring:
data:
#配置根据实际环境修改
mongodb:
uri: mongodb://zncb:zncb123@192.168.0.101:27017/zncb
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
allow:
web-stat-filter:
enabled: true
dynamic:
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
master:
#配置根据实际环境修改
url: jdbc:mysql://192.168.0.101:3306/ydb-wei-test?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: ydb-wei-test
password: ydbweiwang123
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
#配置根据实际环境修改
database: 0
host: 127.0.0.1
password: 1qaz@WSX2ml
port: 6380
rabbitmq:
#配置根据实际环境修改
host: 124.71.136.36
username: xiaozhuo
password: 1qaz@WSX
port: 5672
publisher-confirms: true
publisher-returns: true
virtual-host: zncb
listener:
simple:
acknowledge-mode: manual
concurrency: 1
max-concurrency: 1
retry:
enabled: true
minidao:
base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*
jeecg:
signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
appId: 123456
signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys
uploadType: local
domainUrl:
pc: http://localhost:3100
app: http://localhost:8051
path:
upload: /opt/jeecg/upFiles
webapp: /opt/jeecg/webapp
shelload: /opt/jeecg/shellFile
tempload: /opt/jeecg/tempFile
python: python3
shiro:
excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**,/actuator/**,/license/licenseInfo/edit
oss:
endpoint: oss-cn-beijing.aliyuncs.com
accessKey: ??
secretKey: ??
bucketName: jeecgdev
staticDomain: ??
elasticsearch:
cluster-name: jeecg-ES
cluster-nodes: jeecg-boot-es:9200
check-enabled: false
file-view-domain: 127.0.0.1:8012
minio:
minio_url: http://minio.jeecg.com
minio_name: ??
minio_pass: ??
bucketName: otatest
jmreport:
mode: dev
is_verify_token: false
verify_methods: remove,delete,save,add,update
wps:
domain: https://wwo.wps.cn/office/
appid: ??
appsecret: ??
xxljob:
#配置根据实际环境修改
enabled: true
adminAddresses: http://192.168.0.101:9080/xxl-job-admin
appname: weiwang-test
accessToken: 123456
logPath: logs/jeecg/job/jobhandler/
logRetentionDays: 30
#配置根据实际环境修改
redisson:
address: 127.0.0.1:6380
password: 1qaz@WSX2ml
type: STANDALONE
enabled: true
logging:
level:
org.jeecg.modules.system.mapper : info
cas:
prefixUrl: http://localhost:8888/cas
knife4j:
production: false
basic:
enable: false
username: jeecg
password: jeecg1314
justauth:
enabled: true
type:
GITHUB:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback
WECHAT_ENTERPRISE:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback
agent-id: ??
DINGTALK:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback
cache:
type: default
prefix: 'demo::'
timeout: 1h
third-app:
enabled: false
type:
WECHAT_ENTERPRISE:
enabled: false
client-id: ??
client-secret: ??
agent-id: ??
DINGTALK:
enabled: false
client-id: ??
client-secret: ??
agent-id: ??
#配置根据实际环境修改
influx:
url: http://1.15.142.132:8090
token: bDzTsDFqtnXTwXMcdfuy40qxENqArOCHlpZozNm90WInOmtCKxW0lLDNVAVxgTzEFzEwyFdTPZ0WlJJuUWGYXg==
bucket: weiwang
org: zncb
queue:
#多个项目同时部署时,METER_HEART_QUEUE不能重复,否则消息在一个队列中轮询
#电表心跳处理队列,接收电表心跳广播,处理电表心跳相关的事件
METER_HEART_QUEUE: meter_heart_queue
#同步消息接收队列,接收抄表系统发送的同步消息
#多个项目同时部署时,SYNC_SEND_QUEUE,否则消息在一个队列中轮询
ASYNC_RECEIVE_QUEUE: async_receive_queue
exchange:
#异步接收交换机,广播模式
ASYNC_SEND_EXCHANGE: async_send_exchange
#同步接收交换机,广播模式
SYNC_SEND_EXCHANGE: sync_send_exchange
#异步发送交换机,定向模式
ASYNC_RECEIVE_EXCHANGE: sync_receive_exchange
#电表心跳处理交换机,广播模式
METER_HEART_EXCHANGE: meter_heart_exchange
3.6.2Zncb微服务配置
zncb微服务是智能抄表的简称,主要与硬件设备进行对接,通过了丰富的数据传输和解析协议,可以通过TCP协议,MQTT协议,Http协议,Rabbit协议,Redis缓存进行数据的交换和转发,内置DLT645协议解析器,可以处理电表发过来的报文,然后将数据通过多种方式传输到其他服务中,修改的部分参考#配置根据实际环境修改spring:
mqtt:
#配置根据实际环境修改
username: xiaozhuo
password: 123456
client-id-prefix: tashi
url: tcp://106.53.135.139:8096
topics: wangguan/#,tashi
data:
#配置根据实际环境修改
mongodb:
uri: mongodb://zncb:zncb123@192.168.0.101:27017/zncb
netty:
server:
#配置根据实际环境修改
port: 10084
queue:
#多个项目同时部署时,ASYNC_SEND_QUEUE不能重复,否则消息在一个队列中轮询
#异步消息发送队列,发送消息到异步队列中
ASYNC_SEND_QUEUE: async_send_queue
#同步消息接收队列,接收抄表系统发送的同步消息
#多个项目同时部署时,SYNC_SEND_QUEUE,否则消息在一个队列中轮询
SYNC_SEND_QUEUE: sync_send_queue
exchange:
#异步接收交换机,广播模式
ASYNC_SEND_EXCHANGE: async_send_exchange
#同步接收交换机,广播模式
SYNC_SEND_EXCHANGE: sync_send_exchange
#异步发送交换机,定向模式
ASYNC_RECEIVE_EXCHANGE: sync_receive_exchange
#电表心跳交换机
METER_HEART_EXCHANGE: meter_heart_exchange
3.6.3Gateway微服务
网关微服务需要连接redis和设置网关配置获取方式,默认从数据库中获取网关配置jeecg:
route:
config:
#type:database nacos yml
data-type: database
group: DEFAULT_GROUP
data-id: jeecg-gateway-router
spring:
redis:
database: 0
host: 127.0.0.1
port: 6380
password: 1qaz@WSX2ml
4.部署后端项目
以上配置都完成后,即可部署项目,首先要将项目打包打包后有多个jar包,每个微服务的jar包都需要上传到宝塔面板的FTP中
4.1网关微服务部署
部署完成后打开页面
4.2定时任务服务部署
部署完成后打开页面
4.3JEECG系统微服务部署
4.4哨兵监听微服务部署
部署完成打开页面
4.5智能抄表微服务部署
4.6业务系统微服务部署
以上微服务部署完成需要检查日志中有无报错信息,根据实际的报错信息进行问题的排查,大部分问题还是进行文件配置时配置有遗漏的问题
5.部署前端项目
前端项目相对来说就容易部署太多了,只需要修改前端配置,然后将项目打包编译后上传到服务器中,简单的配置即可5.1项目打包
修改配置文件.env.test,根据项目环境修改,如果是生产环境修改.env.prod,下面配置中配置后端网关微服务的url地址或者域名编译项目,在package.json中选择编译的类型,测试环境编译或生产环境编译,点启动
编译完成后在项目根目录中会存在一个dist文件夹,将文件夹上传到FTP中
5.2配置项目
在宝塔面板中选择一个HTML项目,上传dist文件夹到FTP中,配置时选择ftp下的dist文件夹,配置好域名即可访问打开页面地址
以上就是项目部署的全过程,如果出现了验证码说明整个配置没问题,可登录访问
6.进阶部署
通过以上方式部署成功后,存在一个问题,每次代码发版更新都要重新进行代码拉取,打包编译,上传到FTP,重启项目整个流程,有没有方式能简化这些步骤,可以使用Jenkins进行一键部署,全自动的拉取代码,编译,上传,重启项目,以下是文档地址https://www.yuque.com/xiaozhuo-fapnj/qpukwi/dzp1ugf4s24dd9bk?singleDoc# 《Jenkins使用》