微信公众号:[执着猿哥]
记录和分享java、springcloud等企业级编码技术知识。有问题或建议和源码,请关注公众号。
自从微服务开始,碰到越来越多甲方必须采用微服务框架,且Alibaba发布微服务组件后更要使用。 目前因为SpringCloud与SpringBoot更新迭代非常频繁,所以Alibaba版本也进行很多更新迭代。若是版本选择有问题, 会导致开发中调试兼容性占用非常多的没必要时间。
所以本系列通过开源微服务框架【若依微服务】结合自身实际企业开发进行系统性梳理,好记忆不如烂笔头(__)
查看SpringCloud Alibaba官网版本,选择【毕业版本依赖关系(推荐使用)】中推荐版本
所以选型定位:
Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version | Nacos Version |
---|---|---|---|
Spring Cloud 2021.0.1 | 2021.0.1.0 | 2.6.3 | 1.4.2 |
目前nacos的最新版本是2.0.4, nacos server2.x 向下兼容nacos客户端。所以nacos server 选2.0.4,客户端选nacos -clien 1.4.2
查看Nacos2升级文档介绍如下
访问https://gitee.com/chenjinafan_admin/RuoYi-Cloud,Forked若依微服务源码。这边要思考下:如果一边修改若依源码,另外一边还需同步若依作者新增的功能,要如何实现?在分支上做二开,在master主分支上做若依同步,如果master同步功能下来,把master分支合并到master-dev 二开分支
1、通过TortoiseGit小乌龟拉取Forked
2、通过TortoiseGit 创建名为:master-dev的分支做二开,点击【确定】按钮创建分支,并提交代码
3、通过TortoiseGit 切换分支,在分支上做二开
4、在仓库左上角有个刷新的图片,点击刷新
提示如下,点击【确定】同步
5、在仓库功能菜单栏【Pull Request】 弹出pull Request框,按如下选择,点击合并到dev分支,审核和测试通过话,合并成功
6、 合并选择,扁平化分支,点击【接受Pull Request】 进行合并。
查看 RuoYi-Cloud 根目录下的pom.xml文件可看到如下版本号
可知道若依微服务选型如下:
spring-cloud的版本号是 2021.0.1,springcloudalibaba版本号是2021.1,springboot版本是2.6.6,这个跟之前的选的版本一样,但是目前若依微服务nacos客户端是2.0.4的版本,会一直报链接127.0.0.1:9848的问题(nacos2.x版本新增的grpc功能),所以我们可手动降低版本到nacos-clen1.4.2版本。先查看下官网对包介绍
com.ruoyi
├── ruoyi-ui // 前端框架 [80]
├── ruoyi-gateway // 网关模块 [8080]
├── ruoyi-auth // 认证中心 [9200]
├── ruoyi-api // 接口模块
│ └── ruoyi-api-system // 系统接口
├── ruoyi-common // 通用模块
│ └── ruoyi-common-core // 核心模块
│ └── ruoyi-common-datascope // 权限范围
│ └── ruoyi-common-datasource // 多数据源
│ └── ruoyi-common-log // 日志记录
│ └── ruoyi-common-redis // 缓存服务
│ └── ruoyi-common-security // 安全模块
│ └── ruoyi-common-swagger // 系统接口
├── ruoyi-modules // 业务模块
│ └── ruoyi-system // 系统模块 [9201]
│ └── ruoyi-gen // 代码生成 [9202]
│ └── ruoyi-job // 定时任务 [9203]
│ └── ruoyi-file // 文件服务 [9300]
├── ruoyi-visual // 图形化管理模块
│ └── ruoyi-visual-monitor // 监控中心 [9100]
├──pom.xml // 公共依赖
打开运行基础模块(启动没有先后顺序)
RuoYiGatewayApplication (网关模块 必须)
RuoYiAuthApplication (认证模块 必须)
RuoYiSystemApplication (系统模块 必须)
RuoYiMonitorApplication (监控中心 可选)
RuoYiGenApplication (代码生成 可选)
RuoYiJobApplication (定时任务 可选)
RuoYFileApplication (文件服务 可选)
集成seata
分布式事务(可选配置,默认不启用)
安装软件推荐
JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (官网推荐5.7版本) 直接安装到mysql8,有问题直接适配
Redis >= 3.0 使用6.x
Maven >= 3.0
Node >= 12
nacos >= 1.1.0 (ruoyi-cloud >= 3.0.0需要下载nacos >= 2.x.x版本) 不影响,看阿里巴巴官网毕业版本,本教程使用nacos cline 1.4.2 ,nacosserver 2.0.4
sentinel >= 1.6.0 使用1.8.3
服务器centos7.8部署
提供docker部署msyql8、redis6.x nacos_server 2.0.4 脚本
云服务器安全组开放端 10098
docker run --name mysq8db -p 10098:3306 -e MYSQL_ROOT_PASSWORD=qr12qga6553 -d -v /home/mysql/:/var/lib/mysql mysql:8.0 --lower_case_table_names=1
-v /home/mysql/:/var/lib/mysql 把mysql8 存储路径挂载到主机/home/mysql/目录
MYSQL_ROOT_PASSWORD=qr12qga6553 数据库密码,默认用户root
lower_case_table_names=1 忽略大小写
使用 Navicat 链接数据库,并创建数据库【ry_config】,导入若依微服务中nacos数据库脚本:ry_config_20220114.sql,如图:
nacos server 2.0.4
创建临时nacos镜像,用来拷贝配置和日志目录
docker run -p 8848:8848 --name nacos24 -d nacos/nacos-server:v2.0.4
创建临时nacos镜像,用来拷贝配置和日志目录
docker cp nacos24:/home/nacos/logs/ /home/nacos1
docker cp nacos24:/home/nacos/conf/ /home/nacos1
#删掉临时容器
docker stop nacos24
docker rm nacos24
更改nacos数据库配置
server.port=8848
#开启数据库
db.num=1
### Connect URL of DB:
#更改数据连接参
db.url.0=jdbc:mysql://xx.xx.216.8:3361/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=abaf78/
启动正式nacos,其中standalone是单机模式,挂载log和conf配置目录。并验证启动是否成功:http://ip:port:8848/nacos。注意如果是云服务器都要再安全组里面开启端口:8848、9848、9849
docker run -d\
--name nacos24\
-e MODE='standalone'\
-e TZ="Asia/Shanghai"\
-v /home/nacos1/logs:/home/nacos/logs \
-v /home/nacos1/conf:/home/nacos/conf \
-p 8848:8848\
-p 9848:9848\
-p 9849:9849\
--restart=always \
nacos/nacos-server:v2.0.4
redis6.2.7
云服务器安全组开放63719端口
docker run --restart always -d --name redis627 -p 63719:6379 redis:6.2.7
本教程先按最小化部署到云服务上: ruoyi-gateway(Api网关)、ruoyi-auth(用户认证)、ruoyi-system(用户/授权等系统模块)、 ruoyi-ui(前端PC)。采用最基础的jar包方式部署应用,并改造:使用assembly maven插件把工程配置和依赖包移除jar包,并放到外部,执行脚本的时候读取配置文件和依赖。
改造涉及到ruoyi-gateway(Api网关)、ruoyi-auth(用户认证)、ruoyi-system(用户/授权等系统模块),目前按ruoyi-gateway为案例,余下都是一样的。
1. 更改前pom.xml
```
#如下是若依微服务自带的编辑脚本
<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
```
#更改后的pom.xml
<build>
<finalName>${project.artifactId}finalName>
<extensions>
<extension>
<groupId>org.apache.maven.wagongroupId>
<artifactId>wagon-sshartifactId>
<version>2.8version>
extension>
extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<excludes>
<exclude>bootstrap.ymlexclude>
<exclude>logback.xmlexclude>
excludes>
<archive>
<addMavenDescriptor>falseaddMavenDescriptor>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
<mainClass>com.ruoyi.gateway.RuoYiGatewayApplicationmainClass>
manifest>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<configuration>
<skipTests>trueskipTests>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-assembly-pluginartifactId>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/package.xmldescriptor>
descriptors>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
mainClass: 替换成模块中 springboot启动的那个 com.ruoyi.auth.RuoYiAuthApplication
maven-assembly-plugin插件:descriptor指定打包配置文件package.xml 存放路径,把package.xml文件放在此工程目录下
package.xml脚本中主要描述是打包操作,可以详细读下,包含:配置、依赖和执行脚本文件位置存放,以及压缩打包。
2 执行脚本编写,
当前脚本再打包后都会打包压缩包里面,每个模块主要是更改 ”APP_NAME=ruoyi-auth.jar‘ 中的值。存放在:ruoyi–gateway–src–main–bin,如果bin目录没有手动创建。脚本如下
#!/bin/bash
cd ../
workdir=$(cd $(dirname $0); pwd)
#这里可替换为你自己的执行程序,其他代码无更改
APP_NAME=ruoyi-gateway.jar
HEAP_DUMP_LOG=../logs/
JAVA_OPTIONS="-server -Xrs -Xmx2g -Xms2g -Xmn512m -Xss256k -XX:+PrintGCDetails -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:SurvivorRatio=8 -Xverify:none -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HEAP_DUMP_LOG} -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8"
#使用说明,用来提示输入参
usage() {
echo "Usage: sh app.sh [start|stop|restart|status]"
exit 1
}
#查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返1,存在返0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java ${JAVA_OPTIONS} -jar ${workdir}/${APP_NAME} >/dev/null 2>&1 &
echo "${APP_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行�??????
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,择执行对应方法,不输入则执行使用说
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
如上脚本执行命令如下:
```
sh app.sh start 启动
sh app.sh restart 重启
sh app.sh status 查看启动状态
```
涉及到改造已完成,另外的模块可按一样的方法改造。最终包结构
打包后的压缩包结构:
把目前都改造的完成的模块上传到服务器
进入config目录,查看logback.xml和bootstrap.yml 两个文件,logback.xml是日志配置文件保持默认即可,主要修改bootstrap.yml下配置
# Tomcat
server:
port: 8080
# Spring
spring:
application:
# 应用名称
name: ruoyi-gateway
profiles:
# 环境配置
active: dev
main:
allow-circular-references: true
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
.....
服务注册和配置地址都是:127.0.0.1:8848,这个是因为项目工程和nacos都部署在同一台服务器上,如果部署在不同服务器上,要保障nacos和项目工程都在同一个局域网能够互通。暂时不使用nacos 命名空间。
工程配置文件:ruoyi-gateway-dev.yml
共享配置文件: application- s p r i n g . p r o f i l e s . a c t i v e . {spring.profiles.active}. spring.profiles.active.{spring.cloud.nacos.config.file-extension}转化 application-dev.yml
修改ruoyi-gateway-dev.yml 关于redis、日志配置
spring:
redis:
host: 127.0.0.1
port: 63719
password:
...
#logging和spring同级
logging:
config: file:config/logback.xml
启动ruoyi-gateway
cd /opt/cloud/ruoyi-gateway/bin
sh app.sh start
如果执行脚本报如下错误
- No such file or directory
app.sh: line 9: syntax error near unexpected token$'{\r'' 'pp.sh: line 9:
usage() {执行如下语句解决
sed -i 's/\r//g' app.sh
进入/opt/cloud/ruoyi-gateway/logs,执行如下shell脚本,如显示如下图片,则部署成功。
tail -f info.log
访问路径地址:http://ip:8080/swagger-ui/index.html
8080端口要云服务器安全组开放端口,才能访问
进入config目录,查看logback.xml和bootstrap.yml 两个文件,修改bootstrap.yml下nacos地址
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
修改ruoyi-gateway-dev.yml 关于redis、日志配置
spring:
redis:
host: 127.0.0.1
port: 63719
password:
...
#logging和spring同级
logging:
config: file:config/logback.xml
启动ruoyi-auth
cd /opt/cloud/ruoyi-auth/bin
sh app.sh start
进入/opt/cloud/ruoyi-auth/logs,执行如下shell脚本,查看日志是否部署成功。
进入config目录,查看logback.xml和bootstrap.yml 两个文件,修改bootstrap.yml下nacos地址
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
修改ruoyi-system-dev.yml 关于redis、日志配置、数据库
spring:
redis:
host: 127.0.0.1
port: 63719
password:
...
dynamic:
....
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:10098/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: qr12qga6553
#logging和spring同级
logging:
config: file:config/logback.xml
链接数据库,创建ry-cloud库表,把若依数据库脚本导入到数据库中 D:\open\RuoYi-Cloud\sql\ry_20210908.sql
启动 ruoyi-system
cd /opt/cloud/ruoyi-modules-system/bin
sh app.sh start
进入/opt/cloud/ruoyi-modules-system/logs,执行如下shell脚本,查看日志是否部署成功。
4 ruoyi-ui(前端PC)
centos7.x 安装nginx
1.将nginx放到yum repro库中
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2.使用yum安装ngnix
yum install nginx
3.启动nginx
systemctl stop nginx.service
4.开机启动nginx
systemctl enable nginx.service
ningx默认端口80,腾讯云服务器开启端口访问
前端打包
# 打包正式环境
npm install --registry=https://registry.npm.taobao.org
npm install
npm run build:prod
构建打包成功之后,会在根目录生成 ruoyi
文件夹,里面就是构建打包好的文件。把ruoyi目录上传到服务器/usr/share/nginx/html 目录下
修改nginx 的配置文件
```shell
vi /etc/nginx/nginx.conf
#参数修改如下
....
server {
listen 80 default_server;
listen [::]:80 default_server;
.......
# 前端pc
location / {
root /usr/share/nginx/html/ruoyi;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
# 转发网关地址
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/;
}
.......
```
重启nginx
systemctl restart nginx.service
访问网页地址:http://ip:80/,点击登录。服务器部署都没问题,本地部署大概率都是没问题的了,