我们启动了一个products.server,然后通过discoveryClient来获取服务实例信息,然后获取ip和接口来访问。但是在实际环境中,我们往往会开启很多个products.server的集群。此时我们获取的服务列表中就会有多个,到底该访问那个呢。所有这种情况Eureka中已经帮我们集成了负载均衡组件:Ribbon。
使用三步走:
1,在服务Pom中加依赖
我在consumer-demo服务中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2,在RestTemplate类上加上@LoadBalanced注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced //负载均衡,加该注解所有的RestTemplate请求会被LoadBanlancerInterceptor拦截
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3,修改Controller中代码获取服务名
@GetMapping(value="/{id}")
public Products queryByid(@PathVariable("id")String id){
//负载均衡
String url="http://products-service/products/"+id;
Products obj = restTemplate.getForObject(url, Products.class);
return obj;
}
4,测试准备,再复制一个ProductsApplication2用来提供服务,端口号为8083
复制ProductsApplication在并修改端口号:
5,实现测试,找到接口ClientHttpRequestInterceptor的实现类LoadBalancerInterceptor中的intercept()方法,进入execute()方法,
可以看到该方法在LoadBalancerClient接口中,
找其实现类RibbonLoadBalancerClient
访问一次:http://localhost:8080/products/2
再次访问:http://localhost:8080/products/2
Ribbon负载均衡默认使用的轮询方式。
如果要修改Ribbon负载均衡方式:在consumer-demo服务.yml配置
products-service: #调用的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #方式