SpringCloud学习笔记之服务调用Ribbon入门
经过以上的学习,已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式将信息注册到注册中心,并且可以通过SpringCloud提供的工具获取注册中心的服务列表。但是服务之间的调用还存在很多的问题,如何更加方便的调用微服务,多个微服务的提供者如何选择,如何负载均衡等。
1 Ribbon概述
1.1 什么是Ribbon
是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务
1.2 Ribbon的主要作用
(1)服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进行调用
(2)负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址
1.3 基于Ribbon实现订单调用商品服务
不论是基于Eureka的注册中心还是基于Consul的注册中心,SpringCloudRibbon统一进行了封装,所以对于服务调用,两者的方式是一样的。
1.3.1 坐标依赖
在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标
1.3.2 工程改造
(1) 服务提供者
修改 productservice模块中ProductController#findById() 方法如下
@Value("${spring.cloud.client.ip-address}")
private String ip;
@Value("${server.port}")
private String port;
@Autowired
private ProductService productService;
@GetMapping("/{id}")
public Product findById(@PathVariable Long id) {
Product product = productService.findById(id);
product.setProductName(ip+":"+port);//记录请求服务的ip地址和端口
return productService.findById(id);
}
(2) 服务消费者
修改服务消费者 order_service模块中的启动类OrderApplication ,在创建RestTemplate方法上添加 @LoadBalanced 注解
/**
* 基于Ribbon的服务调用与负载均衡
*/
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
在 shop_service_order的OrderController 中添加下单方法,并使用RestTemplate完成服务调用
/**
* 通过Ribbon方式调用微服务
*/
@GetMapping("/buy/{id}")
public Product buyById(@PathVariable Long id) {
Product product = null;
//Ribbon方式调用微服务,直接以微服务名称调用
product = restTemplate.getForObject("http://service-product/product/1",Product.class);
return product;
}
1.3.3 代码测试
浏览器中请求http://localhost:9001/order/buy/1查看展示效果如下,已经可以在订单微服务中以服务名称的形式调用商品微服务获取数据