マイクロサービスはサービス呼び出しに RestTemplate を使用します

マイクロサービス プロジェクトでは、サービスが他のサービス メソッドを呼び出すとき、呼び出しは比較的単純かつ直接的であり、アノテーションといくつかの単純な操作を通じて実行できるため、通常は feign を呼び出しに使用します。ここでは主にサービスの呼び出しを行います。 RestTemplate による単純なログ記録。

目次

構成クラスの追加

具体操作

スタートアップクラスにアノテーションを追加する

構成クラスの追加

まず、構成クラスで構成する必要がある RestTemplate オブジェクトを挿入する必要があります。

@Configuration
public class Config {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
}

具体操作

RestTemplate クラスDiscoveryClientクラスを実装クラスに挿入し、 DiscoveryClientを使用してサービス アドレス、サービス ポートなどのサービス情報を取得し、RestTemplateを使用して呼び出し操作を実装します。具体的なコードは以下の通りです。

サービスプロバイダー

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Autowired
    private GoodsService goodsService;


    @GetMapping ("/updateGoods/{id}")
    public R updateGoods(@PathVariable Integer id){
        return goodsService.updateGoods(id);
    }


}

サービス消費者

@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("失败");
    }
}

他のサービス メソッドが結果を返す必要がある場合は、Object オブジェクトが返されます。内部のプロパティの値を取得する必要がある場合は、それを Map に変換し、get (プロパティ名) で値を取得できます。

スタートアップクラスにアノテーションを追加する

最後に、 @EnableDiscoveryClientアノテーションをスタートアップ クラスに追加する必要があります。

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableAspectJAutoProxy(exposeProxy = true)
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

おすすめ

転載: blog.csdn.net/qq_50801874/article/details/130593299
おすすめ