5分快3充值_Ribbon整合Eureka组件,以实现负载均衡
- 时间:
- 浏览:0
1整体框架的说明
在本案例的框架里,亲戚亲戚人们都都将配置3个 Eureka服务器,搭建3个 提供相同服务的Eureka服务提供者,一同在Eureka服务调用者里引入Ribbon组件,另3个 ,当有多个url向服务调用者发起调用请求时,整个框架能按配置在IRule和IPing中的“负载均衡策略“和“判断服务器算是可用的策略”,把什么url请求合理地分摊到多台机器上。
在下图里,亲戚亲戚人们都都能看完本系统的形态学 图,在其中,3个 服务提供者向Eureka服务器注册服务,而基于Ribbon的负载均衡器能有效地把请求分摊到不同的服务器上。
为了让亲戚亲戚人们都都更方便地跑通两种案例,亲戚亲戚人们都都将讲解全部的服务器、服务提供者和服务调用者每段的代码。在下表里,列出了本架构中的所有项目。
项目名 |
说明 |
EurekaRibbonDemo-Server |
Eureka服务器 |
EurekaRibbonDemo-ServiceProviderOne EurekaRibbonDemo-ServiceProviderTwo EurekaRibbonDemo-ServiceProviderThree |
在这还有一个 项目里,分别部署着3个 相同的服务提供者 |
EurekaRibbonDemo-ServiceCaller |
服务调用者 |
2 编写Eureka服务器
第一,在pom.xml里编写本项目还里能用到的依赖包,在其中,是通过如下的代码引入了Eureka服务器所必需的包,关键代码如下。
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-eureka-server</artifactId> 4 </dependency>
第二,在application.yml两种文件里,指定了针对Eureka服务器的配置,关键代码如下。
1 server: 2 port: 8888 3 eureka: 4 instance: 5 hostname: localhost 6 client: 7 serviceUrl: 8 defaultZone: http://localhost:8888/eureka/
在第2和第5行里,指定了本服务器所在的主机地址和端口号是localhost:8888,在第8行里,指定了默认的url是http://localhost:8888/eureka/。
第三步,在RegisterCenterApp两种服务启动应用进程里编写启动代码。
1 //省略必要的package和import代码 2 @EnableEurekaServer 3 @SpringBoot 4 Application 5 public class RegisterCenterApp 6 { 7 public static void main( String[] args ) 8 { SpringApplication.run(RegisterCenterApp.class, args); } 9 }
启动该应用进程后,能在http://localhost:8888/看完该服务器的相关信息。
3 编写Eureka服务提供者
这里有3个 服务提供者,它们均是根据以前博文中的案例EurekaBasicDemo-ServiceProvider改写而来。亲戚亲戚人们都都就拿EurekaRibbonDemo-ServiceProviderOne来举例,看下其中所含的关键每段。
第一,同样是在pom.xml里,引入了服务提供者应用进程所需的jar包,不过在其中还里能适当地修改项目名。
第二,同样是在ServiceProviderApp.java里,编写了启动应用进程,代码不变。
第三,在application.yml里,编写了针对两种服务提供者的配置信息,关键代码如下。
1 server: 2 port: 1111 3 spring: 4 application: 5 name: sayHello 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/
在第2行里,指定了本服务是运行在1111端口上,在另外的3个 服务提供者应用进程里,亲戚亲戚人们都都分别指定了它们的工作端口是2222和3333。
在第5行里,亲戚亲戚人们都都指定了服务提供者的名字是sayHello,另外3个 服务器提供者的名字同样是sayHello,正原因分析分析它们的名字都一样,一点服务调用者在请求服务时,负载均衡组件还里能有效地分摊流量。
第四,在Controller两种控制器类里,编写了防止url请求的逻辑,关键代码如下。
1 //省略了必要的package和import的代码 2 @RestController 3 public class Controller { 4 @RequestMapping(value = "/sayHello/{username}", method = RequestMethod.GET ) 5 public String hello(@PathVariable("username") String username) { 6 System.out.println("This is ServerProvider1"); 7 return "Hello Ribbon, this is Server1, my name is:" + username; 8 } 9 }
在第2行里,亲戚亲戚人们都都通过@RestController注解来说明本类承担着“控制器”的角色。在第4行里,亲戚亲戚人们都都定义了触发hello法子的url格式和Http请求的法子。在第5到第8行的hello法子里亲戚亲戚人们都都返回了3个 字符串。请亲戚亲戚人们都都注意,在第6行和第7行的代码里,亲戚亲戚人们都都能明显看出输出和返回信息是来自于1号服务提供者。
EurekaRibbonDemo-ServiceProviderTwo和EurekaRibbonDemo-ServiceProviderOne项目很类似,改动点有如下3个 。
第一,在pom.xml里,把项目名修改成EurekaRibbonDemo-ServiceProviderTwo。
第二,在application.yml里,把端口号修改成2222,关键代码如下所示。
1 server:
2 port: 2222
第三,在Controller.java的hello法子里,在输出和返回信息里,打上出“Server2“的标记,关键代码如下。
1 @RequestMapping(value = "/sayHello/{username}", method = RequestMethod.GET ) 2 public String hello(@PathVariable("username") String username) { 3 System.out.println("This is ServerProvider2"); 4 return "Hello Ribbon, this is Server2, my name is:" + username; 5 }
在EurekaRibbonDemo-ServiceProviderThree里,同样在EurekaRibbonDemo-ServiceProviderOne基础上做上述3个改动。这能不还里能在application.yml里,把端口号修改成3333,在Controller类中,同样还里能在输出和返回信息中打上“Server3”的标记。
4 在Eureka服务调用者里引入Ribbon
EurekaRibbonDemo-ServiceCaller项目是根据第三章的EurekaBasicDemo-ServiceCaller改写而来,其中的关键代码如下。
第一,在pom.xml里,倘若适当地修改项目名字,这麼修改其它代码。
第二,这麼修改启动类ServiceCallerApp.java里的代码。
第三,在application.yml了, 加带了描述服务器列表的listOfServers属性,代码如下。
1 spring: 2 application: 3 name: callHello 4 server: 5 port: 10001000 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/ 10 sayHello: 11 ribbon: 12 listOfServers: 13 http://localhost:1111/,http://localhost:2222/,http://localhost:3333
在第3行,亲戚亲戚人们都都指定了服务调用者两种的服务名是callHello,在第5里,指定了两种微服务的是运行在10001000端口上。原因分析分析服务调用者两种还里能对外界提供服务,一点内部人员应用进程能根据两种服务名和端口号,以url的形式调用其中的hello法子。
这里的关键是在第12和13行,亲戚亲戚人们都都通过ribbon.listOfServers,指定了该服务调用者能获得服务的3个 url地址,请注意,这里的3个 地址和上文里服务提供者发布服务的3个 地址是一致的。
第四,在控制器类里,用RestTemplate对象,以负载均衡的法子调用服务,代码如下。
1 //省略必要的package和import的代码 2 @RestController 3 @Configuration 4 public class Controller { 5 @Bean 6 @LoadBalanced 7 public RestTemplate getRestTemplate() 8 { return new RestTemplate(); } 9 //提供服务的hello法子 10 @RequestMapping(value = "/hello", method = RequestMethod.GET ) 11 public String hello() { 12 RestTemplate template = getRestTemplate(); 13 String retVal = template.getForEntity("http://sayHello/sayHello/Eureka", String.class).getBody(); 14 return "In Caller, " + retVal; 15 } 16 }
在两种控制器类的第7行里,亲戚亲戚人们都都通过getRestTemplate法子返回3个 RestTemplate类型对象。
RestTemplate是Spring提供的能以Rest形式访问服务的对象,两种不具备负载均衡的能力,一点亲戚亲戚人们都还里能在第6行通过@LoadBalanced注解赋予它两种能力。
在第11行的hello法子里,亲戚亲戚人们都都首先在第12行通过getRestTemplate法子得到了template对象,但是通过第13行的代码,用template对象提供的getForEntity法子,访问以前Eureka服务提供者提供的“http://sayHello/sayHello/Eureka“服务,并得到String类型的结果,最后在第14行,根据调用结果返回3个 字符串。
原因分析分析在框架里,亲戚亲戚人们都都模拟了在三台机器上部署服务的场景,而在上述服务调用者的代码里,亲戚亲戚人们都都又在template对象加带入了@LoadBalanced注解,一点在上述第13行代码里发起的请求会被均摊到三台服务器上。
还里能注意的是,这里亲戚亲戚人们都都这麼重写IRule和IPing接口,一点这里是采用了默认的RoundRobbin(也倘若轮询)的访问策略,一同将默认所有的服务器都处于可用清况 。
依次启动本框架中的Eureka服务器,三台服务提供者和服务器调用者的服务以前,在浏览器里输入http://localhost:8888/,亲戚亲戚人们都都能看完如下图所示的效果。
在其中,亲戚亲戚人们都都能看完有3个 提供服务的SAYHELLO应用实例,它们分别运行在1111,2222和3333端口上,一同,服务调用者CALLHELLO则运行在10001000端口上。
原因分析分析亲戚亲戚人们都都不断在浏览器里输入http://localhost:10001000/hello,这麼能依次看完如下所示的输出。
1 In Caller, Hello Ribbon, this is Server2, my name is:Eureka 2 In Caller, Hello Ribbon, this is Server1, my name is:Eureka 3 In Caller, Hello Ribbon, this is Server3, my name is:Eureka 4 In Caller, Hello Ribbon, this is Server2, my name is:Eureka 5 In Caller, Hello Ribbon, this is Server1, my name is:Eureka 6 In Caller, Hello Ribbon, this is Server3, my name is:Eureka 7 …
从上述输出来看,请求是以Server2,Server1和Server3的次序被均摊到三台服务器上。在每次启动服务后,原因分析分析承接请求的服务器次序会有所变化,原因分析分析下次是按Server1,Server2和Server3的次序,但每次都能看完“负载均衡”的效果。
5 重写IRule和IPing接口
这里,亲戚亲戚人们都都将在上述案例的基础上,重写IRule和IPing接口里的法子,从而实现自定义负载均衡和判断服务器算是可用的规则。
请注意,原因分析分析亲戚亲戚人们都都是在客户端,也倘若EurekaRibbonDemo-ServiceCaller两种项目调用服务,一点本每段的所有代码是写在两种项目里的。
步骤一,编写所含负载均衡规则的MyRule.java,代码如下。
1 package com.controller; //请注意两种package路径 2 省略必要的import励志的话 3 public class MyRule implements IRule {//实现IRule类 4 private ILoadBalancer lb; 5 //还里能要重写两种choose法子 6 public Server choose(Object key) { 7 //得到0到3的3个 随机数,但不包括3 8 int number = (int)(Math.random() * 3); 9 System.out.println("Choose the number is:" + number); 10 //得到所有的服务器对象 11 List<Server> servers = lb.getAllServers(); 12 //根据随机数,返回3个 服务器 13 return servers.get(number); 14 } 15 省略必要的get和set法子 16 }
在上述代码的第3行里,亲戚亲戚人们都都实现了IRule类,并在其中得第6行里,重写了choose法子。
在两种法子里,亲戚亲戚人们都都在第8行通过Math.random法子,得到了0到3之间的3个 随机数,包括0,但不包括3,并用两种随机数在第13行返回了3个 Server对象,以此实现随机选折 的效果。在实际的项目里,还还里能根据具体的业务逻辑choose法子,以实现其它的“选折 服务器”的策略。
第二步,编写判断服务器算是可用的MyPing.java,代码如下。
1 package com.controller; //也请注意两种package的路径 2 省略import励志的话 3 public class MyPing implements IPing { //这里是实现IPing类 4 //重写了判断服务器算是可用的isAlive法子 5 public boolean isAlive(Server server) { 6 //这里是生成3个 随机数,以此来判断该服务器算是可用 7 //还还里能根据服务器的相应时间等法子,判断服务器算是可用 8 double data = Math.random(); 9 if (data > 0.6) { 10 System.out.println("Current Server is available, Name:" + server.getHost() + ", Port is:" + server.getHostPort()); 11 return true; 12 } else { 13 System.out.println("Current Server is not available, Name:" + server.getHost() + ", Port is:" + server.getHostPort()); 14 return false; 15 } 16 } 17 }
在第3行里,亲戚亲戚人们都都是实现了IPing两种接口,并在第5行重写了其中的isAlive法子。
在两种法子里,亲戚亲戚人们都都是根据3个 随机数,来判断该服务器算是可用,原因分析分析可用,则返回true,如反之则返回false。请注意,这仅仅是个演示的案例,在实际项目里,亲戚亲戚人们都都基本上是无需重写isAlive法子的。
第三步,改写application.yml,在其中加带关于MyPing和MyRule的配置,代码如下。
1 spring: 2 application: 3 name: callHello 4 server: 5 port: 10001000 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/ 10 sayHello: 11 ribbon: 12 NFLoadBalancerRuleClassName: com.controller.MyRule 13 NFLoadBalancerPingClassName: com.controller.MyPing 14 listOfServers: 15 http://localhost:1111/,http://localhost:2222/,http://localhost:3333
改动点是从第10行到第13行,请注意这里的SayHello还里能和服务提供者给出的“服务名”一致,在第12和13行里,分别定义了本应用进程(也倘若服务调用者)所用到的IRule和IPing类,配置时还里能所含包名和文件名。
第四步,改写Controller.java和两种控制器类,代码如下。
1 省略必要的package和import代码 2 @RestController 3 @Configuration 4 public class Controller { 5 //以Autowired的法子引入loadBalanceerClient对象 6 @Autowired 7 private LoadBalancerClient loadBalancerClient; 8 //给RestTemplate对象加入@LoadBalanced注解 9 //以此赋予该对象负载均衡的能力 10 @Bean 11 @LoadBalanced 12 public RestTemplate getRestTemplate() 13 { return new RestTemplate(); } 14 @Bean //引入MyRule 15 public IRule ribbonRule() 16 { return new MyRule();} 17 @Bean //引入MyPing 18 public IPing ribbonpIng() 19 { return new MyPing();} 20 //编写提供服务的hello法子 21 @RequestMapping(value = "/hello", method = RequestMethod.GET ) 22 public String hello() { 23 //引入策略,这里的sayHello还里能和application.yml 24 //第10行的sayHello一致,另3个 还里能引入MyPing和MyRule 25 loadBalancerClient.choose("sayHello"); 26 RestTemplate template = getRestTemplate(); 27 String retVal = template.getForEntity("http://sayHello/sayHello/Eureka", String.class).getBody(); 28 return "In Caller, " + retVal; 29 } 1000 }
和以前的代码相比,亲戚亲戚人们都都加带了第15行和第18行的3个 法子,以此引入自定义的MyRule和MyPing3个 法子。
怎么让 ,在hello法子的第15行里,亲戚亲戚人们都都通过choose法子,为loadBalancerClient两种负载均衡对象选折 了MyRule和MyPing这还有一个 规则。
原因分析分析依次启动Eureka服务器,注册在Eureka里的3个 服务提供者和服务调用者以前,在浏览器里输入http://localhost:10001000/hello,这麼能在EurekaRibbonDemo-ServiceCaller的控制台里看完类似于如下的输出。
1 Choose the number is:1 2 Choose the number is:0 3 Current Server is not available, Name:192.168.42.1, Port is:192.168.42.1:2222 4 Current Server is available, Name:192.168.42.1, Port is:192.168.42.1:3333 5 Current Server is not available, Name:192.168.42.1, Port is:192.168.42.1:1111
第1和第2行是MyRule里的输出,而第3到第5行是MyPing里的输出,原因分析分析什么输出是和随机数有关,一点每次输出的内容何必 一致,但离米 能说明,亲戚亲戚人们都都在MyRule和MyPing里配置的相关策略是生效的,服务调用者(EurekaRibbonDemo-ServiceCaller)的多次请求在以“负载均衡”的法子下发到各服务提供者时,会引入亲戚亲戚人们都都定义在上述3个 类里的策略。