SpringCloud模拟微服务4-负载均衡Ribbon
一.开启多一个user-service服务
可以使得尽管这个项目原来配置是8081,但是最后以jvm参数端口启动
二.在consumer-demo中引入Ribbon依赖
因为是consumer-demo写调用服务写负载均衡算法
<!--Ribbon负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
1.复杂的使用方式
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private RibbonLoadBalancerClient client;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
//user-service是之前在yaml配置的名字,可以同一个服务,启动多个,后面负载均衡要用所以用List集合
//List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
//从(服务列表)实例当中取出ip和端口
//ServiceInstance instance = instances.get(0); //这个地方以后要自己写动态获取服务算法
//随机,轮询,hash负载均衡算法
ServiceInstance instance = client.choose("user-service");//默认采用轮询
String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
User user = restTemplate.getForObject(url,User.class);
return user;
}
}
2.简单的使用方式
1.第一步找到consumer-demo启动器
@LoadBalanced会给RestTemplate内置一个拦截器拦截它的请求
2.修改controller
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
//直接写user-service服务名称,Ribbon拦截器自己帮我们提供负载均衡
String url = "http://user-service/user/"+id;
User user = restTemplate.getForObject(url,User.class);
return user;
}
}
3.Ribbon拦截器源码
查看实现类
选则第一个(最基本的负载均衡器)
之后不知怎么地,直接ctrl+n搜索AbstractServerPredicate.java
4.自己修改采用的负载均衡方式
修改yaml文件
#添加一条
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#这里修改成了使用随机负载均衡算法。默认为轮询