3分飞艇开奖结果_Ribbon整合Eureka组件,以实现负载均衡

  • 时间:
  • 浏览:0
  • 来源:淤青的博客 - 专注共享松果娱乐网资源

1整体框架的说明

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

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

    为了让其他同学更方便地跑通你这人 案例,其他同学将讲解完正的服务器、服务提供者和服务调用者每段的代码。在下表里,列出了本架构中的所有项目。

项目名

说明

EurekaRibbonDemo-Server

Eureka服务器

EurekaRibbonDemo-ServiceProviderOne

EurekaRibbonDemo-ServiceProviderTwo

EurekaRibbonDemo-ServiceProviderThree

在这1个项目里,分别部署着1个相同的服务提供者

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服务提供者

    这里1个服务提供者,它们均是根据以前博文中的案例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端口上,在另外的1个服务提供者多多应用程序 里,其他同学分别指定了它们的工作端口是2222和3333。

    在第5行里,其他同学指定了服务提供者的名字是sayHello,另外1个服务器提供者的名字同样是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最好的最好的方式里其他同学返回了1个字符串。请其他同学注意,在第6行和第7行的代码里,其他同学能明显看出输出和返回信息是来自于1号服务提供者。

    EurekaRibbonDemo-ServiceProviderTwo和EurekaRibbonDemo-ServiceProviderOne项目很类似于,改动点有如下1个。

    第一,在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基础上做上述1个改动。这能够能在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: 3030
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里,指定了你这人 微服务的是运行在3030端口上。不可能 服务调用者有四种 能够对外界提供服务,好多好多 实物多多应用程序 能根据你这人 服务名和端口号,以url的形式调用其中的hello最好的最好的方式。

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

    第四,在控制器类里,用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最好的最好的方式返回1个RestTemplate类型对象。

    RestTemplate是Spring提供的能以Rest形式访问服务的对象,有四种 不具备负载均衡的能力,好多好多 其他同学能够在第6行通过@LoadBalanced注解赋予它你这人 能力。

    在第11行的hello最好的最好的方式里,其他同学首先在第12行通过getRestTemplate最好的最好的方式得到了template对象,刚刚通过第13行的代码,用template对象提供的getForEntity最好的最好的方式,访问以前Eureka服务提供者提供的“http://sayHello/sayHello/Eureka“服务,并得到String类型的结果,最后在第14行,根据调用结果返回1个字符串。

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

    能够注意的是,这里其他同学没有重写IRule和IPing接口,好多好多 这里是采用了默认的RoundRobbin(也刚刚轮询)的访问策略,同时将默认所有的服务器都指在可用情况汇报。

    依次启动本框架中的Eureka服务器,三台服务提供者和服务器调用者的服务以前,在浏览器里输入http://localhost:8888/,其他同学能看后如下图所示的效果。

    在其中,其他同学能看后1个提供服务的SAYHELLO应用实例,它们分别运行在1111,2222和3333端口上,同时,服务调用者CALLHELLO则运行在3030端口上。

    

    不可能 其他同学不断在浏览器里输入http://localhost:3030/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的1个随机数,但不包括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            //根据随机数,返回1个服务器
13            return servers.get(number);        
14        }
15         省略必要的get和set最好的最好的方式
16    }

    在上述代码的第3行里,其他同学实现了IRule类,并在其中得第6行里,重写了choose最好的最好的方式。

    在你这人 最好的最好的方式里,其他同学在第8行通过Math.random最好的最好的方式,得到了0到3之间的1个随机数,包括0,但不包括3,并用你这人 随机数在第13行返回了1个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            //这里是生成1个随机数,以此来判断该服务器是否是可用 
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最好的最好的方式。

    在你这人 最好的最好的方式里,其他同学是根据1个随机数,来判断该服务器是否是可用,不可能 可用,则返回true,如反之则返回false。请注意,这仅仅是个演示的案例,在实际项目里,其他同学基本上是不不重写isAlive最好的最好的方式的。

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

1    spring:
2      application:
3        name: callHello
4    server:
5      port: 3030
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一致,那我能够引入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        }
30    }

    和以前的代码相比,其他同学上加了第15行和第18行的1个最好的最好的方式,以此引入自定义的MyRule和MyPing1个最好的最好的方式。

    某些,在hello最好的最好的方式的第15行里,其他同学通过choose最好的最好的方式,为loadBalancerClient你这人 负载均衡对象选则了MyRule和MyPing这1个规则。

    不可能 依次启动Eureka服务器,注册在Eureka里的1个服务提供者和服务调用者以前,在浏览器里输入http://localhost:3030/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)的多次请求在以“负载均衡”的最好的最好的方式收集到各服务提供者时,会引入其他同学定义在上述1个类里的策略。

本文所给出的代码均可运行,此外,本文内容摘自自己所写的专业书籍,转载时请同时引入该版权申明,请勿用于商业用途。

猜你喜欢

3分快3官方网_“五一”期间自驾短线游火爆 58万人去了图书馆

东方今报·猛犸新闻记者肖萌“五一”小长假,全省天气晴好,各大景区游客激增。一同,机会文旅深度图融合,各地旅游景区、景点文化活动更加宽裕,体验和参与项目不断增加。全省文化和旅游市

2019-10-16

极速飞艇彩神8app_性高潮时大脑都做了什么?

性高潮时大脑都做了哪几种?(东方IC供图极速飞艇彩神8app)你可能性会有一种生活错觉,认为做爱是一项纯粹的下半身运动,但我觉得,大脑才是最重要的性器官!性高潮时极速飞艇彩神8

2019-10-16

2分时时彩开户_蚊香自动断火装置,再也不用担心烧完了

天热蚊虫多,为了不被叮咬,人类想尽了各种法律法律法律法律依据来驱蚊,其2分时时彩开户中蚊香而是其中的2分时时彩开户有本身发明权权,大伙儿将除虫菊制成线香,在不删改燃烧的情况报告

2019-10-16

分分快3漏洞_博客园是个大金矿,管理员不挖掘有些可惜:给博客园提一些双赢的建议

  当前3天排行榜里排在首页的文章是,『建议』给博客园官方的另另4个多意见,这说明博客园的广大用户(也包括我)非常乐意看过博客园不断进步。  博客园在国内技术论坛里,应该说是有

2019-10-16

秒速快3开奖_ 一个动作搞定腰腹锻炼肌肉

多练练两秒速快3开奖头起可不可否帮你增强腹部肌肉的力量,增加肌肉的弹性,提高身秒速快3开奖体的协调性,一块儿亦可不可否收到保护背部和改善体态的效果。平躺秒速快3开奖于地板或床上

2019-10-16