基于consul+nginx的Springboot微服务集部署
consul + nginx 负载均衡
最近做的基于consul的微服务项⽬,仅仅在单机上部署了⼀套,压测的时候扛不住(并发太⾼的时候linux⽂件连接数超过上限),于是想办法搞个集部署。最终在我们的服务器的三台机器(mirage05-mirage07)上完成部署。
⼀. 背景介绍以及项⽬现状
1. consul
我们使⽤的微服务框架consul,其实就是⼀个服务中⼼。微服务在启动的时候将⾃⼰的信息注册到consul(服务注册/服务发现),当外部请求打到⽹关服务时,⽹关直接与consul通信来寻其他服务来转发请求,⽽consul的健康检测防⽌请求转发到故障的服务上⾯。
这⾥其实可以看出,consul其实是⾃带负载均衡的。如果在⼀个consul服务中注册了多个相同的微服务副本,例如注册了多个user-service,那么登陆请求应该就会均匀转发到各个服务上。
⽽我们⽬前只在⼀台机器上部署了⼀个consul服务和⼀套微服务,其实并没有发挥微服务框架的优势。
之前做过的调研,在本地起服务,向服务器上的consul服务注册,最后虽然注册上去服务了,但请求并不会转发到本地服务处理,可能是因为没有使⽤consul集的情况
下,consul不会向陌⽣机器转发请求。(仅仅是猜想,没做过深⼊实验)
单机器注册多个服务副本(详见4.1)
consul服务中的每个实例名必须是唯⼀的,⽽实例名=服务名+端⼝号,所以想要在⼀台机器上起多个服务副本,且都注册到consul中,那就需要不同副本监听不同端⼝。Spring boot服务启动之后监听哪个端⼝是在yaml⾥定义的,所以我们只需要定义多套yaml配置来定义不同的端⼝号监听,然后在起服务的时候,加参数选择不同yaml配置就好了。
consul集(详见4.2)
在多台机器上分别启动consul服务,然后使⽤命令join成⼀个集,最后会选出⼀个Leader,其余都是member。
2. Nginx
可以做负载均衡以及反向代理。
我们在前端服务和后端微服务集间加⼊⼀个Nginx服务来分摊流量,做负载均衡。
nginx和网关怎么配合使用⼆. ⽬标架构
1. ⽬前做法
选取⼏台机器(mirage05-07),分别起consul服务并组成集,并在每台机器上起两套微服务(当然⽹关服务只起⼀个),并在06上起⼀个Nginx,监听8000端⼝,把请求均匀转发到05-07的6001端⼝(gateway服务端⼝)上。
修改前端,将所有请求发到06的8000端⼝,在mirage05机器上部署前端。
2. 讨论
可能看完上⾯的介绍有点晕,为啥consul就能做负载均衡了,还要⽤Nginx。
我认为可以有以下⼏种说法:
1. 从整体架构上看。Nginx是做前端请求到⽬标机器(⽹关服务)间的负载均衡,⽽consul是做请求从⽹关服务转发到某个服务副本的负载均衡
2. 从结构的稳定性看。当然可以只起⼀个consul和⼀个gateway,然后只在⼀台机器上起很多套服务,负载均衡完全交给consul做,但是这样就没完全发挥微服务架构的优势
了,如果机器挂了/进程太多CPU卡了/内存不够等等,那整套系统就挂了。⽽在多台机器上部署集,可以最⼤化利⽤硬件资源,并增强系统稳定性。
三. 实验(为了证明框架有效性及稳定性)
consul健康检测1
1. 在05-07三台机器上部署consul集,其中06上部署两套微服务。
2. 查看06机器上,filesystem-service对应的两个进程,并杀掉其中⼀个
3. 在前端多次操作⽂件系统,⼀切正常
4. 查看后端⽇志,发现consul检测到异常之后,前端请求打到06⽹关之后,只向健康的filesystem-service进程转发请求
consul健康检测2
1. 在05-07三台机器上部署consul集,其中05上仅部署⼀套微服务。
2. 杀掉05机器上的filesystem-service进程
3. 在前端多次操作⽂件系统,在⼀次异常(⽩屏)后,⼀切正常
4. 再次启动05上的filesystem-service
5. 前端多次操作⽂件系统,⼀切正常
6. 查看05的filesystem-service⽇志,发现有请求打过来
推测⽹关+consul有转发的优先级,优先向本机注册的⽬标服务转发请求(通信开销⼩),当本机的注册的⽬标服务全部挂掉后(可能会发⼀次请求确认,导致前端⽩屏,因为ls 接⼝返回了null),才会将请求转发到其他机器上处理。
四. 详细做法
1. 修改yaml配置,起多服务副本监听不同端⼝(以example-service为例)
# 这是全局配置,这⾥表明默认选择名为pro的配置
spring:
profiles:
active: pro
# ⽤三个横线分割不同配置,当然也可以放到不同的yaml⽂件中
---
spring:
profiles: pro # profiles属性代表配置的名称
logging:
config: l
server:
port: 7001
-
--
spring:
profiles: backup
logging:
config: l
server:
port: 7002
配置中除了设置不同的端⼝,也设置了不同的log4j配置,使得不同服务副本存储的⽇志⽂件分离。这样的话,服务器上启动服务的时候⽤以下两条命令启动两个example-service
服务,分别监听7001、7002端⼝,并且分别⽣成不同名称的⽇志,便于查看。
nohup java -jar example-service/target/example-service-0.0.1-SNAPSHOT.jar&
nohup java -jar example-service/target/example-service-0.0.1-SNAPSHOT.jar --spring.profiles.active=backup&
2. consul集部署
集部署可以参考
这⾥以05-07机器部署为例(默认consul已经下载、解压、放置到/usr/local/bin⽬录下,可直接执⾏)
mirage-05启动consul
nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=mirage-05 -bind=mirage-05 -client=0.0.0.0 -datacenter=dssc -ui&
mirage-06启动consul
nohup consul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node mirage-06 -bind=mirage-06 -client=0.0.0.0 -datacenter=dssc -ui&
mirage-07启动consul
nohup consul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node mirage-07 -bind=mirage-07 -client=0.0.0.0 -datacenter=dssc -ui&
参数解释:
server:以server⾝份启动。默认是client
bootstrap-expect:集要求的最少server数量,当低于这个数量,集即失效。
data-dir:data存放的⽬录,更多信息请参阅consul数据同步机制
node:节点id,集中的每个node必须有⼀个唯⼀的名称。默认情况下,Consul使⽤机器的hostname
bind:监听的ip地址。默认绑定0.0.0.0,可以不指定。表⽰Consul监听的地址,⽽且它必须能够被集中的其他节点访问。Consul默认会监听第⼀个private IP,但最好还是提供⼀个。⽣产设备上的服务器通常有好⼏个⽹卡,所以指定⼀个不会出错client: 客户端的ip地址,0.0.0.0是指谁都可以访问(不加这个,下⾯的ui :8500⽆法访问)
ui: 可以访问UI界⾯
-config-dir指定配置⽂件夹,Consul会加载其中的所有⽂件
-datacenter 指定数据中⼼名称,默认是dc1
此时机器上分别起了consul服务,但还未组成集,不能正常⼯作。
分别在06、07机器上输⼊命令
consul join mirage-05
很快将选出⼀个Leader,输⼊命令查看
consul operator raft list-peers
Node ID Address State Voter RaftProtocol
10.105.222.246 e9444b79-2df9-a641-8512-fec7540ac00e 10.105.222.246:8300 leader true 3
10.105.222.247 b13a9221-5f71-075d-804c-726c79a9e77f 10.105.222.247:8300 follower true 3
10.105.222.245 9de9c7f8-b547-ab52-e174-23445dd59189 10.105.222.245:8300 follower true 3
3. Nginx配置
⽬前已经在06上部署了⼀台Nginx服务
安装步骤
1. 下载压缩包 wget /download/nginx-1.18.
2. 解压 tar -zxvf nginx-1.18.
3. 进⼊解压⽬录 cd nginx-1.18.
4. 检查配置⽂件是否⽣效 ./configure
5. 编译 make -j4
6. 安装依赖 make install (这步之后在/usr/local⽬录下会⽣成⼀个nginx⽬录)
7. 进⼊/usr/bin/的⽬录下 cd /usr/bin
8. 创建快捷⽅式 ln -s /usr/local/nginx/sbin/nginx nginx
9. 直接输⼊nginx启动
10. 浏览器输⼊localhost查看,如果能看到nginx提⽰页⾯,说明启动成功
负载均衡配置(使nginx服务监听8000端⼝,并把请求转发到05-07的6001端⼝)
1. 进⼊配置⽂件⽬录 cd /usr/local/nginx/conf
2. f
3. 修改配置
http {
upstream backend { //这⾥定义了三台机器的gateway地址
server mirage-05:6001;
server mirage-06:6001;
server mirage-07:6001;
}
server {
listen 8000; //监听的端⼝
server_name 127.0.0.1; // 表⽰监听的是本机器
location / { // 这⾥表⽰任何url都转发
proxy_pass backend; // 这⾥是转发的⽬的ip,和上边定义的⼀致
}
}
}
4. 热重启,配置⽣效 nginx -s reload
4. 新机器加⼊集步骤
1. 安装consul,并join⼊集
2. 拉下来后端项⽬,脚本启动
3. 修改Nginx配置,在upstream backend中加⼊新机器gateway地址
五. 未来计划
1. 压测
测试下HDFS请求在被多机器分担后,还会不会⽂件连接超出
感觉之后系统性能瓶颈可能就不在微服务上了,可能就在Spark和hdfs、mongoDb上了
根据压测结果来决定微服务集规模
2. 加⼊⽇志报警系统
初步考虑Sentry
监控Error级别⽇志,可以及时发现服务的BUG
在服务挂(短时间⼤量5xx)之后可以及时发邮件/企业给对应的维护⼈员进⾏处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论