简介
Ribbon是Neflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。通过Spring Cloud的封装,可以让我们轻松的,面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。
操作看看
服务消费者(order)
1 2 3 4 5 6 7 8 9 10 11
| @RestController public class OrderController {
@Autowired private OrderServiceImpl orderService;
@GetMapping("/order/{id}") public Order findOrderById(@PathVariable("id") int id){ return orderService.findOrderById(id); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| @Service public class OrderServiceImpl {
@Autowired private ItemServiceImpl itemService;
private static final Map<Integer,Order> MAP;
static { MAP=new HashMap<>(); List<Item> items=new ArrayList<>(); Item item=new Item(); item.setId(1); items.add(item); Order order=new Order(1,1,new Date(),items); MAP.put(1,order);
List<Item> items1=new ArrayList<>(); Item item1=new Item(); item.setId(2); items.add(item); Order order1=new Order(2,2,new Date(System.currentTimeMillis()+1440000),items1); MAP.put(2,order1); } /** * @author czj * 根据订单主键获得订单详细信息 * @date 2020/4/2 11:08 * @param [] * @return com.czj.order.entity.Order */ public Order findOrderById(int orderId){ Order order=MAP.get(orderId); if (order!=null) { List<Item> items=new ArrayList<>(); for (Item item:order.getItems()) { Item result = itemService.findItemById(item.getId()); /* Item result=itemFeignClient.findItemById(item.getId());*/ items.add(result); } order.setItems(items); }else { order=new Order(0,0,new Date(),new ArrayList<Item>(0)); } return order; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Service public class ItemServiceImpl {
private static final Logger log = LoggerFactory.getLogger(ItemServiceImpl.class);
@Autowired private OrderProperties orderProperties;
@Autowired private RestTemplate restTemplate;
public Item findItemById(int id){ ServiceInstance serviceInstance = this.loadBalancerClient.choose("app-item"); log.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort()); return restTemplate.getForObject(orderProperties.getItem().getUrl(), Item.class,id); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @EnableEurekaClient @SpringBootApplication public class OrderApplication {
public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); }
/** * 向Spring容器中定义RestTemplate对象 * @return */ @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
|
服务提供者(item)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @RestController public class ItemController {
//简便一下就不来创建接口了 @Autowired private ItemServiceImpl itemService;
/** * @author czj * 对外提供查询商品详细信息服务 * @date 2020/4/2 10:52 * @param [id] * @return com.example.item.entity.Item */ @GetMapping("/item/{id}") public Item findItemById(@PathVariable("id")int id){ return itemService.findItemById(id); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Service public class ItemServiceImpl { private static final Map<Integer,Item> MAP;
static { MAP=new HashMap<>(); Random random=new Random(); for (int i=1;i<=100;i++){ MAP.put(i,new Item(i,"商品"+i,random.nextInt(200))); } }
/** * @author czj * 根据主键返回商品详细信息 * @date 2020/4/2 10:41 * @param [id] * @return com.example.item.entity.Item */ public Item findItemById(int id){ Item item=MAP.get(id); if (item==null){ item=new Item(0,"未查到该商品!",0); } return item; } }
|
启动
分别启动Eureka Server和order服务消费者,最后启动两个端口为8200,8201的两个item服务提供者
多次请求http://localhost:8300/order/1的URL
打印日记结果
可以看到请求会分布均匀到两个item服务提供者的节点上,说明负载均衡成功拉。