Spring Cloud+docker实现微服务负载均衡
网上关于微服务实现负载均衡有不同的实现方式,有用ribbon,也有用zuul的,本文用zuul来实现
一般也称Spring Cloud Zuul为微服务中的网关服务
微服务主要包含注册与发现服务,路由服务(网关服务),配置服务,熔断服务,降级服务等一系列的服务.
我们用注册与发现服务,路由服务,应用App来搭建一个比较简单的实现负载均衡的微服务
下面开始实现微服务负载均衡
1,搭建注册与发现服务
直接到https://start.spring.io上创建SpringBoot项目,如下图
然后把项目导入eclipse之后,在pom.xml文件中添加相关的jar包,如下
然后在Application启动类中添加注解,如下
然后在配置文件application.yml(application.properties)中添加,如下
注意,如果是application.yml文件,则要留意里面的缩进都是以2个空格键来的,不是以tab键
到此,注册与发现服务就搭建好了,运行项目,浏览器输入localhost:9999,如下
我们的注册与发现服务已经运行起来了,上图中红框内的内容表示发现并注册的服务,目前还没有服务注册进去,所以是空的
2,搭建一个叫microsoftA的应用App
一样到https://start.spring.io创建SpringBoot项目,导入到eclipse后修改pom.xml,如下
然后就是application启动类,如下
注意:这里不是@SpringBootApplication,而是@SpringCloudApplication
@SpringCloudApplication注解整合了以下多个注解:
@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker等
接着配置文件application.properties,如下
新建一个controller,写一个接口,如下
然后把这个应用App运行起来,这个时候再看下我们之前的注册与发现服务页面,如下
如上所示,我们的microsoftA应用已经注册了,我们访问刚才写的接口,如下
3,搭建一个叫microsoftB的应用App
按照步骤2再新建一个项目,在配置文件里添加如下内容
也新建一个controller,如下
然后运行起来,再看**册与发现页面,如下
修改下microsoftA的接口,如下
访问接口,如下
4,搭建网关服务
同样在https://start.spring.io新建项目,导入eclipse,修改pom.xml如下
修改application启动类,如下
修改配置文件,如下
如上所示,path和serviceId实现了反向代理,那是负载均衡是如何实现的呢
我们按照之前的步骤在新建一个microsoftC应用,修改配置文件,如下
如上所示,除了端口外,其他的配置都跟microsoftB一模一样的,然后运行,再看看注册与服务页面,如下
上图所示,新增了网关服务,还有一个端口为6000的microsoftB服务
注册与发现服务会把注册名称相同的服务归到一起,Spring Cloud Zuul网关服务,在做反向代理的时候如果发现该服务名称下面
有多个端口的服务,则会挑选其中一个来访问
在刚才访问microsoftA服务接口的页面修改下接口地址,如下
如上所示,我们访问的网关的端口,返回的依然是microsoftB服务接口返回的信息
我们再回到microsoftA服务的controller改下访问microsoftB服务的接口地址,如下
这里也要换成网关的端口,多次访问microsoftA服务的接口,如下所示
这个时候微服务已经通过负载均衡来返回数据了
5,build成docker镜像
把上面几个项目的配置文件都加上以下内容
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=服务器的IP:端口
不加这两句的话微服务之间会无法访问,因为docker做了环境隔离
然后把jar包打成docker镜像,具体让发可以参考
http://blog.****.net/wsbgmofo/article/details/79088186
打成镜像后把每个镜像run成容器运行起来,然后按照上面的步骤把localhost换成服务器地址端口即可
这里有个问题,如果要用build成功的镜像run多个容器出来,需要设置对应的端口参数
Dockerfile如下
run容器的时候,输入以下命令
docker run -d -e PARAMS="-Dserver.port=3000 -Deureka.instance.instance-id=xxx:xxx:xxx:xxx:3000" -p 3000:3000 microsoft-d
这样就可以run多个不同端口的容器注册到微服务中