spring cloud学习之四:客户端负载均衡Spring Cloud Ribbon

前言:Spring Cloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon 实现。经过Spring cloud的封装可以将REST请求转换成客户端负载均衡的服务调用。鉴于微服务的服务间的调用的所以Ribbon存在于所有服务中。后续还有一种基于Ribbon实现的工具 Feign

1、了解负载均衡

负载均衡:缓解网络压力 ,提高处理能力保证系统服务的高可用。

服务端负载均衡分类:硬负载和软负载。硬负载:指的是在服务器节点之间安装专门用于负载均衡的设备,如F5。软负载:指的是在服务器上安装具有负载均衡功能的软件来完成请求分发,如Nginx。硬负载和软负载都属于服务端负载均衡。

客户端负载均衡:功能类似于服务端负载均衡,其区别在于维护的服务清单都各自维护着自己的访问清单(服务注册中心,如Euraka)。

2、实现客户端负载步骤:(Spring cloud)

1、服务在服务中心上进行注册;

2、服务消费者通过调用被@LoadBalanced修饰过的RestTemplate来实现面向服务的接口调用。

3、spring Cloud Ribbon自动实现接口

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:服务实例清单的维护机制,默认采用:com.netflix.loadbalancer.ConfigurationBasedServerList

5、ServerListFilter:服务实例清单过滤机制,默认采用:org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter实现,该策略能够优先过滤出与请求调用方法处于同一区域的服务实例

6、ILoadBalancer:负载均衡器,默认采用:com.netflix.loadbalancer.ZoneAwareLoadBalancer实现,具备区域感知能力。

备注:以上几点是在没有和Euraka进行结合时的实现。

同时引用Spring Cloud Euraka和Spring Cloud Ribbon后变化项:

1、ServerList:服务实例清单的维护机制,被 com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList

覆盖,将服务清单交给Euraka的服务治理机制进行维护。

2、IPing:Ribbon的实例检查策咯,被 com.netflix.niws.loadbalancer.NIWSDiscoveryPing 覆盖。

4、准备工作

两个服务提供着,一个服务消费者。

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

 


 

 

 

你可能感兴趣的:(spring,cloud)