Ribbon 简介
SpringCloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版
请求自动转换成客户端负载均衡的服务调用。SpringCloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在
于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的。
客户端负载均衡器
我们通常所说的负载均衡都指的是服务端负载均衡,还有一种客户端负载均衡:
1) 硬件负载均衡:主要通过在服务器节点之间按照专门用于负载均衡的设备,比如F5等。
2) 软件负载均衡:主要通过在服务器上安装一些用于负载均衡功能或模块等软件来完成请求分发工作,比如Nginx等。
3) 客户端负载均衡:主要通过将负载均衡的功能以库的方式集成到服务的消费方来完成请求分发工作,比如Ribbon等。
硬件负载均衡的设备或是软件负载均衡的软件模块都会维护一个下挂可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点。
当客户端发送请求到负载均衡设备的时候,该设备按某种算法(比如线性轮询、按权重负载、按流量负载等)从维护的可用服务端清单中取出一台服务端端地址然后进行转发。
而客户端负载均衡和服务端负载均衡最大的不同点在于上面所提到服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些
服务端端清单来自于服务注册中心。
Ribbon入门
我们在SpringCloud中使用客户端负载均衡调用非常简单,只需要如下两步:
1)服务提供者只需要启动多个服务实例并注册到服务注册中心。
2)服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用(默认为轮询)。
1、单节点服务消费者配置
<!--1. 配置pom文件,引入spring-cloud-starter-netflix-eureka-client包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!- 2. 配置属性文件-> server.port=8001 spring.application.name=ms-provider-order #注册到eureka服务端的微服务名称 eureka.client.service-url.defaultZone=http://localhost:9000/eureka/ #注册到eureka服务端的地址 eureka.instance.prefer-ip-address=true #点击具体的微服务,右下角是否显示ip eureka.instance.instance-id=ms-provider-order-8001 #显示微服务的名称 <!- 3. 在Spring的启动入口添加@EnableDiscoveryClient注解或@EnableEurekaClient注解-> @SpringBootApplication @EnableDiscoveryClient public class EurekaProviderApplication { public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } } <!- 4. 引入Ribbon轮询配置-> @Configuration public class RibbonConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } } <!-- Controller层通过restTemplate发起请求 --> @RestController @RequestMapping("/consumer") public class EmployeeController { @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/getIpAndPort") public String getIpAndPort() { return this.restTemplate.getForObject("http://MS-PROVIDER-ORDER/order/getRegisterInfo",String.class); } @GetMapping("/log-user-instance") public String logUserInstance() { ServiceInstance serviceInstance = loadBalancerClient.choose("MS-PROVIDER-ORDER"); return serviceInstance.getServiceId() + " /"+serviceInstance.getHost()+ " /"+serviceInstance.getPort(); } }
2、集群服务消费者配置
8001端口
<!- 修改属性文件,其他与单节点一致-> server.port=8001 spring.application.name=ms-provider-order eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:9001/eureka/ eureka.instance.prefer-ip-address=true eureka.instance.instance-id=ms-provider-order-8001
8002服务端口
<!- 修改属性文件,其他与单节点一致-> server.port=8002 spring.application.name=ms-consumer-user eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:9001/eureka/ eureka.instance.prefer-ip-address=true eureka.instance.instance-id=ms-consumer-user-8002
3、@EnableDiscoveryClient与@EnableEurekaClient的区别
spring cloud的注册中心有许多实现方式,@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix。
如果选用的注册中心是eureka,推荐使用@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。