Spring Cloud负载均衡之Ribbon以及RestTemplate

一:RestTemplate简介

  1. 简介
           RestTemplate是Spring Resources中一个访问第三方RESTful API接口的网络请求框架。
    RestTemplate的设计原则和其它Spring Template(例如JdbcTemplate,JmsTemplate)类似,
    都是为执行复杂任务提供了一个具有默认行为的简单方法。
           RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的Http
    协议的一些方法紧密相连,例如HEAD,GET,POST,PUT,DELETE和OPTIONS等方法,这些方
    法在RestTemplate类对应的方法为headForHeaders(),getForObject(),postForObject(),put(),
    和delete()等。
            RestTemplate的使用很简单,它支持Xml,JSON数据格式,默认实现了序列化,可以自动
    将JSON字符串转换为实体。例如:User user == restTemplate.getForObject(url,User.class).。     

二:Ribbon简介

  1. 简介
           Ribbon是Netflix公司开源的一个负载均衡的组件,它是将负载均衡逻辑以代码的形式封装
    到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列
    表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。所以它是一个
    服务消费者客户端的负载均衡组件。
  2.  使用方式
            a:和RestTemplate相结合
            b:和Feign相结合。Feign已经默认集成了Ribbon。              

三:Ribbon负载均衡的实例

  1. 一个chapter5-2父类,主要是pom.xml文件,用来定义要继承的springboot和springcloud的版本号
         
          pom.xml文件内容如下:
         
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.kgf</groupId>
      <artifactId>chapter5-2</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>pom</packaging>
      <name>chapter5-2</name>
      
      <!--继承一个父模块,然后再引入相应的依赖  -->
      <parent>
      	  <groupId>org.springframework.boot</groupId>
    	  <artifactId>spring-boot-starter-parent</artifactId>
    	  <version>2.0.3.RELEASE</version>
    	  <!--relativePath是可选的,maven会首先搜索这个地址,在搜索本地远程repositories之前  -->
    	  <relativePath />
      </parent>
      
      <properties>
      	 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      	 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      	 <java-version>1.8</java-version>
      	 <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
      </properties>
      
      <!--下面的方式通过import可以实现多继承的问题  -->
      <dependencyManagement>
      	<dependencies>
      	    <dependency>
    	  		<groupId>org.springframework.cloud</groupId>
    		    <artifactId>spring-cloud-dependencies</artifactId>
    		    <version>${spring-cloud.version}</version>
    		    <type>pom</type>
    		    <scope>import</scope>
      	    </dependency>
      	</dependencies>
      </dependencyManagement>
      <modules>
      	<module>eureka-server</module>
      	<module>eureka-client</module>
      	<module>eureka-ribbon-client</module>
      </modules>
    </project>
     
  2. 一个eureka-server子服务,这个是eureka的服务端,用来给其他微服务注册列表信息
         
         ⑴EurekaServerApplication.java启动类
                
         ⑵application.yml配置文件
                
    spring:
      profiles:
        active: dev  #这里我们默认启用dev环境
    
    ---
    spring:
      profiles: dev  #环境一
    server: 
      port: 8761
    eureka:
      instance:
        hostname: peer1  #环境一服务名
      client:
        register-with-eureka: false
        fetch-registry: false
          
    ---
    spring:
      profiles: test #环境二
    server:
      port: 8762
    eureka:
      instance:
        hostname: peer2  #环境二服务名
      client:
        service-url: #将peer2注册进入peer1
          defaultZone: http://peer1:8761/eureka/

          ⑶pom.xml文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>com.kgf</groupId>
        <artifactId>chapter5-2</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>eureka-server</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>eureka-server</name>
      
      <dependencies>
    	    <!-- 引入eureka-server依赖 --> 
    	  	<dependency>
    	  		<groupId>org.springframework.cloud</groupId>
    	  		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    	  	</dependency>
    	  	
    	  	 <!-- 引入test测试依赖 --> 
    	  	<dependency>
    	  		<groupId>org.springframework.boot</groupId>
    	  		<artifactId>spring-boot-starter-test</artifactId>
    	  		<scope>test</scope><!--表示仅仅在测试的时候编译  -->
    	  	</dependency>
      </dependencies>
      
      <build>
      	  <plugins>
      	         <!--能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用  -->
      	  		<plugin>
      	  			<groupId>org.springframework.boot</groupId>
    	  			<artifactId>spring-boot-maven-plugin</artifactId>
      	  		</plugin>
      	  </plugins>
      </build>
    </project>

     

  3.   一个eureka-client子服务,作为微服务的客户端,也就是微服务的提供者
         
         ⑴EurekaClientApplication.java启动类
               
          ⑵bootstrap.yml配置文件,这个里面存在两个环境,我们到时候需要启动两个消费者服务
                
            ⑶HiController.java类
                  
            ⑷pom.xml文件
                  
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>com.kgf</groupId>
        <artifactId>chapter5-2</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>eureka-client</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>eureka-client</name>
      
       <dependencies>
    	    <!-- 引入eureka依赖 --> 
    	  	<dependency>
    	  		<groupId>org.springframework.cloud</groupId>
    	  		<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    	  	</dependency>
    	  	<dependency>
    	  		<groupId>org.springframework.boot</groupId>
    	  		<artifactId>spring-boot-starter-web</artifactId>
    	  	</dependency>
    	  	 <!-- 引入test测试依赖 --> 
    	  	<dependency>
    	  		<groupId>org.springframework.boot</groupId>
    	  		<artifactId>spring-boot-starter-test</artifactId>
    	  		<scope>test</scope><!--表示仅仅在测试的时候编译  -->
    	  	</dependency>
       </dependencies>
       
       <build>
      	  <plugins>
      	         <!--能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用  -->
      	  		<plugin>
      	  			<groupId>org.springframework.boot</groupId>
    	  			<artifactId>spring-boot-maven-plugin</artifactId>
      	  		</plugin>
      	  </plugins>
      </build>
    </project>

     

  4.   一个eureka-ribbon-client子服务,用来作为一个服务的消费者,负载均衡的请求入口
         
         ⑴EurekaRibbonClientApplication.java启动类
               
         ⑵RibbonConfig.java注入负载均衡的restTemplate对象
               
         ⑶application.yml配置文件
                
         ⑷RibbonController.java层
                
         ⑸RibbonService.java层,这个类里面通过RestTemplate远程调用工具远程调用eureka-client子服务提供者
             中的方法。
                 
         ⑹pom.xml文件
                
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>com.kgf</groupId>
        <artifactId>chapter5-2</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>eureka-ribbon-client</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>eureka-ribbon-client</name>
      <dependencies>
      	 	<dependency>
      	 	   <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      	 	</dependency>
      	 	<dependency>
      	 	   <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      	 	</dependency>
      	 	<dependency>
      	 	   <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
      	 	</dependency>
      </dependencies>
    </project>

     

  5.  启动微服务查看效果
       ⑴首先我们启动一个eureka-server服务,用来做微服务的服务注册的,端口为8761    
              
       ⑵启动两个eureka-client微服务的提供者应用程序,用来给消费者调用,端口分别为8762,8763
            命令如下:
               java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 
               java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
             

       ⑶启动eureka-ribbon-client微服务的消费者客户端,这个可以对请求做负载均衡,端口为8764
              可以发现每一次访问都是轮循访问8762,8763两个端口的微服务
                
                
  6. 总结
         通过上面实例我们可以知道,在SpringCloud项目中,负载均衡器Ribbon会默认从Eureka Client的服务
     列表中获取服务信息,并且缓存一份。根据缓存的服务注册列表信息,可以通过LoadBalancerClient来选
     择不同的服务实例,从而实现负载均衡。如果禁止Ribbon从Eureka获取注册列表信息,则需要自己去维护
    一份服务注册列表信息。根据自己维护服务注册列表的信息,Ribbon也可以实现负载均衡。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值