SpringCloud微服务之负载均衡Ribbon
本次使用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(); }