SpringCloud Ribbon负载均衡实例解析
这篇文章主要介绍了SpringCloudRibbon负载均衡实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
SpringCloud集成了Ribbon,结合Eureka,可实现客户端的负载均衡。
下面实现一个例子,结构下图所示。
一、服务器端
1、创建项目
开发工具:IntelliJIDEA2019.2.3
IDEA中创建一个新的SpringBoot项目,名称为“cloud-server”,SpringBoot版本选择2.1.10,在选择Dependencies(依赖)的界面勾选SpringCloudDiscovert->
EurekaServer,创建完成后的pom.xml配置文件自动添加SpringCloud最新稳定版本依赖,当前为Greenwich.SR3。
pom.xml完整内容如下:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.10.RELEASE com.example cloud-server 0.0.1-SNAPSHOT cloud-server DemoprojectforSpringBoot 1.8 Greenwich.SR3 org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin
2、修改配置application.yml
server: port:8761 eureka: client: register-with-eureka:false fetch-registry:false
3、修改启动类代码CloudServerApplication.java
增加注解@EnableEurekaServer
packagecom.example.cloudserver;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
publicclassCloudServerApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(CloudServerApplication.class,args);
}
}
二、服务提供者
1、创建项目
IDEA中创建一个新的SpringBoot项目,除了名称为“cloud-provider”,其它步骤和上面创建服务器端一样。
2、修改配置application.yml
spring: application: name:cloud-provider eureka: instance: hostname:localhost client: serviceUrl: defaultZone:http://localhost:8761/eureka/
3、修改启动类代码CloudProviderApplication.java
增加注解@EnableEurekaClient;
让类在启动时读取控制台输入,决定使用哪个端口启动服务器;
增加一个测试用的控制器方法。
packagecom.example.cloudprovider;
//importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.boot.builder.SpringApplicationBuilder;
importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjavax.servlet.http.HttpServletRequest;
importjava.util.Scanner;
@SpringBootApplication
@EnableEurekaClient
@RestController
publicclassCloudProviderApplication{
publicstaticvoidmain(String[]args){
//SpringApplication.run(CloudProviderApplication.class,args);
Scannerscan=newScanner(System.in);
Stringport=scan.nextLine();
newSpringApplicationBuilder(CloudProviderApplication.class).properties("server.port="+port).run(args);
}
@RequestMapping("/")
publicStringindex(HttpServletRequestrequest){
returnrequest.getRequestURL().toString();
}
}
三、服务调用者
1、创建项目
IDEA中创建一个新的SpringBoot项目,除了名称为“cloud-invoker”,其它步骤和上面创建服务器端一样。
2、修改配置application.yml
server: port:9000 spring: application: name:cloud-invoker eureka: instance: hostname:localhost client: serviceUrl: defaultZone:http://localhost:8761/eureka/
3、修改启动类代码CloudInvokerApplication.java
增加注解@EnableDiscoveryClient。
packagecom.example.cloudinvoker;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
publicclassCloudInvokerApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(CloudInvokerApplication.class,args);
}
}
4、配置Ribbon有2种方式:使用代码、使用配置文件
方式一:使用代码
(1)新建一个自定义负载规则类MyRule.java
Ribbon的负载均衡器接口定义了服务器的操作,主要是用于进行服务器选择。
调用ILoadBalancer的getAllServers方法可以返回全部服务器,这里只返回第一个服务器。
packagecom.example.cloudinvoker;
importcom.netflix.loadbalancer.ILoadBalancer;
importcom.netflix.loadbalancer.IRule;
importcom.netflix.loadbalancer.Server;
importjava.util.List;
publicclassMyRuleimplementsIRule{
privateILoadBalanceriLoadBalancer;
@Override
publicServerchoose(Objecto){
Listservers=iLoadBalancer.getAllServers();
System.out.println("自定义服务器规则类,输出服务器信息:");
for(Servers:servers){
System.out.println(""+s.getHostPort());
}
returnservers.get(0);
}
@Override
publicvoidsetLoadBalancer(ILoadBalanceriLoadBalancer){
this.iLoadBalancer=iLoadBalancer;
}
@Override
publicILoadBalancergetLoadBalancer(){
returnthis.iLoadBalancer;
}
}
(2)新建一个Ping类MyPing.java
负载均衡器中提供了Ping机制,每隔一段时间去Ping服务器,判断服务器是否存活。
该工作由IPing接口的实现类负责。
packagecom.example.cloudinvoker;
importcom.netflix.loadbalancer.IPing;
importcom.netflix.loadbalancer.Server;
publicclassMyPingimplementsIPing{
@Override
publicbooleanisAlive(Serverserver){
System.out.println("自定义Ping类,服务器信息:"+server.getHostPort()+",状态:"+server.isAlive());
returntrue;
}
}
(3)新建配置类MyConfig.java
packagecom.example.cloudinvoker.config;
importcom.example.cloudinvoker.MyPing;
importcom.example.cloudinvoker.MyRule;
importcom.netflix.loadbalancer.IPing;
importcom.netflix.loadbalancer.IRule;
importorg.springframework.context.annotation.Bean;
publicclassMyConfig{
@Bean
publicIRulegetRule(){
returnnewMyRule();
}
@Bean
publicIPinggetPing(){
returnnewMyPing();
}
}
(4)新建配置类CloudProviderConfig.java
packagecom.example.cloudinvoker.config;
importorg.springframework.cloud.netflix.ribbon.RibbonClient;
@RibbonClient(name="cloud-provider",configuration=MyConfig.class)
publicclassCloudProviderConfig{
}
方式二:使用配置文件
把方式一的两个配置类注释掉,在application.yml的最后面添加下面配置
cloud-provider: ribbon: NFLoadBalancerRuleClassName:com.example.cloudinvoker.MyRule NFLoadBalancerPingClassName:com.example.cloudinvoker.MyPing listOfServers:http://localhost:8080/,http://localhost:8081/
5、添加控制器InvokerController.java
packagecom.example.cloudinvoker;
importorg.springframework.cloud.client.loadbalancer.LoadBalanced;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.http.MediaType;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RestController;
importorg.springframework.web.client.RestTemplate;
@RestController
@Configuration
publicclassInvokerController{
@LoadBalanced
@Bean
publicRestTemplategetRestTemplate(){
returnnewRestTemplate();
}
@RequestMapping(value="/router",method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)
publicStringrouter(){
RestTemplaterestTemplate=getRestTemplate();
//根据名称调用服务
Stringjson=restTemplate.getForObject("http://cloud-provider/",String.class);
returnjson;
}
}
四、测试
1、启动服务器端。
2、启动两个服务提供者,在控制台中分别输入8080和8081启动。
3、启动服务调用者。
4、浏览器访问http://localhost:9000/router,多次刷新页面,结果都是:
http://localhost:8081/
服务调用者项目IDEA控制台定时输出:
自定义服务器规则类,输出服务器信息: localhost:8081 localhost:8080 自定义Ping类,服务器信息:localhost:8081,状态:true 自定义Ping类,服务器信息:localhost:8080,状态:true
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。