其实euraka已经默认集成了ribbon实现的是轮训方式的负载均衡,我们可以测试下。接上篇博客的代码:
springcloud 微服务(二) 集成Feign组件 跨服务调用实例
一.启动多个user提供者微服务实例
1.将user 打成jar包,此时端口是8881 , 然后 :java -jar 启动
2.将user在打成另一个jar,此时端口是8882 ,然后 :java -jar 启动
3.观察注册中心,user有2个实例:
二.改造服务消费者item微服务,打印请求服务端口
1.在我们消费者item微服务的controller中增加代码:
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 打印 负载 均衡信息
*
* @param serviceId
* @return
* @author HadLuo 2020年5月20日 新建
*/
@RequestMapping(value = "/testLoadBalancerClient", method = RequestMethod.GET)
String testLoadBalancerClient(String serviceId) {
ServiceInstance snstance = loadBalancerClient.choose(serviceId);
String ret = "host=" + snstance.getHost() + ",InstanceId=" + snstance.getInstanceId() + ",port="
+ snstance.getPort() + ",Scheme=" + snstance.getScheme() + ",ServiceId="
+ snstance.getServiceId() + ",Metadata=" + new Gson().toJson(snstance.getMetadata());
System.err.println(ret);
return ret;
}
上面代码就是为了打印调用对应的serviceId 的服务的ip和端口。
2.当我们浏览器多次访问: http://localhost:8880/testLoadBalancerClient?serviceId=user
后台会打印调用user微服务的端口,发现都是轮询的。
三.将负载均衡模式改为随机模式
1.在item消费者里面的启动类添加:
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients(basePackages = "com.hadluo"})
//// 针对单独的 client 设置,可设置多个
@RibbonClients(value = {
// 对 user 实例访问时 负载均衡的配置采用 RibbonConfigure 配置类的
@RibbonClient(name = "user", configuration = RibbonConfigure.class) }
)
public class ItemApplication {
public static void main(String[] args) {
SpringApplication.run(ItemApplication.class, args);
}
}
代码解释: 对调用user服务时才用RibbonConfigure.class的配置
2.RibbonConfigure.class代码:
public class RibbonConfigure {
@Bean
public IRule ribbonRule() {
System.err.println("ribbon负载均衡配置加载!");
return new RandomRule();//随机方式
}
}
3.启动item服务,多次访问测试 : http://localhost:8880/testLoadBalancerClient?serviceId=user
变成毫无规律的访问了。
四.全局配置负载均衡
上面都是针对单个或者多个实例来配置,如果我们要对所有的实例配置,则只需要将配置加上@Configuration注解就行了
@Configuration
public class RibbonConfigure {
@Bean
public IRule ribbonRule() {
System.err.println("ribbon负载均衡配置加载!");
return new RandomRule();
}
}
下节更精彩!!