美文网首页
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