基于Ribbon实现订单调用商品服务
不论是基于Eureka的注册中心还是基于Consul的注册中心,SpringCloudRibbon统一进行了封装,所以对于服务调用,两者的方式是一样的。
坐标依赖
在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标
工程改造
(1) 服务提供者
修改 shop_service_product模块中ProductController#findById() 方法如下
@Value("${server.port}") private String port; @Value("${spring.cloud.client.ip-address}") private String ip; @GetMapping("/{id}") public Product findById(@PathVariable Long id) { Product product = productService.findById(id); //设置端口 product.setProductDesc("调用shop-service-product服务,ip:"+ip+",服务提供者端 口:"+port); return product; }
(2) 服务消费者
修改服务消费者 shop_service_order模块中的启动类OrderApplication ,在创建RestTemplate方法上添加 @LoadBalanced 注解
/** * 基于Ribbon的服务调用与负载均衡 */ @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }
在 shop_service_order的OrderController 中添加下单方法,并使用RestTemplate完成服务调用
@Autowired private RestTemplate restTemplate; @GetMapping("/buy/{id}") public Product order() { //通过restTemplate调用商品微服务 //Product product = restTemplate.getForObject("http://127.0.0.1:9002/product/1", Product.class); Product product = restTemplate.getForObject("http://shop-serviceproduct/product/1", Product.class); return product; }
代码测试
浏览器中请求http://localhost:9001/order/buy/1查看展示效果如下,已经可以在订单微服务中已服务名称的形式调用商品微服务获取数据