Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置了服务提供地址列表后,它就会基于自己的负载均衡算法,自动的帮服务消费者去请求。Ribbon提供了很多负载均衡算法,轮询、随机等。也可以自己实现自定义的负载均衡算法。
当Ribbon和Eureka配合使用时,Ribbon就可以自动从Eureka Server获取服务提供者列表。
新建两个一模一样的服务提供者,相当于项目的集群,也就是说调用方按照负载均衡算法去随机调用服务提供者,为服务器减轻压力。
将之前的eureka-client 复制一份。配置如下
server:
port: 8001
spring:
application:
name: eureka-client
eureka:
client:
service-url:
defaultZone: http://user:123456@server1:8000/eureka/,http://user:123456@server2:8002/eureka/
healthcheck:
enabled: true
两个配置都一样,都注册名字为eureka-client的微服务。然后都提供一个查询服务的方法(写到chotroller中)。
@RestController("/getUser")
public class UserController {
@RequestMapping("/{id}")
public String getUserInfo(@PathVariable Long id){
//进行数据库操作,这里省略
return "hello i'm user1 !! "; //这里是一个user1 一个user2 为了体现出调用到哪个
}
}
将服务提供者都启动。
可以看到两个服务提供者 8001 和 8003 端口 都注册成功了。
新建一个服务消费方。
pom文件中加入Ribbon的配置,或者新建项目的时候选中Ribbon。
org.springframework.cloud</groupId>
spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
配置文件中加入
server:
port: 8004
spring:
application:
name: ribbon-consumer
eureka:
client:
service-url:
defaultZone: http://user:123456@server1:8000/eureka/,http://user:123456@server2:8002/eureka/
healthcheck:
enabled: true
将消费者也注册到server集群。
然后修改启动类。加入RestTemplate
。RestTemplate是Spring提供的用于访问Rest服务的客户端。并且加上@LoadBalanced
注解。表示启用Ribbon的负载均衡功能。
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
然后写一个测试的controller。
@RestController
public class UserController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public String getUserInfo(@PathVariable Long id){
//调用服务提供者,也就是两个注册的eureka-client
return restTemplate.getForObject("http://eureka-client/"+id,String.class);
}
}
然后访问http://localhost:8004/user/1
可以发现,消费者就会负载的调用两个提供方了。
方法一:java代码
上面默认的是轮询,也就是123123123这样。我们来改成随机试试。
新建一个配置类。
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule(){
//改为随机
return new RandomRule();
}
}
这个配置类最好不要被包扫描扫到,因为他如果被扫到了,所有的@RibbonClient
就都会共享这个配置,如果只是要一个类运用这个规则,那就放到包扫描不到的地方。
然后在类上加上@RibbonClient(name = "eureka-client",configuration = RibbonConfiguration.class)
。指定我们自定义的配置。
方法二:属性配置
还可以使用属性配置自定义Ribbon的负载规则。在yml文件中加入
eureka-client: # 这是服务提供者的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
这样就行了。