Spring Cloud 之Ribbon核心组件IRule的使用及自定义负载均衡算法

一、IRule 常见的API

Ribbon核心组件IRule中常见的几个算法API,一般情况下,这几个API已经可以满足实际的业务需求了,如下:
API说明
RoundRobinRule广为人知和最基本的负载平衡策略,即轮询算法。(是Ribbon默认的负载均衡机制)
RandomRule一种随机分配现有流量的负载平衡策略,即随机访问算法
RetryRule先按照 RoundRobinRule 的策略访问服务,如果访问的服务宕机或者出现异常的情况,则在指定时间内会进行重试,访问其它可用的服务
BestAvailableRule首先会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务访问
ZoneAvoidanceRule默认规则,复合判断server所在区域的性能和server的可用性选择服务器
AvailabilityFilteringRule首先会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule

Ribbon 默认的是 RoundRobinRule 轮询算法

二、实现随机访问策略 RandomRule ,一种随机分配现有流量的负载平衡策略

1、新建Eureka服务注册容器项目 springcloud-deepeureka

1.1、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>cn.com.qihang.cloud</groupId>
  <artifactId>springcloud-deepeureka</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>springcloud-deepeureka</name>
  <url>http://maven.apache.org</url>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--spring cloud依赖管理-->
    <!-- 引入spring cloud的依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Edgware.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2、启动类

@SpringBootApplication
@EnableEurekaServer
public class DeppEurekaApplication 
{
    public static void main( String[] args )
    {
        SpringApplication.run(DeppEurekaApplication.class, args);
    }
}

1.3、配置文件

server:
  port: 8081
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8081/eureka/

2、数据提供服务 springcloud-user

2.1、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>cn.com.qihang.cloud</groupId>
  <artifactId>springcloud-user</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>springcloud-user</name>
  <url>http://maven.apache.org</url>
<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<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>
	</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Edgware.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> 
			</dependency> -->
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2.2、数据库实体对象

@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column
  private String username;

  @Column
  private String name;

  @Column
  private Short age;

  @Column
  private BigDecimal balance;

  public Long getId() {
    return this.id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return this.username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Short getAge() {
    return this.age;
  }

  public void setAge(Short age) {
    this.age = age;
  }

  public BigDecimal getBalance() {
    return this.balance;
  }

  public void setBalance(BigDecimal balance) {
    this.balance = balance;
  }
}

2.3、Repository数据库层

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}

2.4、Controller层

@RestController
public class UserController {

  @Autowired
  private UserRepository userRepository;

  @GetMapping("/simple/{id}")
  public User findById(@PathVariable Long id) {
    return this.userRepository.findOne(id);
  }
}

2.5、数据库和数据

schema.sql
drop table user if exists;
create table user(
	id bigint generated by default as identity,
	username varchar(40),
	name varchar(20),
	age int(3),
	balance decimal(10,2), 
	primary key(id)
);
data.sql
insert into user(id,username, name, age, balance) values(1,'user1', '张三', 20, 100.00);
insert into user(id,username, name, age, balance) values(2,'user2', '李四', 20, 100.00);
insert into user(id,username, name, age, balance) values(3,'user3', '王五', 20, 100.00);
insert into user(id,username, name, age, balance) values(4,'user4', '马六', 20, 100.00);

2.6、配置application.yml

server:
  port: 7909
spring:
  jpa:
    generate-ddl: false
    show-sql: true
    hibernate:
      ddl-auto: none
  datasource:
    platform: h2
    schema: classpath:schema.sql
    data: classpath:data.sql
  application:
    name: springcloud-user
logging:
  level:
    root: INFO
    org.hibernate: INFO
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
    com.itmuch: DEBUG
eureka:
  client:
    healthcheck:
      enabled: true
    serviceUrl:
      defaultZone: http://localhost:8081/eureka
  instance:
    prefer-ip-address: true
项目结构

在这里插入图片描述

3、Ribbon负载均衡项目 springcloud-ribbon

3.1、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>cn.com.qihang.cloud</groupId>
	<artifactId>springcloud-ribbon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springcloud-ribbon</name>
	<url>http://maven.apache.org</url>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<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>
	</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Edgware.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>


		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

