一、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);
}
网友评论