基于spring cloud alibaba的架构,如何实现服务调用。
本章代码已分享至Gtiee :https://gitee.com/lengcz/springcloudalibaba01.git

需要将几个模块都注册到nacos
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
@SpringBootApplication
@EnableDiscoveryClient //启动服务发现
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848

使用DiscoveryClient从nacos列表中获取服务实例,并手动调用
/**
* 手动从nacos获取服务列表,再手动调用的方式
*/
ServiceInstance instance=discoveryClient.getInstances("server-product").get(0);
Product product = restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/" + pid, Product.class);
log.info("查询到的商品内容:" + JSON.toJSONString(product));
@Bean
@LoadBalanced //启动负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
//server-product为被调用的服务名
Product product = restTemplate.getForObject("http://server-product/product/" + pid, Product.class);



4. 重启order多次请求创建订单接口,观察日志,可以看到product的两个服务实例都有被调用。

需要在调用方配置此项
#配置负载均衡器
server-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
Feign是Spring Cloud提供的一种声明式的伪http客户端,它调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加注解即可。
nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
@SpringBootApplication
@EnableDiscoveryClient //启动服务发现
@EnableFeignClients //开启feign的客户端
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced //启动负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@FeignClient(value="server-product") //指向server-product服务
public interface ProductService {
@RequestMapping("/product/{pid}")
Product findById(@PathVariable Integer pid);
}
@Autowired
private ProductService productService;
@GetMapping("/order/prod/{pid}")
public Order order(@PathVariable Integer pid) {
log.info("调用商品服务,调用商品微服务查询此商品");
/**
* Ribbon负载均衡
*/
Product product = productService.findById(pid);
log.info("查询到的商品内容:" + JSON.toJSONString(product));
Order order = new Order();
order.setUid(1);
order.setUsername("测试");
order.setPid(pid);
order.setPrice(product.getPrice());
order.setPname(product.getPname());
order.setNumber(1);
orderService.createOrder(order);
log.info("用户下单成功,订单信息为:" + JSON.toJSON(order));
return order;
}
