第三章:SpringCloud2.1.x,Ribbon负载均衡

一)Ribbon简介

Ribbon是一个客户端负载平衡器,支持对HTTPTCP客户端的行为进行大量控制。

Ribbon是通过RestTemplate方式实现的

 

缺点:微服务之间的交互,会需要把Rest地址写死,维护会稍微麻烦一点。

 

Ribbon负载均衡模式:

1、RoundRobinRule:默认规则,通过简单的轮询服务列表来选择服务器

2、AvailabilityFilteringRule:可用性筛选规则

3、WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,权重值有可能会决定服务器的选择

4、ZoneAvoidanceRule:该规则以区域、可用服务器为基础进行服务器选择,使用区域(Zone)对服务器进行分类

5、BestAvailableRule:忽略"短路"的服务器,并选择并发数较低的服务器

6、RandomRule:随机选择可用服务器

7、RetryRule:含有重试的选择逻辑,如果使用 RoundRobinRule 选择的服务器无法连接,那么将会重新选择服务器

 

二)Ribbon案例

第一步:创建一个Eureka注册中心

pom.xml内容:

<!-- 引入springcloud server jar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 

application.yml配置:

注:spring.application.name应用名称不能包含下划线。

# 注册中心的默认端口号, 可以随意指定一个未使用的端口
server:
    port: 8761

# 应用名称, 如不指定, 会随意默认一个名称
spring:
    application:
        name: oysept-eureka

# Erueka注册中心配置
eureka:
  instance:
    # IP地址
    hostname: localhost
  client:
    # 表示是否将自己注册到Eureka Server中,默认为true, 由于当前应用就是 Eureka Server, 故而设置为false
    registerWithEureka: false
    # 表示是否从 Eureka Server中获取注册信息, 默认为true, 因为这是一个单点的 Eureka Server, 不需要同步其它的 Eureka Server 节点的数据, 故而设置为 false
    fetchRegistry: false
    serviceUrl:
      # 设置与Eureka Server交互的地址, 查询服务和注册服务都需要依赖这个地址. 默认http://localhost:8761/eureka; 多个地址可以使用","分隔
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

Eureka注册中心main方法启动类:

package com.oysept;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * Eureka服务注册中心
 * 地址: http://localhost:8761/eureka/
 * @author ouyangjun
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

启动EurekaApplication中的main方法,然后可在浏览器中输入:http://localhost:8761查看。

注:启动Eureka注册中心之后,不需要把服务停止,后序会使用到注册中心

 

第二步:创建一个服务提供者

pom.xml内容:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
		
<!-- 引入springcloud client jar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
        
<!-- hystrix断路器 jar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

 

application.yml配置:

server:
    port: 8762
    
spring:
    application:
        name: oysept-server
        
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      # 表示需要把服务注册到Eureka注册中心上, 这里是Eureka注册中心的地址
      defaultZone: http://localhost:8761/eureka/

 

服务提供者main方法启动类:

package com.oysept;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

/**
 * 服务提供者
 * @author ouyangjun
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}

可先用8762的端口,启动EurekaApplication中的main方法,应用不要停止。然后在application.yml中修改一下端口为8763,再次启动EurekaApplication中的main方法。这样就相当于有两个服务端了。

 

在浏览器中输入:http://localhost:8761查看

 

第三步:Ribbon负载均衡案例实现

pom.xml中引入jar:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
		
<!-- 引入springcloud client jar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
        
<!-- springcloud ribbon jar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

完整的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.oysept</groupId>
    <artifactId>oysept_ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
  
    <!-- properties声明一些公共配置,该节点配置了自定义属性即可在任意地方使用,通过${}访问,形式如${java.version} -->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <!-- springboot版本信息 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>
    
    <!-- dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器 -->
    <!-- 
        说明1:如果dependencies里的dependency自己没有声明version元素,那么maven就会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,
              如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version
        说明2:如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
    -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
	
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		
        <!-- 引入springcloud client jar -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        <!-- springcloud ribbon jar -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
    </dependencies>
    
    <!-- maven打包插件,在cmd命令窗口执行,如: mvn install -U -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

application.yml配置:

server:
    port: 8764
    
spring:
    application:
        name: oysept-ribbon
        
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      # 表示需要把服务注册到Eureka注册中心上, 这里是Eureka注册中心的地址
      defaultZone: http://localhost:8761/eureka/

 

先创建一个RibbonConfig自定义配置类:

package com.oysept.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PingUrl;

@Configuration
public class RibbonConfig {

    // 检验url是否畅通
    @Bean
    public IPing ribbonPing() {
        return new PingUrl();
    }
	
    // 负载均衡模式, 默认是轮询负载
    @Bean
    public IRule ribbonRule() {
        return new BestAvailableRule();
    }
	
    // Rest服务访问方式, 支持http和tcp通信协议
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

 

创建一个Controller类,测试Ribbon负载均衡:

package com.oysept.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/ribbon")
public class RibbonController {

    @Autowired
    private RestTemplate restTemplate;
	
    // 访问地址: http://localhost:8764/ribbon/testRibbon
    @RequestMapping(value = "/testRibbon")
    public String testRibbon() {
        String msg = restTemplate.getForObject("http://OYSEPT-SERVER/demo/sendMsg?msg=testRibbon", String.class);
        System.out.println("==> testRibbon return msg: " + msg);
        return msg;
    }
}

 

Ribbon负载均衡main方法启动类:

package com.oysept;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

import com.oysept.config.RibbonConfig;

/**
 * @RibbonClient: 负载均衡注解, 表示使用RibbonConfig自定义的配置
 * @author ouyangjun
 */
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name="custom", configuration=RibbonConfig.class)
public class RibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}

启动EurekaApplication中的main方法

在浏览器中输入:http://localhost:8764/ribbon/testRibbon查看

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值