利用Spring Cloud实现微服务(五)- 负载均衡

1. 负载均衡架构介绍


在Spring Cloud框架中,负载均衡服务本身也要作为一个发现客户端注册到Eureka服务器上。客户发起一个请求时,需要在Eureke服务器上发现负载均衡服务,负载均衡服务通过RestTemplate调用微服务的接口时,会通过Ribbon进行负载均衡。这样,不同的服务请求会由负载均衡机制分别调用微服务的不同实例。

本次示例中,启动两个bookingcar-service微服务实例,端口分别为:2227,2228,负载均衡服务loadbalance-service实例的端口为2288。

2. 代码实现

2.1在bookingcar-service里添加负载均衡测试接口

由于实例和端口是绑定的,如果端口不同,我们可以认为负载均衡调用了不同的实例来响应服务请求。为验证负载均衡,我们希望能看到被调用的bookingcar-service微服务实例的端口信息。

负载均衡验证接口的端点:http://…/v1/lbtest/port,返回该实例的端口信息。

2.2新增loadbalance-service项目,该项目是一个负载均衡服务,也需要注册到Eureka-Server。

1)我们同样需要到start.spring.io创建spring boot项目,名称为ribbon-service,依赖项包括Eureka server、Ribbon、Web。其它过程同bookingcar项目类似,不再累述。

2)在入口程序里,添加@EnableDiscoveryClient注解。实际上,发现服务可以有很多种,包括Eureka自身,还包括zookeeper,consul等服务注册与发现的服务器。我们在上一节bookingcar里,使用的@EnableEurekaClient注解,表明我们直接把服务注册到Eureka Server上。

Ribbon实现的负载均衡自动化配置需要满足下面两个条件:1.RestTemplate类必须存在于当前工程的环境中;2. 必须有LoadBalancerClient的实现Bean。所以我们添加了18到22行的代码以开启Ribbon的负载均衡能力。

3)新建一个LoadBalanceService类,实现两个方法:TestPort以及TestGetOrderByUserId。RestTemplate使用服务的逻辑名,而不是服务的URI来查找服务。所以,我们会直接把微服务的名称作为传入参数。通过RestTemplate的getForObject方法,我们可以调用bookingcar微服务的接口。注意:这里调用的微服务只注明了逻辑名,而没有标明端口。

4)新建一个LoadBalanceController类,实现两个Restful API接口。接口1的功能是测试负载均衡之微服务的端口,端点为:http://.../v1/lb/testport?name={microserviceName}。接口2的功能是测试负载均衡之微服务响应,端点为:http://.../v1/lb/testorderapi?name={microserviceName}&userid={userid}

5)配置负载均衡微服务属性

spring.application.name=loadbalance-service

spring.freemarker.enabled=false

spring.thymeleaf.cache=false

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

server.port=2288

3. 验证

3.1启动Eureka-Server

3.2启动bookingcar微服务实例

3.3将bookingcar项目application.properties文件中server.port值改为2228,重新启动一个新的bookingcar微服务实例,我们在Eureka界面里会发现已经有两个bookingcar微服务注册到Eureka服务器上。

3.4验证bookingcar-service里添加负载均衡测试接口,发现其已如预期工作

3.5 启动loadbalance-service。启动后,在Eureka界面,我们发现loadbalance-service也已经注册到了Eureka服务器上了

3.6点击loadbalance-service服务后面的链接,我们会进入该服务的入口,输入不同的请求参数,我们可以观察到不同的响应。

1)http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2288/v1/lb/testport?name=bookingcar-service

第一次:

第二次:

两次端口不一样,说明调用了bookingservice微服务的不同实例,负载均衡器Ribbon起了作用

2) http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2288/v1/lb/testorderapi?name=bookingcar-service&userid=1

第一次:

第二次:

两次端口不一样,说明调用了bookingservice微服务的不同实例,负载均衡器起了作用

4. 总结

Spring Cloud框架中引入了Ribbon,通过和RestTemplate类及@LoadBalanced、@Bean注解的配合,实现了微服务架构里的负载均衡。

代码:https://github.com/shuxingliu/microservices

利用Spring Cloud实现微服务(七)- 内部调用

利用Spring Cloud实现微服务(六)- 服务网关

利用Spring Cloud实现微服务(四)- 微服务实现与注册

利用Spring Cloud实现微服务(三)- 业务领域驱动微服务设计

利用Spring Cloud实现微服务(二)--领域驱动设计

利用Spring Cloud实现微服务(一):Eureka服务器

推荐阅读更多精彩内容