在 SpringCloud 中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务
(2) Ribbon的主要作用
(1)服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进行调用
(2)负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址
不论是基于Eureka的注册中心还是基于Consul的注册中心,SpringCloudRibbon统一进行了封装,所以对于服务调用,两者的方式是一样的。
(1)坐标依赖
在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。
所以这里不需要导入任何额外的坐标
(2)工程改造
在创建RestTemplate的时候,声明@LoadBalanced
使用restTemplate调用远程微服务:不需要拼接微服务的URL路径,以待请求的服务名替换IP地址
1)修改order_service当中的OrderApplication启动类
package cn.itbluebox.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EntityScan(“cn.itbluebox.order.entity”)
public class OrderApplication {
/*
使用Spring提供的 RestTemplate 发送http请求到商品服务
1、创建RestTemplate对象交给容器管理
2、在使用的时候,调用其方法完成操作(getXX,postXX)
@LoadBalanced : 是Ribbon提供的负载均衡的注解
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
2)修改OrderController
实现基于Ribbon的形式调用远程的微服务
1、使用@LoadBalanced声明RestTemplate
2、使用服务名称替换IP地址
package cn.itbluebox.order.controller;
import cn.itbluebox.order.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@RequestMapping(“/order”)
public class OrderController {
//注入RestTemplate对象
@Autowired
private RestTemplate restTemplate;
/*
注入DiscoveryClient:
SpringCloud 提供的获取原数组的工具类
调用方法获取服务的元数据信息
*/
@Autowired
private DiscoveryClient discoveryClient;
/*
参数:商品ID
通过订单系统,调用商品服务
1、需要配置商品对象
2、需要调用商品服务
3、entity.Product
使用java 当中的urlconnection,httpclient,okhttp
*/
/*
实现基于Ribbon的形式调用远程的微服务
1、使用@LoadBalanced声明RestTemplate
2、使用服务名称替换IP地址
*/
@RequestMapping(value = “/buy/{id}”, method = RequestMeth