【分布式集群】微服务电商应用系统的集群构建

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 基于Spring系列的框架开发的微服务业务站点在当下应该是最流行的开发模式之一,通过一系列分布式高可用的系统架构,我们将完成对电商应用的构建部署。

 

基于Spring系列的框架开发的微服务业务站点在当下应该是最流行的开发模式之一,通过一系列分布式高可用的系统架构,我们将完成对电商应用的构建部署。

下面是我们这次完成项目构建的整体架构,首先由Nginx实现用户访问的前端,并且由它来完成后端程序的负载均衡;其次我们的微服务将同时运行在两台独立的云主机上,利用nginx负载流量;数据库的方案采用Mairadb的主从架构,并且添加了Mycat作为数据库读写分离的中间件,将数据的写入交给主数据库,数据的读取交给从数据库,分担了对数据的读写压力,redis负责数据缓存;同时构建了Zookeeper+Kafka的分布式系统集群,为系统提供分布式一致性并且高可用的业务集群。

 

image.png

 

 

我们的整套系统将部署在私有云环境下,在云平台上创建10台云主机,云主机运行在不同的计算节点中,对应计算节点有不同的分类。具体如下。

image.png

 

 

一、数据库服务构建

使用两台云主机部署Mariadb数据库,并完成数据库的主从配置,提高库的安全冗余性。

使用一台云主机部署 Mycat 数据库中间件服务,将用户提交的读写操作识别分发给相应的数据库节点。

这样将用户的访问操作,数据库的读与写操作分给 3 台主机,只有数据库集群的主节点接收增、删、改 SQL 语句,从节点接收查询语句,分担了主节点的查询压力。

image.png

1.Mariadb数据库主从

(1)安装 MariaDB 服务

yum install -y mariadb mariadb-server
 systemctl start mariadb&&systemctl enable mariadb

(2)初始化 MariaDB 数据库

在 db-master 和 db-slave 云主机上初始化 MariaDB 数据库,设置 MariaDB 数据库root 用户密码

[root@db-master ~]# mysql_secure_installation
root user without the proper authorisation. Set root password? [Y/n] y
New password: 
Re-enter new password:

 

(3)配置数据库基础设置

编辑两个节点的数据库配置文件 my.cnf,在配置文件my.cnf 中增添下面的内容。

[root@db-master ~]# cat /etc/my.cnf
[mysqld]
log_bin = mysql-bin 
binlog_ignore_db = mysql 
server_id = 27  //id不同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
[root@db-master ~]# systemctl restart mariadb
[root@db-slave ~]# cat /etc/my.cnf
[mysqld]
log_bin = mysql-bin 
binlog_ignore_db = mysql 
server_id = 30  //id不同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
[root@db-slave ~]# systemctl restart mariadb


//

 

 

(4)开放主节点的数据库权限

在主节点db-master 上使用 mysql 命令登录 MariaDB 数据库,授权业务对接所需要的用户。

[root@db-master ~]# mysql -uroot -p密码
MariaDB [(none)]> grant all privileges on *.* to mall@'192.168.1.%' identified by "密码";

在主节点数据库上创建一个 user 用户让从节点连接,并赋予从节点同步主节点数据库的权限,命令如下。

MariaDB [(none)]> grant replication slave on *.* to 'user'@'db-slave' identified by '密码';

 

(5)配置从节点 db-slave同步主节点 db-master

在从节点 db-slave 上使用 mysql 命令登录 MariaDB 数据库,配置从节点连接主节点的连接信息。

[root@db-slave ~]# mysql -uroot -p123456
MariaDB [(none)]> change master to master_host='db-master',master_user='user',master_password='密码';

配置完毕主从数据库之间的连接信息之后,开启从节点服务。使用show slave status\G;

命令并查看从节点服务状态, Slave_IO_Running 和 Slave_SQL_Running 的状态都为YES

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;

image.png

 

6)创建业务库并导入结构

MariaDB [(none)]> create database gpmall;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> use gpmall
Database changed
MariaDB [gpmall]> source MallData.sql

 

 

2.Mycat中间件读写分离

(1)安装 Mycat 服务

安装jdk环境,并把下载好的Mycat安装包解压。

