Ribbon实现负载均衡:1.寻找Eureka Server,优先选择同一区域且负载较少的服务。2.根据用户指定的策略(轮询,随机等)从server取地址。

在eureka中使用Ribbon非常简单:

1.在client引导类的restTemperate()方法添加@LoadBalanced:

package com.itheima.microserviceclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(MicroserviceClientApplication.class, args);
	}
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

2.使用服务实例名字,restTemperate()方法添加@LoadBalanced后就有了负载均衡的能力

package com.itheima.microserviceclient.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {	
	@Autowired
	private RestTemplate restTemplate;
	//根据用户查找订单
	@GetMapping("/findOrderByUser/{id}")
	public String findOrderByUser(@PathVariable String id) {
		//假设用户只有一个订单,订单id为123
		int oid = 123;
		return this.restTemplate.getForObject("http://localhost:7900/order/1", String.class);
	}
}

修改为:

package com.itheima.microserviceclient.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {	
	@Autowired
	private RestTemplate restTemplate;
	//根据用户查找订单
	@GetMapping("/findOrderByUser/{id}")
	public String findOrderByUser(@PathVariable String id) {
		//假设用户只有一个订单,订单id为123
		int oid = 123;
		return this.restTemplate.getForObject("http://microservice-order/1", String.class);
	}
}

restTemplate.getForObject()方法不再使用ip+端口,而是使用注册中心订单实例名字。

3.创建服务监听,用于监听端口:

package com.itheima.microserviceorder.util;
import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;

@Configuration //注册组件
public class ServiceInfoUtil implements ApplicationListener<EmbeddedServletContainerInitializedEvent>{
	//声明event对象,用于获取运行服务器的本地端口
	private static EmbeddedServletContainerInitializedEvent event;
	@Override
	public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
		ServiceInfoUtil.event = event;
	}
	
	//获取端口号
	public static int getPort() {
		int port = event.getEmbeddedServletContainer().getPort();
		return port;
	}	
}

4.OrderController增加打印:

 

Spring Cloud Ribbon 负载均衡实使用

5.启动eureka server,client,order,然后修改order端口为7901再启动一个order:

Spring Cloud Ribbon 负载均衡实使用

6.多次访问http://localhost:8762/findOrderByUser/1

控制台打印7900,7901说明负载均衡实现。

相关文章: