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增加打印:
5.启动eureka server,client,order,然后修改order端口为7901再启动一个order:
6.多次访问http://localhost:8762/findOrderByUser/1
控制台打印7900,7901说明负载均衡实现。