[root@mycat ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@mycat ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C/usr/local/

在/etc/profile 系统变量文件中添加 Mycat 服务的系统变量,并生效变量。

[root@mycat ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
[root@mycat ~]# source /etc/profile

 

(2)编辑 Mycat 的逻辑库配置文件

配置 Mycat 服务读写分离的 schema.xml 配置文件在/usr/local/mycat/conf/目录下。

在文件中定义一个逻辑库schema,name 为 USERDB,使用户可以通过 Mycat 服务管理该逻辑库对应的MariaDB数据库。设置数据库写入节点为主节点master;设置数据库读取节点为从节点 slave

[root@mycat ~]# chown root:root /usr/local/mycat/conf/schema.xml
[root@mycat ~]# cat /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="master的ip:3306" user="root" password="密码">
<readHost host="hostS1" url="slave的ip:3306" user="root" password="密码" />
</writeHost>
</dataHost>
</mycat:schema>

 

这里再说一下mycat中间件负载均衡的几个模式:

balance="0":不启用读写分离

balance="1":全部的 Host 参与负载均衡,需要做多主

balance="2":所有读操作都随机的在 writeHost、readhost 上执行

balance="3":所有读请求随机地分发到 wiriterHost 对应的 readhost 执行

 

 

3)编辑 mycat 的访问用户

修改/usr/local/mycat/conf/目录下的 server.xml 文件,修改 root 用户的访问密码与数据库,访问 Mycat 的逻辑库为 USERDB.

[root@mycat ~]# cat /usr/local/mycat/conf/server.xml
在配置文件的最后部分
<user name="root">
<property name="password">密码</property>
<property name="schemas">USERDB</property>

 

4)启动 Mycat 服务

通过命令启动 Mycat 数据库中间件服务,如有开放 8066 和 9066 端口,则表示 Mycat 服务开启成功

[root@mycat ~]# /bin/bash /usr/local/mycat/bin/mycat start

image.png

 

二、Zookeeper集群构建

本系统使用到了Zookeeper+kafka分布式系统,Zookeeper 将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

分布式应用可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

 

image.png

(1)在三个zk云主机中安装 JDK 环境并上传zookeeper软件包

3 个节点安装 Java JDK 环境,3 个节点均执行命令如下:

# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# tar -zxvf zookeeper-3.4.14.tar.gz

 

(3)修改 3 个节点配置文件

在每个zk节点,进入 zookeeper-3.4.14/conf 目录下,修改zoo_sample.cfg 文件为zoo.cfg

[root@zookeeper1 conf]# vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
server.1=192.168.1.33:2888:3888
server.2=192.168.1.34:2888:3888
server.3=192.168.1.35:2888:3888

 

这项配置server.id=host:port1:port2

其中 id 为一个数字,表示 zk 进程的id,这个id 也是dataDir目录下 myid 文件的内容。host 是该 zk 进程所在的 IP 地址,port1 表示follower 和leader 交换消息所使用的端口,port2 表示选举 leader 所使用的端口。

 

 

(4)创建 myid 文件

在 3 台节点的dataDir 目录(此处为/tmp/zookeeper)下,分别创建一个myid 文件,

[root@zookeeper1 ~]# mkdir /tmp/zookeeper
# vi /tmp/zookeeper/myid
# cat /tmp/zookeeper/myid

1、23,每个节点不同

 

(5)启动 ZooKeeper 服务

在 3 台机器的 zookeeper-3.4.14/bin 目录下执行命令如下:

# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zookeeper1bin]# ./zkServer.sh status
Mode: leader
[root@zookeeper2bin]# ./zkServer.sh status
Mode: follower
[root@zookeeper3 bin]# ./zkServer.sh status
Mode: follower

检查zk集群的状态,zk1leader,其他两个节点为follower

 

 

三、Kafka集群构建

 

使用 ZooKeeper 集群搭建的 3 个节点来构建 Kafka 集群,因为Kafka 服务依赖于ZooKeeper 服务。

 

(1)在三个zk云主机中安装上传 Kafka 软件包

# tar -zxvf kafka_2.11-1.1.1.tgz

 

(2)修改 3 个节点配置文件

进入 kafka_2.11-1.1.1/config 目录下,编辑server.properties 文件

# vim server.properties
broker.id=1
zookeeper.connect=192.168.1.33:2181,192.168.1.34:2181,192.168.1.35:2181
listeners = PLAINTEXT://192.168.1.33:9092

 

修改配置内容

broker.id:每个节点区分一下

zookeeper.connect:有 3 台 ZooKeeper 服务器,这里设置为 3

listeners:设置监听地址

 

(3)启动服务

在 三个节点中,进入 kafka_2.11-1.1.1/bin 目录下,启动服务命令

# ./kafka-server-start.sh -daemon ../config/server.properties

 

(4)测试服务

zk1节点,进入 kafka_2.11-1.1.1/bin 目录下,创建 topic 命令如下

Zk1节点:

[root@zookeeper1 bin]# ./kafka-topics.sh --create --zookeeper 192.168.1.33:2181
--replication-factor 1 --partitions 1 --topic testzk
Created topic "testzk".

