Fork me on GitHub

Springboot 框架 gateway 前后端分离 实现 zuul Ribbon 负载均衡 脱离Eureka实现

项目后台框架是使用的springboot ,前端使用的是angularJS,中间使用gateway做一层转发。其实也是微服务的思想。那么在gateway这层怎么实现负载均衡。就使用到了zuul,那么可以使用zuul 的Ribbon来实现负载均衡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
zuul:
host:
connect-timeout-millis: 5000
socket-timeout-millis: 20000
routes:
platform-service:
path: /api/**
url: http://localhost:8010
stripPrefix: false
sensitiveHeaders:
image-detect-service:
path: /ids/**
url: http://localhost:8011
stripPrefix: false
sensitiveHeaders:

这个是我们项目原先做了一个配置。主要是zuul实现转发(未使用Ribbon,未使用Eureka),其中routes下面的 platform-service和image-detect-service是后台的两个独立的项目,他们的RestApi路径使用了不同的标识(这是我们自己定义的规范)。反正实现的效果就是,如果路径是api开头就转发到8010端口,如果是路径是/ids开头那么就转发到8011端口另外一个项目。重写了zuul中的pro前置过滤器能够实现。

接下来实现负载均衡 (接下来我们只对platform-service这个项目进行负载均衡)

首先我们将platform-service这个项目启用两个不同的端口发布起来

先在idea中dev.yml将server:port 修改为8012通过mvn clean compile install -DskipTests将项目编译,然后再target文件夹,将war包拷贝出来,在war包这个文件夹打开cmd命令行,执行 java -jar xxx.war发布 ,然后再在idea中奖port修改为8010,通过idea发布。这样platform-service就在8010和8012发布起来了。

修改配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
zuul:
host:
connect-timeout-millis: 5000
socket-timeout-millis: 20000
routes:
platform-service:
path: /api/**
# url: http://localhost:8010 //注释掉这个url
stripPrefix: false
sensitiveHeaders:
image-detect-service:
path: /ids/**
url: http://localhost:8011
stripPrefix: false
sensitiveHeaders:

platform-service: //添加服务配置
ribbon:
listofServers: http://localhost:8010,http://localhost:20001

ribbon:
eureka:
enabled: false //声明不依赖eureka

添加的配置 platform-service 是和zuul:rotes:platform-service中同名的。 listOfServices是platfor-service项目的服务列表地址和端口,多个的话使用,将其分割。

ribbon:eureka:enabled:false这个设置的是禁用eureka。

现在就ok了,启动项目访问测试,会发现调用不同的端口访问platform-service,也可以将8010的端口关闭,它会直接去访问8012端口的项目,这就是ribbon实现负载均衡和nginx实现的负载均衡不一样,如果是nginx实现的,如果你upstream的服务宕机了,那么不会自动的去寻找下一个服务。这时候ribbon默认的启动的策略是RoundRobinRule 也就是轮询策略。

我也是最近在研究ribbon负载均衡和集群.现在能够实现负载均衡了。那么在接下来我们在研究怎么去更换策略,如何使用自定义策略实现 “同一个ip下的同一个用户的所有请求被代理到同一个实例”,在接下来的研究中,我会在后面慢慢分享

相关文章