• SpringCloud商品服务调用方式之Ribbon


    1、创建order_service项目

    pom依赖

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

    yml配置:

    server:
      port: 8781
    
    #指定注册中心地址
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    
    #服务的名称
    spring:
      application:
        name: order-service

    2、开发伪下单接口

    @Service
    public class ProductOrderServiceImpl implements ProductOrderService {
    
    
        @Autowired
        private RestTemplate restTemplate;

         // @Autowired, 启动时注入
         private LoadBalancerClient loadBalancer;

    
        @Override
        public ProductOrder save(int userId, int productId) {
             
    //从注册中心拉取product-service列表调用其url为
    api/v1/product/find 接口

            Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Map.class);

           //调用方式二
          // ServiceInstance instance = loadBalancer.choose("product-service");
           // String url = String.format("http://%s:%s/api/v1/product/find?id="+productId, instance.getHost(),instance.getPort());
          // RestTemplate restTemplate = new RestTemplate();
            // Map<String,Object> productMap = restTemplate.getForObject(url, Map.class);


           ProductOrder productOrder = new ProductOrder();
           productOrder.setCreateTime(new Date());
           productOrder.setUserId(userId);
            productOrder.setTradeNo(UUID.randomUUID().toString());
            productOrder.setProductName(productMap.get("name").toString());
          productOrder.setPrice(Integer.parseInt(productMap.get("price").toString()));


    return productOrder; } }


    3、使用ribbon. (类似httpClient,URLConnection),客户端负载均衡

    启动类增加注解

    @SpringBootApplication
    public class OrderServiceApplication {
    
    public static void main(String[] args) {
    SpringApplication.run(OrderServiceApplication.class, args);
    }
    //分析@LoadBalanced
    //1)首先从注册中心获取provider的列表
    //2)通过一定的策略选择其中一个节点
    //3)再返回给restTemplate调用
    //Ribbon自带负载均衡bean @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }


    4、根据名称进行调用商品,获取商品详情

    @RestController
    @RequestMapping("api/v1/order")
    public class OrderController {
    
    
    @Autowired
    private ProductOrderService productOrderService;
    
    
    @RequestMapping("save")
    public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId){
    
    return productOrderService.save(userId, productId);
    }
    }

    启动 eureka, order-service, 以及多个 Product-service实例,会轮询从Product-service实例调用服务,实现负载均衡。

    若想要自定义负载均衡,则可在order-service yml加入

    #自定义负载均衡策略
    product-service:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule



  • 相关阅读:
    bbs树形打印(一)
    ORM
    kafka的分区
    Content-type"是"application/json的作用
    idea增强for循环
    rabbitmq的发布订阅
    搭建mqtt服务器apollo
    kafka生产者集群和分区,消费者轮询接收
    http实时推送技术
    Kafka:Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties.
  • 原文地址:https://www.cnblogs.com/daxiong225/p/13170669.html
Copyright © 2020-2023  润新知