一、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的访问是轮询的