spring cloud 之 负载均衡
Spring Cloud 的负载均衡可以由Eureka、Feign 组件来实现。下面我将围绕所建立的eureka_server 、product_service、order_service三个工程来讲解如何实现客户端的负载均衡。
1.eureka_server 注册服务
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具,Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现,Eureka采用C-S的设计架构,包含Eureka Server 和Eureka Client两个组件
(1)application.yml 简单配置如下:
server: port: 8081 eureka: instance: hostname: 127.0.0.1 client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://localhost:8761/eureka/
(2)EurekaServerApplication 主要代码如下:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
2. order_service 订单服务
Feign集成了Ribbon,提供负载均衡的http客户端
(1)application.yml 简单配置如下 eureka: client: serviceUrl: defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8085 spring: application: name: order_service
(2)OrderServiceApplication 代码:
@SpringBootApplication @EnableFeignClients public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
(3) FeignClient 接口调用实现负载均衡
@FeignClient(name = "product-service") public interface ProductClient { @RequestMapping("/product/getProductDetailById.do") String getProductDetailById(@RequestParam("id") int id); }
3.product_service 商品服务
(1)application.yml 简单配置: eureka: client: serviceUrl: defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8082 spring: application: name: product-service
(2)ProductServiceApplication 代码: @SpringBootApplication @EnableEurekaClient public class ProductServiceApplication { public static void main(String[] args) { SpringApplication.run(ProductServiceApplication.class, args); } }
(3)提供的商品详情接口
@RestController @RequestMapping("/product/") public class ProductController { @Value("${server.port}") private String port; @RequestMapping("getProductDetailById.do") public Object getProductDetailById(@RequestParam("id") int id){ Product product=new Product(); product.setId(1); product.setProductName("苹果"); product.setPrice(11.0); product.setDiscrip("来自端口:"+port+":这里的苹果又大有甜"); return product; } }
4.具体调用的实现:
(1) 分别在主机上部署两套 product_service 商品服务,端口分别是 8082与8083 在Eureka注册了两个服务
(2) order_service 订单服务 调用 product_service商品服务,默认调用采用轮询的方式进行调用
@RestController @RequestMapping("/order/") public class OrderController { @Autowired private ProductClient productClient; @RequestMapping("getOrderDetailById.do") public Object getOrderDetailById(@RequestParam("productId") int productId){ Order order=new Order(); order.setOrderId(1); String json=productClient.getProductDetailById(productId); System.out.println(json); return json; } }