本次使用Eureka作为注册中心,向其中注册进两个相同服务名的服务(EUREKA-PROVIDER),做一个简单服务提供者集群。再注册进一个消费者调用提供者。
两个提供者除了application中的服务端口号不同,其他代码都相同
提供者的controller
@Controller
@RequestMapping("user")
public class UserControllerProvider {
@Autowired
UserService userService;
//获取端口号
@Value("${server.port}")
private String port;
@RequestMapping("testRibbon")
@ResponseBody
public String testRibbon(){
return port;
}
}
再看消费者的controller
@Controller
@RequestMapping("user")
@Slf4j
public class UserControllerComsumer {
//使用ribbon就不能使用ip加端口访问,要用服务名
//private static final String url="http://localhost:8001/";
private static final String url="http://EUREKA-PROVIDER";
@Autowired
RestTemplate restTemplate;
@RequestMapping("testRibbon")
@ResponseBody
public String testRibbon(){
String object = restTemplate.getForObject("http://EUREKA-PROVIDER" + "/user/testRibbon", String.class);
return "服务名:EUREKA-PROVIDER,"+"调用端口号:"+object;
}
}
使用restTemplate时用服务名称代替ip+端口调用需要在注入restTemplate的时候加上@LoadBalanced注解
消费者端向容器中添加restTemplate
@EnableAutoConfiguration
@Configuration
@ComponentScan(basePackages = "com")
@EnableDiscoveryClient
@EnableEurekaClient
public class SpringCloudConsumer {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumer.class,args);
}
@Bean
@LoadBalanced//ribbon负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
添加@LoadBalanced使用Ribbon负载均衡默认采用轮询方式
启动几个服务,浏览器测试消费者
此时采用的时默认的轮询方式
替换默认的策略方式
ribbon的负载均衡策略类都实现了IRule接口,
1、在配置文件中定义
#服务名称
EUREKA-PROVIDER:
ribbon:
#采取策略
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
2、自定义类实现
在主启动无法扫描到的包下创建一个配置类
向容器中添加策略类
@Configuration
public class IruleConfiguration {
@Bean
IRule myRule(){
return new RandomRule();
}
}
在启动类上添加@RibbonClient
value是要进行负载均衡的服务名称,即服务提供者;configuration是自定义的配置类
@RibbonClient(name = "EUREKA-PROVIDER",configuration = com.myIRule.IruleConfiguration.class)
public class SpringCloudConsumer {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumer.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
总结
使用ribbon负载均衡:
服务提供者集群,即往注册中心注册多个相同服务名不同端口号的服务
在消费者端使用restTemplate进行远程调用消费者是,使用服务名称替代具体的ip+端口号
http://localhost:8001/user --> http://EUREKA-PROVIDER/user
在消费者注入restTemplate时加上@LoadBlance注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}