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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。