Ribbon整合Eureka组件,以实现负载均衡

  • 时间:
  • 浏览:6

    可能在框架里,大伙儿模拟了在三台机器上部署服务的场景,而在上述服务调用者的代码里,大伙儿又在template对象加带入了@LoadBalanced注解,要是在上述第13行代码里发起的请求会被均摊到三台服务器上。

    第三,在Controller.java的hello最好的措施里,在输出和返回信息里,打上出“Server2“的标记,关键代码如下。    

EurekaRibbonDemo-Server

    第四,在控制器类里,用RestTemplate对象,以负载均衡的最好的措施调用服务,代码如下。    

    第一,在pom.xml里,把项目名修改成EurekaRibbonDemo-ServiceProviderTwo。

    第一,同样是在pom.xml里,引入了服务提供者守护进程所需的jar包,不过在其中还要适当地修改项目名。

    在你并与非 最好的措施里,大伙儿在第8行通过Math.random最好的措施,得到了0到3之间的有兩个 随机数,包括0,但不包括3,并用你并与非 随机数在第13行返回了有兩个 Server对象,以此实现随机选泽的效果。在实际的项目里,还能够根据具体的业务逻辑choose最好的措施,以实现其它的“选泽服务器”的策略。

    在EurekaRibbonDemo-ServiceProviderThree里,同样在EurekaRibbonDemo-ServiceProviderOne基础上做上述兩个改动。这里还要在application.yml里,把端口号修改成3333,在Controller类中,同样还要在输出和返回信息中打上“Server3”的标记。    

    第三步,改写application.yml,在其中加带关于MyPing和MyRule的配置,代码如下。

    可能依次启动Eureka服务器,注册在Eureka里的有兩个 服务提供者和服务调用者刚刚,在浏览器里输入http://localhost:10001000/hello,那么能在EurekaRibbonDemo-ServiceCaller的控制台里都看类式于如下的输出。    

    在第11行的hello最好的措施里,大伙儿首先在第12行通过getRestTemplate最好的措施得到了template对象,要是通过第13行的代码,用template对象提供的getForEntity最好的措施,访问刚刚Eureka服务提供者提供的“http://sayHello/sayHello/Eureka“服务,并得到String类型的结果,最后在第14行,根据调用结果返回有兩个 字符串。

    在第5行里,大伙儿指定了服务提供者的名字是sayHello,另外有兩个 服务器提供者的名字同样是sayHello,正可能它们的名字都一样,要是服务调用者在请求服务时,负载均衡组件能够有效地分摊流量。

          2        port: 2222

    

    在第2和第5行里,指定了本服务器所在的主机地址和端口号是localhost:8888,在第8行里,指定了默认的url是http://localhost:8888/eureka/。

    第四,在Controller你并与非 控制器类里,编写了避免url请求的逻辑,关键代码如下。    

    在你并与非 控制器类的第7行里,大伙儿通过getRestTemplate最好的措施返回有兩个 RestTemplate类型对象。

          1      server:

    为了让大伙儿更方便地跑通你并与非 案例,大伙儿将讲解删剪的服务器、服务提供者和服务调用者要素的代码。在下表里,列出了本架构中的所有项目。

    第一,在pom.xml里编写本项目还要用到的依赖包,在其中,是通过如下的代码引入了Eureka服务器所必需的包,关键代码如下。

    EurekaRibbonDemo-ServiceCaller项目是根据第三章的EurekaBasicDemo-ServiceCaller改写而来,其中的关键代码如下。

    请注意,可能大伙儿是在客户端,也要是EurekaRibbonDemo-ServiceCaller你并与非 项目调用服务,要是本要素的所有代码是写在你并与非 项目里的。

    启动该守护进程后,能在http://localhost:8888/都看该服务器的相关信息。

在你并与非 个项目里,分别部署着有兩个 相同的服务提供者

EurekaRibbonDemo-ServiceProviderTwo

    第四步,改写Controller.java和你并与非 控制器类,代码如下。    

EurekaRibbonDemo-ServiceCaller

    在你并与非 最好的措施里,大伙儿是根据有兩个 随机数,来判断该服务器与非 可用,可能可用,则返回true,如反之则返回false。请注意,这仅仅是个演示的案例,在实际项目里,大伙儿基本上是无需重写isAlive最好的措施的。

    在下图里,大伙儿能都看本系统的特性图,在其中,有兩个 服务提供者向Eureka服务器注册服务,而基于Ribbon的负载均衡器能有效地把请求分摊到不同的服务器上。

    从上述输出来看,请求是以Server2,Server1和Server3的次序被均摊到三台服务器上。在每次启动服务后,可能承接请求的服务器次序会有所变化,可能下次是按Server1,Server2和Server3的次序,但每次都能都看“负载均衡”的效果。

    和刚刚的代码相比,大伙儿加带了第15行和第18行的有兩个 最好的措施,以此引入自定义的MyRule和MyPing有兩个 最好的措施。

    第二,那么修改启动类ServiceCallerApp.java里的代码。

    第二,在application.yml里,把端口号修改成2222,关键代码如下所示。

    第二,在application.yml你并与非 文件里,指定了针对Eureka服务器的配置,关键代码如下。   

    这里的关键是在第12和13行,大伙儿通过ribbon.listOfServers,指定了该服务调用者能获得服务的有兩个 url地址,请注意,这里的有兩个 地址和上文里服务提供者发布服务的有兩个 地址是一致的。

    在第2行里,大伙儿通过@RestController注解来说明本类承担着“控制器”的角色。在第4行里,大伙儿定义了触发hello最好的措施的url格式和Http请求的最好的措施。在第5到第8行的hello最好的措施里大伙儿返回了有兩个 字符串。请大伙儿注意,在第6行和第7行的代码里,大伙儿能明显看出输出和返回信息是来自于1号服务提供者。

