上篇学习Zuul的时候,点开pom发现它是依赖客户端负载平衡 (Ribbon)和断路器 (Hystrix)实现的,今天来学习下Ribbon。
什么是Ribbon呢?
SpringCloud Ribbon是SpringCloud基于Netfix Ribbon实现的一套客户端负载均衡工具。
负载均衡分为两种:
集中式LB:(中间件决定调用哪个服务提供节点)
在服务提供端和请求端之间有一个中间件,负责把请求端的访问请求通过某种策略转发至服务的提供端。比如F5、nginx等。
进程内LB:(客户端决定调用哪个服务提供节点)
就是在请求端决定调用哪个提供端。消费方从服务注册中心获知哪些地址可用,然后再从这些地址中选出一个合适的服务器,如ribbon。
在项目中,客户端发起请求后,通过ribbon这个类库,根据给定的策略去注册中心的地址列表中获取到服务提供端的地址,这就是Ribbon的作用。
Ribbon与Eureka整合后,客户端能够可以直接通过微服务名称调用服务,而不用关心地址和端口,和上篇的Zuul一样哈,因为Zuul就是基于ribbon实现的。
用代码实现一下请求客户端通过Ribbon去实现调用一个服务的两个节点,并配置负载均衡策略。
一、提供两个服务节点,代码就和eureka client一样,不过发布两个新服务
1.发布
"/app") (publicStringadmin() { return"application-one:8005"; } // 配置文件改变下端口server.port=8005"/app") (publicStringadmin() { return"application-two:8006"; } server.port=8006
2.配置文件
#注意spring.application.name要一样spring.application.name=applicationserver.port=8005#instance-id不能一样eureka.instance.instance-id=application-oneeureka.client.service-url.defaultZone=http://172.23.13.15:8881/eureka/eureka.client.register-with-eureka=trueeureka.client.fetch-registry=true
确保两个节点都注册到eureka Server 上,如图:
图片
二、建立Ribbon子项目
1.pom.xml
<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.xing</groupId><artifactId>StudyCloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>StudyCloud-ribbon</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!--web组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--eurekaclient组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--加入ribbon的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency></dependencies></project>
2.启动类,发布服务也写到这了
packagecom.xing.study.cloud.ribbon; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.cloud.client.discovery.EnableDiscoveryClient; importorg.springframework.cloud.netflix.eureka.EnableEurekaClient; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.RestController; importorg.springframework.web.client.RestTemplate; /*** @author rt*/publicclassRibbonApplication { finalRestTemplaterestTemplate; publicRibbonApplication(RestTemplaterestTemplate) { this.restTemplate=restTemplate; } value="/ribbon", method=RequestMethod.GET) (publicStringribbon(){ returnrestTemplate.getForEntity("http://application/app", String.class).getBody(); } publicstaticvoidmain(String[] args) { SpringApplication.run(RibbonApplication.class, args); } }
注意用EnableDiscoveryClient注解启动。
3.配置@LoadBalanced启动负载均衡
packagecom.xing.study.cloud.ribbon; importorg.springframework.cloud.client.loadbalancer.LoadBalanced; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.web.client.RestTemplate; /*** @author rt*/publicclassRibbonConfig { publicRestTemplaterestTemplate() { returnnewRestTemplate(); } }
4.启动Ribbon项目,然后访问/ribbon,看看能不能调用到application
再次刷新
完美!多次刷新可以直观的看到会分别调用两个服务节点,这是因为默认的策略就是轮询,下面我们看下有哪些策略。
三、策略直接看源码把
IRule接口的实现类中提供了多个策略。
直接网上搜了一个说明:
1.要使用对应的策略,直接这么写就行:
publicIRuleiRule(){ returnnewRandomRule(); }
上面这个配置了随机策略,重启后测试不停刷新就可以看到不会是两个节点轮询啦,换成了随机调用。
2.自定义策略直接继承AbstractLoadBalancerRule抽象类就行
害,我是写不出啥好策略,直接拷贝轮询的源码测试一下
测试发现不随机了,变回了轮询策略,只不过这回是我自定义的轮询策略。
总结:
在客户端决定调用哪个注册中心地址列表中的服务,从而在客户端实现了负载均衡。
END