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;
    }
    
}

 

猜你喜欢

转载自blog.csdn.net/qq_40263927/article/details/109763294
今日推荐