一、Ribbon介绍
Ribbon是Netflix发布的开源项目,主要功能是为REST客户端实现负载均衡。
常见的组件
1.ServerList 负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka Server中注册的服务实例表。
2.ServerListFilter 服务器列表过滤器。这是一个接口,主要用于对Service Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList。Ribbon提供了多种过滤器的实现
3.IPing 探测服务实例是否存活的策略。
4.IRule 负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。
5.ILoadBalancer 负载均衡器。这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer。
6.RestClient 服务调用器。顾名思义,这就是负载均衡后,Ribbon向Service Provider发起REST请求的工具。
客户端负载均衡
二、项目的构建
我们结合之前创建的项目Eureka Server和Eureka Provider来创建Eureka Consumer项目。
2.1:pom.xml如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<!-- 客户端负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- spring boot实现Java Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--暴露各种指标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--spring-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.2: 创建相应的application.properties
#应用(服务)名称
spring.application.name=ribbon-consumer
#端口号
server.port=8765
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://eureka:123456@localhost:8761/eureka/
#忽略安全认证
management.security.enabled=false
2.3:创建相应的入口程序
@SpringBootApplication
@EnableDiscoveryClient //开启服务
public class RibbonConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
2.4: 创建服务调用的控制器
@RestController
public class RibbonConsumerController {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
/**
* 项目说明
* @return
*/
@GetMapping({"/",""})
public String index(){
return "Hi,dy_bom,this is ribbon-consumer";
}
/**
* 远程服务ribbon rest
* @return
*/
@GetMapping( "/index")
public Object ribbonIndex() {
String str= restTemplate.getForEntity("http://eureka-provider/index", String.class).getBody();
System.out.println("<<<<<<<<<<<<<ribbon返回值:"+str+">>>>>>>>>>>>>>>>>");
return str;
}
}
其中我们可以看出,客户端的负载均衡采用了注解的方式 @LoadBalanced注入,需要注意的是,注入的Bean和引用的Bean名称得一致。而且Ribbon默认的负载均衡为轮询
2.5:自定义负载均衡策略
@Configuration
@RibbonClient(name = "eureka-provider")
public class RibbonClientConfiguration {
@Bean
public IRule ribbonRule(){
System.out.println("<<<<<<<<<<<<<<<<<ribbon rule called!>>>>>>>>>>>>");
//默认轮询策略(RoundRobinRule) 随机轮询(RandomRule) 权重(WeightedResponseTimeRule) 最小的并发策略(BestAvailableRule)
// return new RoundRobinRule();
return new RandomRule();
}
}
2.6:验证服务之间的调用
启动Eureka Server,Eureka Provider,Eureka Consumer以后,查看看Eureka Server的后台可以看出已经成功注册了两个服务,生产者和消费者
访问消费者index的API,检验是否调用了生产者资源
可以看出消费者的确成功的获取了生产者的资源。
三:负载均衡测试
复制生产者项目,确保各个生产者的的服务名称一致,修改各个生产者的端口后,修改API返回值。最后启动另外两个复制的生产者。
查看Eureka后台服务的注册情况:
可以看出,服务注册成功。
通过访问消费者,发送了128个请求看看返回值:
可以看出,消费者端获取服务提供者的资源为随机的。
因为我们之前在配置负载均衡策略的时候,设置为随机策略。小伙伴们可以试试其他的。
代码地址:https://github.com/rubenYuan/Spring-Cloud-Samples
PPT:http://download.csdn.net/download/ruben95001/9974839
上一篇:服务注册与发现Eureka
下一篇:熔断器Hystrix