Spring Cloud+docker实现微服务负载均衡

网上关于微服务实现负载均衡有不同的实现方式,有用ribbon,也有用zuul的,本文用zuul来实现

Spring Cloud+docker实现微服务负载均衡

一般也称Spring Cloud Zuul为微服务中的网关服务

微服务主要包含注册与发现服务,路由服务(网关服务),配置服务,熔断服务,降级服务等一系列的服务.

我们用注册与发现服务,路由服务,应用App来搭建一个比较简单的实现负载均衡的微服务

下面开始实现微服务负载均衡

1,搭建注册与发现服务

直接到https://start.spring.io上创建SpringBoot项目,如下图

Spring Cloud+docker实现微服务负载均衡

然后把项目导入eclipse之后,在pom.xml文件中添加相关的jar包,如下

Spring Cloud+docker实现微服务负载均衡

然后在Application启动类中添加注解,如下

Spring Cloud+docker实现微服务负载均衡

然后在配置文件application.yml(application.properties)中添加,如下

Spring Cloud+docker实现微服务负载均衡

注意,如果是application.yml文件,则要留意里面的缩进都是以2个空格键来的,不是以tab键

到此,注册与发现服务就搭建好了,运行项目,浏览器输入localhost:9999,如下

Spring Cloud+docker实现微服务负载均衡

我们的注册与发现服务已经运行起来了,上图中红框内的内容表示发现并注册的服务,目前还没有服务注册进去,所以是空的

2,搭建一个叫microsoftA的应用App

一样到https://start.spring.io创建SpringBoot项目,导入到eclipse后修改pom.xml,如下

Spring Cloud+docker实现微服务负载均衡

然后就是application启动类,如下

Spring Cloud+docker实现微服务负载均衡

注意:这里不是@SpringBootApplication,而是@SpringCloudApplication

@SpringCloudApplication注解整合了以下多个注解:

@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker等

接着配置文件application.properties,如下

Spring Cloud+docker实现微服务负载均衡

新建一个controller,写一个接口,如下

Spring Cloud+docker实现微服务负载均衡

然后把这个应用App运行起来,这个时候再看下我们之前的注册与发现服务页面,如下

Spring Cloud+docker实现微服务负载均衡

如上所示,我们的microsoftA应用已经注册了,我们访问刚才写的接口,如下

Spring Cloud+docker实现微服务负载均衡

3,搭建一个叫microsoftB的应用App

按照步骤2再新建一个项目,在配置文件里添加如下内容

Spring Cloud+docker实现微服务负载均衡

也新建一个controller,如下

Spring Cloud+docker实现微服务负载均衡

然后运行起来,再看**册与发现页面,如下

Spring Cloud+docker实现微服务负载均衡

修改下microsoftA的接口,如下

Spring Cloud+docker实现微服务负载均衡

访问接口,如下

Spring Cloud+docker实现微服务负载均衡

4,搭建网关服务

同样在https://start.spring.io新建项目,导入eclipse,修改pom.xml如下

Spring Cloud+docker实现微服务负载均衡

修改application启动类,如下

Spring Cloud+docker实现微服务负载均衡

修改配置文件,如下

Spring Cloud+docker实现微服务负载均衡

如上所示,path和serviceId实现了反向代理,那是负载均衡是如何实现的呢

我们按照之前的步骤在新建一个microsoftC应用,修改配置文件,如下

Spring Cloud+docker实现微服务负载均衡

如上所示,除了端口外,其他的配置都跟microsoftB一模一样的,然后运行,再看看注册与服务页面,如下

Spring Cloud+docker实现微服务负载均衡

上图所示,新增了网关服务,还有一个端口为6000的microsoftB服务

注册与发现服务会把注册名称相同的服务归到一起,Spring Cloud Zuul网关服务,在做反向代理的时候如果发现该服务名称下面

有多个端口的服务,则会挑选其中一个来访问

在刚才访问microsoftA服务接口的页面修改下接口地址,如下

Spring Cloud+docker实现微服务负载均衡

如上所示,我们访问的网关的端口,返回的依然是microsoftB服务接口返回的信息

我们再回到microsoftA服务的controller改下访问microsoftB服务的接口地址,如下

Spring Cloud+docker实现微服务负载均衡

这里也要换成网关的端口,多次访问microsoftA服务的接口,如下所示

Spring Cloud+docker实现微服务负载均衡

Spring Cloud+docker实现微服务负载均衡

这个时候微服务已经通过负载均衡来返回数据了

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如下

Spring Cloud+docker实现微服务负载均衡

run容器的时候,输入以下命令

docker run -d -e PARAMS="-Dserver.port=3000 -Deureka.instance.instance-id=xxx:xxx:xxx:xxx:3000" -p 3000:3000 microsoft-d

这样就可以run多个不同端口的容器注册到微服务中