服务调用者

    第二,同样是在ServiceProviderApp.java里,编写了启动守护进程,代码不变。

    依次启动本框架中的Eureka服务器,三台服务提供者和服务器调用者的服务刚刚,在浏览器里输入http://localhost:8888/,大伙儿能都看如下图所示的效果。

    步骤一,编写中有 负载均衡规则的MyRule.java,代码如下。    

EurekaRibbonDemo-ServiceProviderOne

    RestTemplate是Spring提供的能以Rest形式访问服务的对象,并与非 不具备负载均衡的能力,要是大伙儿还要在第6行通过@LoadBalanced注解赋予它你并与非 能力。

    在其中,大伙儿能都看有有兩个 提供服务的SAYHELLO应用实例,它们分别运行在1111,2222和3333端口上,一齐,服务调用者CALLHELLO则运行在10001000端口上。

    这里,大伙儿将在上述案例的基础上,重写IRule和IPing接口里的最好的措施,从而实现自定义负载均衡和判断服务器与非 可用的规则。

    在第3行里,大伙儿是实现了IPing你并与非 接口,并在第5行重写了其中的isAlive最好的措施。

    因此 ,在hello最好的措施的第15行里,大伙儿通过choose最好的措施,为loadBalancerClient你并与非 负载均衡对象选泽了MyRule和MyPing你并与非 个规则。

    改动点是从第10行到第13行,请注意这里的SayHello还要和服务提供者给出的“服务名”一致,在第12和13行里,分别定义了本守护进程(也要是服务调用者)所用到的IRule和IPing类,配置时还要中有 包名和文件名。

    第三,在application.yml里,编写了针对你并与非 服务提供者的配置信息,关键代码如下。    

    可能大伙儿不断在浏览器里输入http://localhost:10001000/hello,那么能依次都看如下所示的输出。    

项目名

    还要注意的是,这里大伙儿那么重写IRule和IPing接口,要是这里是采用了默认的RoundRobbin(也要是轮询)的访问策略,一齐将默认所有的服务器都存在可用清况 。

    第二步,编写判断服务器与非 可用的MyPing.java,代码如下。   

    在第3行,大伙儿指定了服务调用者并与非 的服务名是callHello,在第5里,指定了你并与非 微服务的是运行在10001000端口上。可能服务调用者并与非 能够对外界提供服务,要是内部人员守护进程能根据你并与非 服务名和端口号,以url的形式调用其中的hello最好的措施。

    这里有有兩个 服务提供者,它们均是根据刚刚博文中的案例EurekaBasicDemo-ServiceProvider改写而来。大伙儿就拿EurekaRibbonDemo-ServiceProviderOne来举例,看下其中中有 的关键要素。

    在本案例的框架里,大伙儿将配置有兩个 Eureka服务器,搭建有兩个 提供相同服务的Eureka服务提供者,一齐在Eureka服务调用者里引入Ribbon组件,另有兩个 ,当有多个url向服务调用者发起调用请求时,整个框架能按配置在IRule和IPing中的“负载均衡策略“和“判断服务器与非 可用的策略”,把那些url请求合理地分摊到多台机器上。

    第三步,在RegisterCenterApp你并与非 服务启动守护进程里编写启动代码。    

    在第2行里,指定了本服务是运行在1111端口上,在另外的有兩个 服务提供者守护进程里,大伙儿分别指定了它们的工作端口是2222和3333。

Eureka服务器

    第三,在application.yml了, 加带了描述服务器列表的listOfServers属性,代码如下。     

    EurekaRibbonDemo-ServiceProviderTwo和EurekaRibbonDemo-ServiceProviderOne项目很类式,改动点有如下有兩个 。

    第一,在pom.xml里,要是适当地修改项目名字,那么修改其它代码。

    在上述代码的第3行里,大伙儿实现了IRule类,并在其中得第6行里,重写了choose最好的措施。

EurekaRibbonDemo-ServiceProviderThree

说明

    第1和第2行是MyRule里的输出,而第3到第5行是MyPing里的输出,可能那些输出是和随机数有关,要是每次输出的内容并不一致,但大约 能说明,大伙儿在MyRule和MyPing里配置的相关策略是生效的,服务调用者(EurekaRibbonDemo-ServiceCaller)的多次请求在以“负载均衡”的最好的措施架构设计 到各服务提供者时,会引入大伙儿定义在上述有兩个 类里的策略。