3.2、对象数据封装

public class User {
  private Long id;

  private String username;

  private String name;

  private Short age;

  private BigDecimal balance;

  public Long getId() {
    return this.id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return this.username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Short getAge() {
    return this.age;
  }

  public void setAge(Short age) {
    this.age = age;
  }

  public BigDecimal getBalance() {
    return this.balance;
  }

  public void setBalance(BigDecimal balance) {
    this.balance = balance;
  }

}

3.3、Controller访问

@RestController
public class RibbonController {
  @Autowired
  private RestTemplate restTemplate;
  @Autowired
  private LoadBalancerClient loadBalancerClient;

  @GetMapping("/user/{id}")
  public User findById(@PathVariable Long id) {
    // http://localhost:7900/simple/
    // VIP virtual IP
    // HAProxy Heartbeat
    return this.restTemplate.getForObject("http://springcloud-user/simple/" + id, User.class);
  }
}

3.4、随机分配访问数据Configuration

@Configuration
public class ConfigBean {
	
	@Bean
	@LoadBalanced
	public RestTemplate getRestTemplate()
	{
		return new RestTemplate();
	}
	
	@Bean
	public IRule randomIRule() {
		return new RandomRule();
	}
}

3.5、启动类 :注解@RibbonClient(name = “springcloud-user”,configuration = ConfigBean.class);使用随机访问策略

注意:这里的ConfigBean不能在@ComponentScan注解扫描包及子包下
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "springcloud-user",configuration = ConfigBean.class)
public class ConsumerRibbonApplication {

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

3.6、配置application.yml

server:
  port: 8010
spring:
  application:
    name: springcloud-ribbon
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8081/eureka/
  instance:
    prefer-ip-address: true

项目结构

在这里插入图片描述

三、启动项目测试

依次启动Eureka项目springcloud-deepeureka
在启动Ribbon项目springcloud-ribbon
再启动两个数据提供项目springcloud-user
如何启动两个数据提供项目可以参照我的上一篇博客:https://blog.csdn.net/qq_34195507/article/details/100601290

四、访问查看结果

4.1、访问Eureka查看http://localhost:8081/

在这里插入图片描述

4.2、重复访问Ribbon数据请求分流接口http://localhost:8010/user/1

在这里插入图片描述

数据一端口 7900 访问次数如下:
2019-09-09 10:49:15.591  INFO 12628 --- [nio-7900-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 21 ms
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:17.190 TRACE 12628 --- [nio-7900-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:17.202 TRACE 12628 --- [nio-7900-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:17.204 TRACE 12628 --- [nio-7900-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:17.205 TRACE 12628 --- [nio-7900-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:17.205 TRACE 12628 --- [nio-7900-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:33.511 TRACE 12628 --- [nio-7900-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:33.512 TRACE 12628 --- [nio-7900-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:33.512 TRACE 12628 --- [nio-7900-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:33.513 TRACE 12628 --- [nio-7900-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:33.513 TRACE 12628 --- [nio-7900-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:42.805 TRACE 12628 --- [nio-7900-exec-6] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:42.805 TRACE 12628 --- [nio-7900-exec-6] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:42.806 TRACE 12628 --- [nio-7900-exec-6] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:42.806 TRACE 12628 --- [nio-7900-exec-6] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:42.806 TRACE 12628 --- [nio-7900-exec-6] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:51:41.059 TRACE 12628 --- [nio-7900-exec-4] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:51:41.060 TRACE 12628 --- [nio-7900-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:51:41.060 TRACE 12628 --- [nio-7900-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:51:41.060 TRACE 12628 --- [nio-7900-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:51:41.060 TRACE 12628 --- [nio-7900-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:51:42.004 TRACE 12628 --- [nio-7900-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:51:42.004 TRACE 12628 --- [nio-7900-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:51:42.005 TRACE 12628 --- [nio-7900-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:51:42.005 TRACE 12628 --- [nio-7900-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:51:42.005 TRACE 12628 --- [nio-7900-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:51:42.885 TRACE 12628 --- [nio-7900-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
数据二端口 7909 访问次数如下:
2019-09-09 10:49:36.657  INFO 10896 --- [nio-7909-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 23 ms
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:36.719 TRACE 10896 --- [nio-7909-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:36.729 TRACE 10896 --- [nio-7909-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:36.730 TRACE 10896 --- [nio-7909-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:36.731 TRACE 10896 --- [nio-7909-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:36.731 TRACE 10896 --- [nio-7909-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:45.001 TRACE 10896 --- [nio-7909-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:45.001 TRACE 10896 --- [nio-7909-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:45.002 TRACE 10896 --- [nio-7909-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:45.002 TRACE 10896 --- [nio-7909-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:45.003 TRACE 10896 --- [nio-7909-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:49:48.877 TRACE 10896 --- [nio-7909-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:49:48.878 TRACE 10896 --- [nio-7909-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]
2019-09-09 10:49:48.878 TRACE 10896 --- [nio-7909-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-09-09 10:49:48.878 TRACE 10896 --- [nio-7909-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-09-09 10:49:48.878 TRACE 10896 --- [nio-7909-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [user1]
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-09-09 10:51:43.424 TRACE 10896 --- [nio-7909-exec-4] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-09-09 10:51:43.425 TRACE 10896 --- [nio-7909-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [SMALLINT]) - [20]

4.3、根据以上访问情况对比,体现出了Ribbon负载均衡的随机算法策略

五、现在演示负载既有Ribbon的轮询策略也有自定义的随机策略

5.1、修改Ribbon项目springcloud-ribbon的RibbonController 类

@RestController
public class RibbonController {
  @Autowired
  private RestTemplate restTemplate;
  @Autowired
  private LoadBalancerClient loadBalancerClient;

  @GetMapping("/user/{id}")
  public User findById(@PathVariable Long id) {
    // http://localhost:7900/simple/
    // VIP virtual IP
    // HAProxy Heartbeat
    return this.restTemplate.getForObject("http://springcloud-user/simple/" + id, User.class);
  }

  @GetMapping("/test")
  public String test() {
    ServiceInstance serviceInstance = this.loadBalancerClient.choose("springcloud-user");
    System.out.println("111" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());

    ServiceInstance serviceInstance2 = this.loadBalancerClient.choose("springcloud-user2");
    System.out.println("222" + ":" + serviceInstance2.getServiceId() + ":" + serviceInstance2.getHost() + ":" + serviceInstance2.getPort());

    return "测试Ribbon负载流";
  }
}

5.2、在原有启动数据的项目上更改配置后在重新启动两个数据提供项目

修改端口号和应用名,保存配置文件后启动

在这里插入图片描述

可以看到启动运行的项目目录

在这里插入图片描述

5.3、访问测试查看

访问Eureka服务注册:可以看到Springcloud-user启动了两个;Springcloud-user2启动了两个

在这里插入图片描述

重复刷新多次Ribbon的数据访问接口

在这里插入图片描述

这时在多次请求test查看后台打印结果

在这里插入图片描述

111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7909
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7987
222:springcloud-user2:172.22.219.239:7900

5.4、根据以上test的接口请求来看user和user2都是随机的策略;这里原因在于我把ConfigBean.java与ConsumerRibbonApplication.java写在了同级包目录了

修改ConfigBean.java包
@Configuration
public class ConfigBean {
		
	@Bean
	public IRule randomIRule() {
		return new RandomRule();
	}
}
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "springcloud-user",configuration = ConfigBean.class)
public class ConsumerRibbonApplication {

	
	 @Bean
	  
	  @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate();
	  }
	

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

在这里插入图片描述

启动Ribbon再次请求test测试
2019-09-09 14:29:23.099  INFO 13304 --- [erListUpdater-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: springcloud-user2.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7987
222:springcloud-user2:172.22.219.239:7909
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7909
111:springcloud-user:172.22.219.239:7987
222:springcloud-user2:172.22.219.239:7900
111:springcloud-user:172.22.219.239:7988
222:springcloud-user2:172.22.219.239:7909
111:springcloud-user:172.22.219.239:7987
222:springcloud-user2:172.22.219.239:7900
从以上打印结果可以看出 user的请求是随机的;user2的访问是轮询的
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值