Ribbon是Spring Cloud Netflix提供的负载均衡组件,提供了很多算法,比如轮询、随机等帮助我们根据某种机制向服务提供端发送请求。在Netflix中,Ribbon可以从Eureka Server中获取服务提供者地址列表,并且基于负载均衡算法,请求其中的一个服务实例。
引入Ribbon的组件非常简单,我们只需要在项目中引入Ribbon,请使用groupID为org.springframework.cloud和artifact ID为spring-cloud-starter-netflix-ribbon的starter。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
在这里我们需要创建两个模块ribbon-provider和ribbion-consume两个模块,并且运行多个ribbon-provider服务注册到eureka-server中。如下为ribbon-provider模块代码和配置,作为服务提供者。
spring:
application:
name: ribbon-provider #应用实例名称,Ribbon可以根据该名称调用服务
server:
port: 9090
eureka:
instance:
appname: ribbon-provider #实例名称,
client:
fetch-registry: false #服务提供者 不需要,获取服务列表
register-with-eureka: true #服务提供者,将服务注册到 Eureka Server
service-url:
defaultZone: http://localhost:8671/eureka
为了简化开发,在ribbon-provider模块中我们只是使用Spring Boot应用创建一个Restful接口,返回Hello+Name。代码如下所示,启动类不在展示:
@RestController
public class HelloController {
@RequestMapping("/hello/{name}")
public String sayHello(@PathVariable String name) {
return "hello" + name + "!";
}
}
然后我们开发ribbion-consume,为了简单,restful接口与ribbon-provider一致,consume调用ribbon-provider接口使用的是我们熟悉的RestTemplate类,Ribbon对其进行增强,添加了负载均衡等功能,要使用该功能需要在RestTemplate Bean上加上@LoadBalanced注解,代码如下所示:
Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
接着我们在HelloNameController类中使用RestTemplate 实例调用 provider中的接口,这里值得注意的是URL中的地址为spring.application.name的值。如果没有配置,则会报错误,这里建议只要是Spring Boot应用,全部加上该配置,如下为consume接口代码部分:
@RestController
public class HelloNameController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello/{name}")
public String sayHello(@PathVariable String name) {
//URL为服务提供者实例名称(spring.application.name)+请求路径
return restTemplate.getForObject("http://ribbon-provider/hello/"+name,String.class);
}
使用Ribbon,我们仅仅在RestTemplate上加上@LoadBalanced即可以完成负载均衡功能,除此之外,Ribbon还支持更多的配置已完成更高级的功能,我们会在下一篇内容讲解。