目录
[一 后端开发环境搭建](#一 后端开发环境搭建)
[二 中间件部署](#二 中间件部署)
[三 Nacos集成](#三 Nacos集成)
[四 网关集成解决方案](#四 网关集成解决方案)
一 后端开发环境搭建
1.环境介绍:
(1)开发环境
(2)联调环境
(3)联调环境
(4)生产环境
2.后端工程创建
(1)拉取远程代码
(2)创建feature分支
3.云服务器
4.虚拟机准备(与云服务器二选一)
(1)虚拟机的安装:
①ubuntu22.04下载,下载地址:https://releases.ubuntu.com/jammy/
②下载安装virtualbox,下载地址如下,点击即可完成下载https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18-162988-Win.exe
③安装VirtualBox,并使⽤virtualbox安装1台虚拟服务器,双击安装virtualbox
④点击新建按钮,填写名称,选择文件夹和Ubuntu的iso镜像⽂件
⑤配置好内存,硬盘,cpu等信息
(2)虚拟机网络设置
①网络设置:选中目标虚拟机,点击设置
选择网络分别设置以下三种网络连接方式:
网络地址转换
桥接网卡
仅主机(Host-Only)⽹络
注:设置好之后,重新启动虚拟机
②查看子网掩码和网关IP,查看仅主机(Host-Only)网络子网掩码和网关IP
③设置虚拟固定内网IP:分别填写虚拟内网IP(⾃定义)、子网掩码、网关IP
问题:为什么需要设置固定内网ip?
因为虚拟机要部署中间件,我们的代码需要通过ip来连接到中间件,如果经常变化我们就需要不停地维护,如果固定了就不用经常去维护了
(3)开启ssh服务
开启ssh服务的原因:后续可以通过xshell直接连接虚拟机,要使用xshell连接虚拟机,必须开启ssh服务
#1. 安装ssh服务
apt update
apt install openssh-server vim bash-completion -y
#2. root开启⽀持远程登录
vi /etc/ssh/sshd_config
# 调整配置⽂件值如下
PermitRootLogin yes
# 重启服务
systemctl restart ssh
使用ctrl+alt+F3打开命令行
二 中间件部署
本次部署:Redis,MySQL,Nacos,RabbitMQ
1.创建本地工作目录
中间部署时,需要编写或生成一些文件,我们将这些文件需要统一存储起来方便管理和后期维护
创建/deploy工作目录
在/deploy下创建dev/app,创建开发环境下的中间件的目录
在/dev/app下再创建不同中间件对应的目录下,比如redis,mysql,nacos
2.准备配置/数据初始化文件
(1)MySql数据初始化
①Mysql用户的创建:不能直接使用root用户来进行开发,因为root用户权限太高,安全性太低,我们创建一个新用户并赋予有限权限即可
②Mysql比特脚手架数据库的创建
③Nacos数据初始化,Nacos本身也需要使用Mysql作为外置数据库
意义:
(Ⅰ)数据持久性
(Ⅱ)保证Nacos服务的高可用性:一般生产环境都是在集群环境下使用Nacos,要保证Nacos数据的共享一致,使用内置数据库不好做到,包括Mysql内部也自带高可用性和故障转移
(Ⅲ)性能优化:外置的Mysql可以根据需要进行优化和扩展
(Ⅳ)易于管理和维护:统一采用Mysql,易于统一进行维护和管理
(2)Nacos配置
注:出于安全性的考虑,我们开启Nacos用户鉴权功能
在/deploy/dev/app/nacos/conf/application.properties添加该内容
XML
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %
{Request-Source}i
#⽇志信息 开发环境开启,后续⽣产看下性能影响
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=/home/bit/nacos/tomcat/logs
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use
`spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL
_SERVICE_DB_NAME}?
${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTime
out=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SE
CONDS:18000}
### The default token:
#nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}+
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkw
MTIzNDU2Nzg=
### Turn on/off caching of auth information. By turning on this switch, the
update of auth information would have a 15 seconds delay.
nacos.core.auth.enabled=true
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_E
NABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:ZHKUSSSDKEY1@761
86138}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:ZHKUSSS@4564
6YUI138}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**
/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/consolefe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server
/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
management.endpoints.web.exposure.include=*
nacos.istio.mcp.server.enabled=false
关键配置:
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:ZHKUSSSDKEY1@761
86138}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:ZHKUSSS@4564
6YUI138}
说明:开启登录鉴权,并且从环境变量里去读取用户名和密码,如果读取不到则使用默认的值,ZHKUSSSDKEY1@76186138和ZHKUSSS@45646YUI138
(3)Redis配置
在/deploy/dev/app/redis/conf/redis.conf下写入
关键修改配置文件此处:
XML
requirepass zhku@123
说明:设置redis登录使用的密码
3.编写docker-compose
配置在app目录下,保证文件里的相对路径互相匹配
(1)详解
①挂载(volumes):主要目的是将主机上的一个目录挂载到容器内的指定目录以实现数据的持久化和共享
作用:
(Ⅰ)在中间件的部署过程中,可能因为异常或者其他原因销毁容器,此时如果不对存储的数据进行挂载,那么服务器中已产生的数据会丢失
(Ⅱ)将配置或者初始化文件,同步到容器内部从而使得配置文件或者初始化文件生效
挂载日志文件的好处:虽然可能中间件删除了,但是还想知道当时的文件出现问题是什么情况,可以再去进行排查
②command:指定启动Mysql数据库的一系列参数
③healthcheck(健康检查)的参数:
test:指定用于检查容器健康状态的命令
start_period:容器启动之后,开始执行健康检查前等待的时间
interval:健康检查的间隔
timeout:健康检查命令的超时时间
retries:在认为容器不健康之前,连续失败的健康检查次数
healthcheck(健康检查)通常搭配depends_on进行使用,当当前服务的启动依赖于其他服务时,就可以使用depends_on,写出其依赖的服务名以及其健康状态
比如nacos依赖于外置数据库mysql,因此其启动的时候需要先对mysql进行健康检查,确保其是健康的才进行部署
④ulimits:
对线程和文件描述符进行限制,可以起到两个作用,一个是性能优化,一个是保证系统稳定,加上有些黑客可能会做一些操作,如果在这块不做限制的话可能会导致安全问题,侵占我们的系统的资源
⑤image:镜像
注:已经配置了网络,在同一个网络下此时就可以直接通过服务名称来进行连接了
⑥commad:启动时执行的命令
⑦hostname:后期集群环境中用于各节点问题通信和提高各节点辨识度
(2)文件配置参考
XML
version: '3.8'
#启动命令 docker compose -p frameworkjava -f docker-compose-mid.yml up -d
services:
frameworkjava-mysql:
container_name: frameworkjava-mysql
image: mysql:8.4.2
ports:
- "3306:3306"
volumes:
# 数据挂载
- ../data/frameworkjavadata/mysql/data:/var/lib/mysql
# 配置挂载
- ./mysql/init/init.sql:/docker-entrypoint-initdb.d/init.sql
- ./mysql/sql:/opt/sql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1',
'--explicit_defaults_for_timestamp=true',
'--server-id=1',
'--log-bin=mysql-bin',
'--binlog-ignore-db=mysql',
'--binlog-cache-size=256M',
'--binlog-format=ROW',
'--max_connections=2000'
]
restart: always
networks:
- frameworkjava_network
healthcheck:
test: mysql --user=<your_mysql_user> -h127.0.0.1 --password='<your_mysql_password>' -e "SELECT 1;"
start_period: 30s
interval: 10s
timeout: 5s
retries: 10
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: <your_mysql_root_password>
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
frameworkjava-nacos:
container_name: frameworkjava-nacos
image: nacos/nacos-server:v2.2.2
environment:
- MODE=standalone
- JVM_XMS=512m
- JVM_XMX=512m
- JVM_XMN=256m
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=frameworkjava-mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=frameworkjava_nacos_dev
- MYSQL_SERVICE_USER=<your_mysql_user>
- MYSQL_SERVICE_PASSWORD=<your_mysql_password>
volumes:
- ../data/frameworkjavadata/nacos/logs/:/home/nacos/logs
- ../data/frameworkjavadata/nacos/tomcatlogs/:/home/bit/nacos/tomcat/logs/
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
restart: always
networks:
- frameworkjava_network
depends_on:
frameworkjava-mysql:
condition: service_healthy
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos" ]
start_period: 30s
interval: 10s
timeout: 10s
retries: 10
frameworkjava-redis:
container_name: frameworkjava-redis
image: redis:7.0.15
ports:
- "6379:6379"
volumes:
- ./redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ../data/frameworkjavadata/redis/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
restart: always
networks:
- frameworkjava_network
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 10
frameworkjava-rabbitmq:
image: rabbitmq:3.12.6-management
container_name: frameworkjava-rabbitmq
restart: always
hostname: frameworkjava-rabbitmq
environment:
RABBITMQ_DEFAULT_USER: <your_rabbitmq_user>
RABBITMQ_DEFAULT_PASS: <your_rabbitmq_password>
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ../data/frameworkjavadata/rabbitmq/log:/var/log/rabbitmq
- ../data/frameworkjavadata/rabbitmq/data:/var/lib/rabbitmq
networks:
- frameworkjava_network
healthcheck:
test: [ "CMD", "rabbitmqctl", "status" ]
interval: 10s
timeout: 10s
retries: 10
networks:
frameworkjava_network:
4.执行docker-compose文件
(1)使用Xftp将放对应文件的目录进行上传,在/dev/deploy/app下执行下面启动语句
XML
docker compose -p framework-java -f docker-compose-mid.yml up -d
此时,显示中间件部署成功,但是我们自身还需要再下载一下软件来验证中间件的状态是ok的
(2)停止中间件运行
XML
docker compose -p framework-java -f docker-compose-mid.yml stop
(3)检查中间健康状态
XML
docker ps
5.软件安装与验证
(1)DBeaver:用于图形化操作数据库,并且验证数据库是否部署成功
下载链接:https://dbeaver.io/
(2)Another Redis Desktop Manager:操作Redis的图形化界面,可用于验证Redis是否部署成功
(3)查看Nacos是否部署成功
访问:http://你的云服务器外⽹Ip/你的虚拟机内⽹ip:8848/nacos/#/login
(4)查看RabbitMq是否部署成功
访问:http://你的云服务器外⽹Ip/你的虚拟机内⽹ip:15672/#/
三 Nacos集成
1.模板微服务的创建
补充:如果需要在控制台显示一些品牌信息可以在resources下添加banner.txt文件,其就会对应显示
(1)创建意义:
①很多业务微服务的创建其实都是相类似的,可以提取出一份模板
②可以用验证nacos的集成,因为nacos集成前还有现成的服务
(2)引入bootstrap.yml:
XML
spring:
application:
name: bite-mstemplate
profiles:
active: ${RUN_ENV}
cloud:
nacos:
discovery:
username: nacos
password: zhku@123
namespace: frameworkjava-${RUN_ENV}
server-addr: ${NACOS_ADDR}
config:
username: nacos
password: zhku@123
namespace: frameworkjava-${RUN_ENV}
server-addr: ${NACOS_ADDR}
file-extension: yaml
# 这⼀配置⽤于定义应⽤在控制台输出⽇志时所遵循的格式规则
logging:
pattern:
console: '[%thread] %-5level %logger{36} - %msg%n'
说明:此处引入${RUN_ENV}方便在nacos对不同环境下的配置进行变换,包括命名空间也是根据当前环境去进行变换,因此此处需要设为变量
注:那么服务启动的时候需要配上对应的环境变量:NACOS_ADDR=http://你的云服务器外⽹ip/你的虚拟机内⽹ip:8848;RUN_ENV=dev
四 网关集成解决方案
1.网关服务创建成功
2.网关服务配置成功
在nacos配置中心进行配置,方便后续随时进行调整
XML
server:
port: 18080
spring:
cloud:
gateway:
routes:
# 管理模块
- id: bite-mstemplate
uri: lb://zhku-mstemplate
predicates:
- Path=/mstemplate/**
filters:
- StripPrefix=1
StripPrefix=1:全局过滤器,将前面统一的路径/mstemplate去掉,再转发到后端服务器