美文网首页
SpringCloud服务发现方式(第三种为常用方式)

SpringCloud服务发现方式(第三种为常用方式)

作者: 拄杖忙学轻声码 | 来源:发表于2021-07-26 22:26 被阅读0次

    一、DiscoveryClient方式:
    1】先到注册中心拉取所有服务列表信息
    2】然后根据微服务名称从注册列表中获取服务实例对对象
    3】从实例对象中获取主机名和端口号
    如下代码示例:

        private List<Product> selectProductByDiscoveryClient(){
            StringBuffer sb = null;
    
            //获取服务列表
            List<String> serviceIds = discoveryClient.getServices();
            if (CollectionUtils.isEmpty(serviceIds)){
                return null;
            }
    
            //根据名称获取服务
            List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("service-provider");
            if (CollectionUtils.isEmpty(serviceInstanceList)){
                return null;
            }
    
            //获取服务提供者实例对象
            ServiceInstance si = serviceInstanceList.get(0);
            sb = new StringBuffer();
            sb.append("http://"+si.getHost()+":"+si.getPort()+"/product/getProductList");
    
            //封装返回对象
            ResponseEntity<List<Product>> response = restTemplate.exchange(
                    sb.toString(),
                    HttpMethod.GET,
                    null,
                    new ParameterizedTypeReference<List<Product>>() {}
            );
    
            //返回body
            return response.getBody();
        }
    

    二、LoadBalancerClient方式:
    1】比第一种方式省去了拉取注册中心列表的步骤,可以直接通过服务名称获得服务实例对象
    2】通过服务实例对象获取主机名和端口号
    代码示例如下:

        private List<Product> selectProductByLoadBalancerClient(){
            StringBuffer sb = null;
    
            //获取服务提供者实例对象
            ServiceInstance si = loadBalancerClient.choose("service-provider");
            if(StringUtils.isEmpty(si)){
                return null;
            }
            sb = new StringBuffer();
            sb.append("http://"+si.getHost()+":"+si.getPort()+"/product/getProductList");
            System.out.println("调用地址:"+sb.toString());
    
            //封装返回对象
            ResponseEntity<List<Product>> response = restTemplate.exchange(
                    sb.toString(),
                    HttpMethod.GET,
                    null,
                    new ParameterizedTypeReference<List<Product>>() {}
            );
    
            //返回body
            return response.getBody();
        }
    

    三、openFeign(feignClient)方式【此方式最为常用】:
    1】主启类动开启feignClient功能,多维护的方式重写服务提供者的Rest接口,即可直接调用
    代码示例如下:

    @Component
    @FeignClient(value = "service-provider")
    public interface ProductService {
        /**
         * <p>返回商品列表信息</p >
         * @author: hkl
         * @date: 2021/5/4 0004 2:19
        */
        //配置需要调用的服务地址及参数
        @Cacheable(cacheNames = "orderService:getOrderById")
        @GetMapping("/product/getProductList")
        List<Product> selectProductList();
    
        /**
         * <p>根据主键查询商品</p >
         * @author: hkl
         * @date: 2021/5/6
         */
        @GetMapping("/product/{id}")
        Product getProductById(@PathVariable("id") Integer id);
    
        /**
         * <p>根据Id查询商品</p >
         * @author: hkl
         * @date: 2021/5/6 0006 0:54
         * @param:
         * @return:
         */
        @PostMapping(value = "/product/single")
        Product queryProductById(Integer id);
    
        /**
         * <p>新增商品</p >
         * @author: hkl
         * @date: 2021/5/6 0006 0:55
         * @param:
         * @return:
         */
        @PostMapping(value = "/product/save")
        Map<Object, Object> createProduct(Product product);
    
        /**
         * <p>接收商品对象参数</p >
         * @author: hkl
         * @date: 2021/5/7 0007 0:32
         * @param:
         * @return:
        */
        @GetMapping(value = "/product/pojo")
        Product selectProductByPojo(Product product);
    }
    

    相关文章

      网友评论

          本文标题:SpringCloud服务发现方式(第三种为常用方式)

          本文链接:https://www.haomeiwen.com/subject/fbswpltx.html