分布式微服务架构搭建(举出一个项目搭建的例子,其他项目可参考本文档)
基于Nginx作为web服务器、JDK作为Java运行环境、MySQL作为关系型数据库、Nacos作为服务发现和配置中心、Maven作为项目管理工具、Redis作为缓存和消息中间件(视具体需求而定)、Node.js与npm作为某些微服务(如前端服务或特定业务逻辑服务)的开发和依赖管理工具,可以搭建一个完整的分布式微服务架构项目。以下是一个简化的项目搭建例子,供其他项目参考
定义:
分布式微服务架构是一种将大型应用程序拆分成多个小型、自治的服务的方法,每个服务独立运行在自己的进程中,并通过轻量级的通信机制(如HTTP REST API)进行通信。这种架构允许不同的服务使用不同的编程语言、数据库和部署平台,从而实现高度的灵活性和可扩展性。
关键特性:
- 服务独立性与自治性:
每个微服务都是一个独立的业务单元,拥有自己的业务逻辑、数据存储和自动化测试。
服务之间通过明确定义的接口进行通信,降低了服务间的耦合度。
- 轻量级通信:
微服务之间通常使用轻量级的通信协议(如HTTP、gRPC)进行通信。
消息队列(如RabbitMQ、Kafka)也常用于服务间的异步通信。
- 独立部署与扩展:
每个微服务都可以独立部署、更新和扩展,而不会影响其他服务。
这使得团队可以更快地响应业务需求,并优化系统的性能。
- 自动化与DevOps:
自动化工具(如CI/CD流水线、Docker容器、Kubernetes编排工具)用于简化微服务的部署、管理和监控。
DevOps文化强调开发与运维的紧密合作,促进了快速反馈和持续改进。
- 数据分散与聚合:
每个微服务可能拥有自己的数据库,形成数据分散的架构。
使用API网关或服务网格等技术可以实现数据的聚合和跨服务的数据一致性。
- 容错与弹性:
分布式微服务架构天然支持容错设计,因为单个服务的故障不会影响到整个系统。
负载均衡、断路器模式、重试机制等策略用于增强系统的弹性和可用性。
- 服务注册与发现:
使用服务注册中心(如Eureka、Consul、Nacos)来管理服务的注册和发现。
服务消费者通过注册中心查询服务提供者的地址,实现动态的服务调用。
优势:
技术异构性: 允许使用最适合特定服务的技术栈。
快速响应市场变化: 独立的团队可以更快地开发和迭代服务。
可扩展性: 可以根据需求独立地扩展单个服务。
容错能力强: 提高了系统的整体可用性和稳定性。
挑战:
服务间的通信开销: 增加了系统复杂性和潜在的性能瓶颈。
数据一致性管理: 需要额外的机制来确保跨服务的数据一致性。
分布式事务处理: 分布式系统中的事务处理比单体应用更加复杂。
运维复杂性: 更多的服务意味着更高的运维成本和复杂度。
分布式微服务架构是现代软件开发中越来越流行的选择,它为大型、复杂的应用程序提供了更高的灵活性、可扩展性和可维护性。然而,它也带来了新的挑战和复杂性,需要团队具备相应的技能和经验来有效地实施和管理。
依赖项:
JDK >= 1.8
yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
Mysql >= 5.7.0
yum install https://repo.mysql.com//mysql80-community-release-el7-11.noarch.rpm
yum install mysql-community-server -y
Redis >= 3.0
yum install redis
Maven >= 3.0
yum install maven
nacos >= 2.0.4
wget https://download.nacos.io/nacos-server/nacos-server-2.3.2.zip
#如果下载失败需要自己去官网下载源码包,而后传输到Linux内
#官网下载地址:https://nacos.io/download/release-history/
Node >= 12
yum install nodejs
git
yum install git
npm
yum install npm
第一步:使用git将项目包拉到本地
使用Linux克隆到本地
git clone https://gitee.com/qianxuwang/td-cloud.git
#项目地址
https://gitee.com/qianxuwang/td-cloud/tree/master/
第二步:配置MySQL
初始化MySQL并打开
mysqld --initialize-insecure --user=mysql
systemctl start mysqld
#设置root密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
#授权远程登录
update user set host = '%' where user = 'root';
#刷新权限
flush privileges;
配置MySQL,创建需要的nacos和td项目数据库、创建td用户和nacos用户及密码,并授权远程访问和数据库权限,也可以直接使用root用户
#有条件可以直接使用navicat或者其他管理工具创建
CREATE DATABASE `nacos` CHARACTER SET 'utf8mb3' COLLATE 'utf8mb3_bin';
CREATE DATABASE `ry-cloud` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci';
CREATE USER 'nacos'@'%' IDENTIFIED BY '123456'; #密码根据自己需要设定
CREATE USER 'td'@'%' IDENTIFIED BY '123456'; #密码根据自己需要设定
grant all privileges on *.* to 'nacos'@'%';
grant all privileges on *.* to 'td'@'%';
#刷新权限
flush privileges;
第三步:将项目包内./sql/下的数据库文件导入
mysql -unacos -p123456 nacos < ry-config.sql
mysql -utd -p123456 ry-cloud < ry-cloud.sql
第四步:配置redis
修改redis配置文件
vim /etc/redis.conf
#大约在61行修改为
bind 0.0.0.0
#根据需要设置redis密码,在配置文件480行左右修改为以下内容
requirepass 123456
启动redis
systemctl start redis
第五步:配置本地nacos
将下载的nacos包进行解压
unzip nacos-server-2.3.2.zip #根据自己下载的包执行此条命令
修改nacos配置文件,使其连接数据库
vim nacos/conf/application.properties
#直接将下面复制进配置文件内
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.236.144:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=123456
后台启动nacos
#进入nacos的bin目录
bash startup.sh -m standalone
#如果nacos启动失败,将上述的MySQL配置用户密码改为root的用户密码
第六步:管理nacos内的代码块
浏览器访问 IP:8848/nacos
#`**注意:将内部配置列表内的所有配置都要打开查看,如有redis或者MySQL的要把IP、数据的连接库、连接账号密码修改**`
第七步:*将每一个模块的nacos配置IP改为自己使用的nacos_IP
使用Linux
vim ruoyi-auth/src/main/resources/bootstrap.yml
……
vim ruoyi-gateway/src/main/resources/bootstrap.yml
……
vim ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
……
使用Windows
同上,修改文件内的IP
第八步:在项目包内的主目录下执行以下命令
使用Linux
#进入项目包的主目录执行以下命令
mvn clean package -Dmaven.test.skip=true
nohup java -jar ruoyi-auth/target/ruoyi-auth.jar &> auth.out &
nohup java -jar ruoyi-gateway/target/ruoyi-gateway.jar &> gateway.out &
nohup java -jar ruoyi-modules/ruoyi-system/target/ruoyi-modules-system.jar &> system.out &
#以上命令启动信息都会存放在auth.out、gateway.out、system.out文件内,可以使用tail -f命令实时查看信息
使用Windows
1.运行bin/目录下的package.bat文件
#前提要安装maven软件,参考以下文档
https://blog.csdn.net/m0_53022813/article/details/137148345
2.运行之后将整个项目目录拷贝至Windows(也可以Windows上部署)
第九步:在项目包内的ruoyi-ui/目录内执行以下命令开启项目访问
npm install --registry=https://registry.npmmirror.com
npm run dev
第十步:打包
第九步没有问题后,在项目包ruoyi-ui/目录下执行以下命令进行打包部署
npm run build:prod
第十一步:部署
在第十步执行后会出现dist目录,如果需要单独配置前端需要将此目录压缩至前端服务器
zip -r dist.zip dist #打包
unzip dist.zip #解包
配置nginx来指定该目录为资源文件
建议将nginx主配置文件内的server块注释掉,使用虚拟主机
vim /etc/nginx/conf.d/td.conf
server {
listen 80; #监听端口,根据需要修改
server_name _;
location / {
root /data/dist; #资源目录,根据自己资源目录位置配置
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/; #后端的监听IP和端口,如果未配置就按照8080端口
}
# 避免actuator暴露
if ($request_uri ~ "/actuator") {
return 403;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
部署完毕后开启nginx
systemctl start nginx
第十二步:浏览器访问测试
访问前端服务器 I P : 端口 访问前端服务器IP:端口 访问前端服务器IP:端口