Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。 常见的负载均衡有软件Nginx,LVS,硬件 F5等。 相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。
启动一中的eureka-server项目和producer-service项目,然后再改producer-service的端口,启动2个客户端
修改producer-service的类
1 @RestController 2 @RequestMapping("/api/v1/product") 3 public class ProductController { 4 ? 5 ? 6 ? 7 @Value("${server.port}") 8 private String port; 9 ? 10 @Autowired 11 private ProductService productService; 12 ? 13 /** 14 * 获取所有商品列表 15 * @return 16 */ 17 @RequestMapping("list") 18 public Object list(){ 19 return productService.listProduct(); 20 } 21 ? 22 ? 23 /** 24 * 根据id查找商品详情 25 * @param id 26 * @return 27 */ 28 @RequestMapping("find") 29 public Object findById(int id){ 30 ? 31 Product product = productService.findById(id); 32 ? 33 Product result = new Product(); 34 BeanUtils.copyProperties(product,result); 35 result.setName( result.getName() + " data from port="+port ); 36 return result; 37 }
创建order-serveice项目
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
启动类
1 @SpringBootApplication 2 public class OrderServiceApplication { 3 ? 4 public static void main(String[] args) { 5 SpringApplication.run(OrderServiceApplication.class, args); 6 } 7 ? 8 ? 9 @Bean 10 @LoadBalanced 11 public RestTemplate restTemplate() { 12 return new RestTemplate(); 13 } 14 ? 15 ? 16 }
Web层
@RestController @RequestMapping("/api/v1/order") public class OrderController { ? ? @Autowired(required = false) private ProductOrderServiceImpl productOrderService; ? ? @RequestMapping("/save") public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId){ ? return productOrderService.save(userId, productId); } ? ? ? ? }
Service层
@Service public class ProductOrderServiceImpl { ? ? @Autowired private RestTemplate restTemplate; ? public ProductOrder save(int userId, int productId) { System.out.println("123"); ? Object obj = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Object.class); ? System.out.println(obj); ? ProductOrder productOrder = new ProductOrder(); productOrder.setCreateTime(new Date()); productOrder.setUserId(userId); productOrder.setTradeNo(UUID.randomUUID().toString()); ? return productOrder; } }
Bo类
/** * 商品订单实体类 */ public class ProductOrder implements Serializable { ? ? private int id; ? /** * 商品名称 */ private String productName; ? /** * 订单号 */ private String tradeNo; ? /** * 价格,分 */ private int price; ? ? private Date createTime; ? ? private int userId; ? private String userName; ? ? public int getUserId() { return userId; } ? public void setUserId(int userId) { this.userId = userId; } ? public String getUserName() { return userName; } ? public void setUserName(String userName) { this.userName = userName; } ? public int getId() { return id; } ? public void setId(int id) { this.id = id; } ? public String getProductName() { return productName; } ? public void setProductName(String productName) { this.productName = productName; } ? public String getTradeNo() { return tradeNo; } ? public void setTradeNo(String tradeNo) { this.tradeNo = tradeNo; } ? public int getPrice() { return price; } ? public void setPrice(int price) { this.price = price; } ? public Date getCreateTime() { return createTime; } ? public void setCreateTime(Date createTime) { this.createTime = createTime; } } ?
配置文件
server: port: 8781 ? ? #指定注册中心地址 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ ? #服务的名称 spring: application: name: order-service
结果:2个结果在轮询
{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}
{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}
{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}
原文:https://www.cnblogs.com/dalianpai/p/11687175.html