项目架构原理:

用户使用手机端或电脑端访问前端程序,前端程序来调用服务端的服务接口,前端一般是在客户端完成的,处理数据,渲染数据,服务端提供一个统一的接口(负载均衡提供的统一接口)供前端去调用,接下来到网关,网关不是网络的网关,它是一个反向的路由,例如使用nginx做反向代理网关,那么nginx(API接口)作用是为后端微服务提供一个统一的入口,来实现不同的功能,不单是路由功能,还有安全认证,限流,负载均衡等功能,那么请求来到网关会帮你转发到后端的微服务,它帮你转发的时候,会去请求注册中心(集中管理每个微服务实例IP)里面的微服务,这个微服务下有哪些实例IP,拿到之后根据自己的调度算法帮你转发到其中的一个微服务实例IP,然后微服务都会调用后端的数据库(数据库,分布式存储),存储用户的相关信息。配置中心呢,是集中管理每个微服务相关的配置文件。

为什么要用注册中心呢?(主流注册中心:eureka, consul, nacos)

1.集中帮你记录每个微服务对应的多副本实例IP,像每个微服务都有很多实例IP

2.实现对每个微服务对应的多副本实例IP负载均衡

3.保证对每个微服务对应的多副本实例IP的一个可用性,通过基本的健康检查功能实现


eureka服务内部的一个调用:

每个微服务实例启动之后都会注册到注册中心,首先,一个用户浏览一个商品,加入了购物车,准备支付,那么支付服务请求去eureka服务端查询这个微服务对应哪些实例IP,然后将请求转发其中的一个实例IP上提供服务。


服务器IP 端口 服务 用途
192.168.0.11
192.168.0.12
192.168.0.13
8888 eureka 注册中心
192.168.0.11 3306
---------------------------------
80
mariadb
---------------------------------
nginx
数据库
---------------------------------
负载均衡器
192.168.0.12
192.168.0.13
8010
---------------------------------
8020
---------------------------------
8030
---------------------------------
8080
---------------------------------
9999
product
---------------------------------
order
---------------------------------
stock
---------------------------------
portal
---------------------------------
gateway
商品服务
---------------------------------
订单服务
---------------------------------
库存服务
---------------------------------
前端
---------------------------------
网关
                                                项目环境信息表

192.168.0.11

1.部署jdk maven环境
2.拷贝源码包到服务器上解压
3.修改源码相关的配置文件以及相关连接数据库的地址用户名密码
添加eureka注册地址
http://192.168.0.11:8888/eureka/,http://192.168.0.12:8888/eureka/,http://192.168.0.13:8888/eureka/
4.配置eureka集群,修改配置文件打成jar包,添加工作目录mkdir /data/ms/eureka -p ,将jar移动到工作目录,
生成systemd service 配置文件,并启动服务,然后将jar包推送到另两台服务器
mvn clean package -Dmaven.test.skip
#生成systemd service 配置文件
cat > /usr/lib/systemd/system/eureka.service << EOF
[Unit]
Description=Eureka
Documentation=eureka
[Service]
ExecStart=/usr/local/jdk/bin/java -jar /data/ms/eureka/eureka-service.jar
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

#查看是否启动相关的服务
jps -l
5.批量拷贝文件(eureka jar包)
for ip in 192.168.0.12 192.168.0.13;do
scp eureka-service/target/eureka-service.jar root@$ip:/data/ms/eureka
done
批量拷贝文件(product order stock jar包)
for ip in 192.168.0.12 192.168.0.13;do
for name in product order stock ;do
scp $name-service/$name-service-biz/target/$name-service-biz.jar root@$ip:/data/ms/$name
done
done
批量拷贝文件(portal gateway jar包)
for ip in 192.168.0.12 192.168.0.13;do
for name in portal gateway;do
scp $name-service/target/$name-service.jar root@$ip:/data/ms/$name
done
done
6.安装Mariadb数据库:
yum install mariadb-server
systemctl start mariadb
systemctl enable mariadb
mysqladmin -uroot password '123456'
创建一个账号并授权,该账户用于微服务连接:
grant all on *.* to 'ms'@'%' identified by '123456';
将源代码目录里sql文件拷贝到数据库服务器并导入:
mysql -uroot –p

mysql> create database tb_stock;
mysql> use tb_stock;
mysql> source /root/simple-microservice/db/stock.sql

mysql> create database tb_product;
mysql> use tb_product;
mysql> source /root/simple-microservice/db/product.sql

mysql> create database tb_order;
mysql> use tb_order;
mysql> source /root/simple-microservice/db/order.sql

7.安装nginx
[root@localhost yum.repos.d]# cat nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

修改配置nginx虚拟目录文件
[root@localhost ~]# cat /etc/nginx/conf.d/default.conf
upstream gateway {
server 192.168.0.12:9999;
server 192.168.0.13:9999;
}
server {
listen 80;
server_name gateway.ctnrs.com;
access_log /var/log/nginx/gateway-access.log main;
location / {
proxy_pass http://gateway;
}
}
upstream portal {
server 192.168.0.12:8080;
server 192.168.0.13:8080;
}
server {
listen 80;
server_name portal.ctnrs.com;
access_log /var/log/nginx/portal-access.log main;
location / {
proxy_pass http://portal;
}
}
重启nginx服务,对外访问


192.168.0.12 192.168.0.13

1.部署jdk环境
2.创建工作目录
mkdir /data/ms/{product,order,stock,eureka,gateway,portal} -p
3.批量生成systemd service 配置文件(gateway portal eureka)

for name in eureka gateway portal ;do
cat > /usr/lib/systemd/system/$name.service << EOF
[Unit]
Description=$name
Documentation=$name
[Service]
ExecStart=/usr/local/jdk/bin/java -jar /data/ms/$name/$name-service.jar
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
done

批量生成systemd service 配置文件(product order stock)
for name in product order stock;do
cat > /usr/lib/systemd/system/$name.service << EOF
[Unit]
Description=$name
Documentation=$name
[Service]
ExecStart=/usr/local/jdk/bin/java -jar /data/ms/$name/$name-service-biz.jar
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
done

4.批量启动服务并加入开机自启(product order stock gateway portal eureka)
for name in eureka product order stock gateway portal;do
systemctl start $name
systemctl enable $name
done

5.查看是否启动相关的服务
jps -l

如果遇到访问nginx报错502,可能是selinux权限问题。

setenforce 0