在任意启动的机器 kafka_2.11-1.1.1/bin 的目录中执行命令,同样输出test内容

Zk2节点:

[root@zookeeper2 bin]# ./kafka-topics.sh --list --zookeeper 192.168.1.34:2181
testzk

Zk3节点:

[root@zookeeper3 bin]# ./kafka-topics.sh --list --zookeeper 192.168.1.35:2181
testzk

测试完成

 

四、Redis服务构建

(3)安装 Redis 服务

[root@redis ~]# yum install redis -y

 

(4)启动 Redis 服务

修改 Redis 配置文件,编辑/etc/redis.conf 文件

bind 192.168.1.36
protected-mode no
requirepass redis密码
[root@redis ~]# systemctl start redis&&systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to/usr/lib/systemd/system/redis.service.

 


检查 Redis 服务启动, 6379 端口正常监听

[root@redis ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN1065/redis-server *

 

 

五、微服务Jar包运行环境构建

后端业务

(3)安装 Java 环境

两个jar节点安装openjdk环境来运行jar

[root@jar1 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@jar2 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

 

(2)运行 jar 包

将构建打包好的四个jar包上传至jar1,jar2两台云主机,执行后台运行

# nohup java -jar Prj-shopProvider.jar &
# nohup java -jar Prj-countProvider.jar &
# nohup java -jar Prj-shopper.jar &
# nohup java -jar Prj-user.jar &

 

 

六、前端Nginx负载均衡构建

用户访问由nginx提供,nginx通过反向代理后端服务IP端口,处理HTTP请求,负载分流到后端服务器上

image.png

 

1)安装 Nginx 服务

登录 Nginx 节点,安装 Nginx 服务,将 dist 前端页面上传至 Nginx 节点

[root@nginx ~]# yum install nginx -y

 

2)修改 Nginx 配置文件

修改 Nginx 配置文件/etc/nginx/conf.d/default.conf ,添加三个后端服务的负载均衡,并设置proxy

upstream pageuser {
  server 192.168.1.37:8082;
  server 192.168.1.38:8082;
  ip_hash;
}
upstreampageshopping {
  server 192.168.1.37:8081;
  server 192.168.1.38:8081;
  ip_hash;
}
upstreampagecashier {
  server 192.168.1.37:8083;
  server 192.168.1.38:8083;
  ip_hash;
}
server {
  listen 80;
  server_name localhost;
  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
}
location /user {
  proxy_pass http://pageuser;
}
location /shopping {
  proxy_pass http://pageshopping;
}
location /cashier {
  proxy_pass http://pagecashier;
}

4)启动 Nginx 服务

nginx 节点,启动 Nginx 服务

[root@nginx ~]# systemctl start nginx&& systemctl enable nginx

 

 

 

七、电商应用系统访问测试

首页,访问效果

 

image.png

 

农产品详情页访问

 

image.png

 

 

用户注册功能测试,数据库连接与写入无误

 

image.png

 

 

用户登陆测试

 

image.png

 

订单提交测试,后端无误

 

image.png

 

 

 

 

 

 

相关文章
|
3月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
740 3
|
7月前
|
Kubernetes 大数据 调度
Airflow vs Argo Workflows:分布式任务调度系统的“华山论剑”
本文对比了Apache Airflow与Argo Workflows两大分布式任务调度系统。两者均支持复杂的DAG任务编排、社区支持及任务调度功能,且具备优秀的用户界面。Airflow以Python为核心语言,适合数据科学家使用,拥有丰富的Operator库和云服务集成能力;而Argo Workflows基于Kubernetes设计,支持YAML和Python双语定义工作流,具备轻量化、高性能并发调度的优势,并通过Kubernetes的RBAC机制实现多用户隔离。在大数据和AI场景中,Airflow擅长结合云厂商服务,Argo则更适配Kubernetes生态下的深度集成。
884 34
|
2月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
3月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
229 2
|
3月前
|
机器学习/深度学习 算法 安全
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
140 3
|
5月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
183 1
分布式新闻数据采集系统的同步效率优化实战
|
7月前
|
人工智能 搜索推荐 前端开发
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
本文分享了使用CodeBuddy最新版本的深度体验,重点探讨了Craft智能体、MCP协议和DeepSeek V3三大功能。Craft实现从对话到代码的无缝转化,大幅提升开发效率;MCP协议打通全流程开发,促进团队协作;DeepSeek V3则将代码补全提升至新境界,显著减少Bug并优化跨语言开发。这些功能共同塑造了AI与程序员共生的未来模式,让编程更高效、自然。
715 15
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
668 6
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
314 1

热门文章

最新文章