En un proyecto de microservicio, cuando un servicio llama a otros métodos de servicio, generalmente se usa fingir para llamar, porque la llamada es relativamente simple y directa, y se puede hacer a través de anotaciones y algunas operaciones simples. Aquí principalmente hacemos una llamada al servicio. a través del registro RestTemplate Simple.
Tabla de contenido
Agregar clase de configuración
Agregar anotaciones a la clase de inicio
Agregar clase de configuración
Primero, debe inyectar el objeto RestTemplate, que debe configurarse en la clase de configuración.
@Configuration
public class Config {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Operación concreta
Inyecte las clases RestTemplate y DiscoveryClient en la clase de implementación y luego use DiscoveryClient para obtener información del servicio, como la dirección del servicio, el puerto del servicio, etc., y luego use RestTemplate para implementar la operación de llamada. El código específico es el siguiente.
proveedor de servicio
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@GetMapping ("/updateGoods/{id}")
public R updateGoods(@PathVariable Integer id){
return goodsService.updateGoods(id);
}
}
consumidor de servicios
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Override
@Transactional(rollbackFor=Exception.class)
public R insertOrder(Order order){
//根据服务名去获取服务信息
ServiceInstance service = discoveryClient.getInstances("goods-service").get(0);
//根据服务名去获取服务信息
ServiceInstance service2 = discoveryClient.getInstances("coupon-service").get(0);
//获取服务地址
String url = service.getHost() + ":" + service.getPort();
String url2 = service2.getHost() + ":" + service2.getPort();
System.out.println("---------------调用商品服务进行库存更新--------------------");
//调用商品服务
Object forObject = restTemplate.getForObject("http://" + url + "/goods/updateGoods/" + order.getGoodsId() + "?id=" + order.getGoodsId(), Object.class);
Map map = (Map) forObject;
if (String.valueOf(map.get("code")).equals("201")){
System.out.println("---------------商品没有库存啦-----------------");
return R.fail(201,"商品没有库存啦");
}
System.out.println("---------------调用商品服务成功-----------------------");
System.out.println("---------------调用优惠券服务,修改优惠券信息--------------------");
//调用优惠券服务
Object forObject1 = restTemplate.getForObject("http://" + url2 + "/coupon/updateCoupon/" + order.getCouponId() + "?id=" + order.getGoodsId(), Object.class);
Map map2 = (Map)forObject1;
if (String.valueOf(map2.get("code")).equals("201")){
System.out.println("---------------优惠券已经使用过了----------------");
return R.fail(201,"优惠券已经使用过了");
}
System.out.println("---------------调用优惠券服务成功-----------------------");
order.setPrice(order.getGoodsPrice() * order.getCouponDiscount());
int i = orderMapper.insertOrder(order);
return i > 0 ? R.ok(order) : R.fail("失败");
}
}
Si otros métodos de servicio necesitan devolver resultados, se devolverá un objeto Object. Si necesita obtener el valor de la propiedad interna, puede convertirlo en un mapa y luego obtener el valor a través de get (nombre de la propiedad).
Agregar anotaciones a la clase de inicio
Finalmente, debe agregar la anotación @EnableDiscoveryClient a la clase de inicio
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableAspectJAutoProxy(exposeProxy = true)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}