前言:Spring Cloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon 实现。经过Spring cloud的封装可以将REST请求转换成客户端负载均衡的服务调用。鉴于微服务的服务间的调用的所以Ribbon存在于所有服务中。后续还有一种基于Ribbon实现的工具 Feign。
负载均衡:缓解网络压力 ,提高处理能力保证系统服务的高可用。
服务端负载均衡分类:硬负载和软负载。硬负载:指的是在服务器节点之间安装专门用于负载均衡的设备,如F5。软负载:指的是在服务器上安装具有负载均衡功能的软件来完成请求分发,如Nginx。硬负载和软负载都属于服务端负载均衡。
客户端负载均衡:功能类似于服务端负载均衡,其区别在于维护的服务清单都各自维护着自己的访问清单(服务注册中心,如Euraka)。
1、服务在服务中心上进行注册;
2、服务消费者通过调用被@LoadBalanced修饰过的RestTemplate来实现面向服务的接口调用。
1、IClientConfig:Ribbon的客户端配置,默认采用:com.netflix.client.config.DefaultClientConfigImpl。
2、IRule:Ribbon的负载均衡策咯,默认采用:com.netflix.loadbalancer.ZoneAvoidanceRule,该策略能够在多区域环境下选出最佳区域的实例进行访问。
3、IPing:Ribbon的实例检查策咯,默认采用:com.netflix.loadbalancer.NoOpPing,该策略并不会去检查服务实例的可用性,而是默认多有服务都是可用的,始终返回true。
4、ServerList
5、ServerListFilter
6、ILoadBalancer:负载均衡器,默认采用:com.netflix.loadbalancer.ZoneAwareLoadBalancer实现,具备区域感知能力。
备注:以上几点是在没有和Euraka进行结合时的实现。
同时引用Spring Cloud Euraka和Spring Cloud Ribbon后变化项:
1、ServerList
覆盖,将服务清单交给Euraka的服务治理机制进行维护。
2、IPing:Ribbon的实例检查策咯,被 com.netflix.niws.loadbalancer.NIWSDiscoveryPing 覆盖。
两个服务提供着,一个服务消费者。
1、服务提供者可用之前的服务发现工程,添加一个controller。创建两个同样的工程,修改一下服务的端口号就可以。
@RestController
@RequestMapping("/test")
public class DemoController {
@Autowired
private DiscoveryClient discoveryClient;
/**
* @author:XingWL
* @description:测试接口
* @date: 2019/2/22 10:29
*/
@ResponseBody
@RequestMapping(value = "/testRibbonProducer",method = RequestMethod.GET)
public String testRibbon(){
ServiceInstance instance=discoveryClient.getLocalServiceInstance();
String hostMsg="";
try {
hostMsg= "Producer: host-"+instance.getHost()+",service_id-"+instance.getServiceId()+",Url-"+instance.getUri();
} catch (Exception e) {
e.printStackTrace();
hostMsg="异常";
}
return hostMsg;
}
}
2、创建一个服务消费者服务
pom.xml里添加Ribbon依赖引用。
org.springframework.cloud
spring-cloud-starter-ribbon
1.3.5.RELEASE
启动类添加注解,及给RestTemplate加上注解@LoadBalanced
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class DemoApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
添加一个controller调用服务(服务调用)
@RestController
@RequestMapping(value = "/test")
public class DemoController {
@Autowired
private RestTemplate restTemplate;
/**
* @author:XingWL
* @description:测试Ribbon负载均衡
* @date: 2019/1/28 18:07
*/
@ResponseBody
@RequestMapping(value = "/testRibbonConsummer",method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "myFallback")
public String testInf(){
String result=restTemplate.getForEntity("http://PRODUCER/producer/test/testRibbonProducer",String.class).getBody();
return result;
}
/**
* @author:XingWL
* @description:回调
* @date: 2019/2/26 18:14
*/
public String myFallback(){
String msg="断路保护";
return msg;
}
}
效果:多次请求会在两个服务间进行轮询。
SpringCloudRibbon默认实现了区域亲和策略,对服务进行区域划分
#区域划分
eureka.instance.metadata-map.zone=xxx
#断开Eureka对Ribbon服务实例的维护实现
ribbon.eureka.enabled=false
重试机制:spring cloud Eureka 实现的服务治理机制强调的是CAP原理(一致性c、可用性a、可靠性p)中的AP,zookeeper是(CP);而Eureka会因为超过85%的s实例丢失心跳而触发保护机制,注册中心会保留此时所有节点,以保证系统大多数的服务正常使用。
##开启重试机制,默认关闭状态
spring.cloud.loadbalancer.retry.enabled=true