这里写目录标题
- 一级目录
- 一 搭建自身带有负载均衡策略的消费者系统模块(首先参考我前几篇文章使用springboot实现的消费者的过程)
- 二整个用于测试的项目的整体结构
- 三 ribbon默认负载均衡策略测试
- 四修改负载均衡算法
- 1 再次修改启动类,增加一个注解@RibbonClient
- 2 增加负载均衡规则配置类
- ① 这个自定义配置类不能放在@ComponentScan或者@SpringBootApplication所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。 @RibbonClient的目的就是指定加载哪个负载配置类bean,而@ComponentScan或者@SpringBootApplication作用是所扫描的当前包下以及子包下把配置类和@service,@controller等注解的类自动加载进IOC容器,所以就无法定制化配置服务消费端。
- ② 如果想要所有ribbon客户端都使用一个负载规则,那么可以把配置类放在@ComponentScan或者@SpringBootApplication所扫描的当前包下以及子包下,启动类上的@RibbonClient也无需给定属性值!
一级目录
二级目录
三级目录
一 搭建自身带有负载均衡策略的消费者系统模块(首先参考我前几篇文章使用springboot实现的消费者的过程)
https://blog.csdn.net/liuchunhang/article/details/107383661
参考springboot实现的消费者的过程后,相对于springboot,springcloud-ribbon和springboot集成过程中需要改变的地方是:
1pom
因为要引入ribbon,所以多了三个依赖<!--eureka启动配置依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--Ribbon启动配置依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!--微服务组件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>FengboSoft</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-system-account</artifactId>
<dependencies>
<!--公共实体类API-->
<dependency>
<artifactId>eureka-common-entity</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka启动配置依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Ribbon启动配置依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--微服务组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2启动类(相对于springboot实现)
需要多加一个注解@EnableEurekaClient
package fengbo;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* Created by @author LiuChunhang on 2020/7/21.
*/
@SpringBootApplication
@EnableEurekaClient
public class AccountSystem {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(AccountSystem.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
3配置文件
1SpringBOOT的启动配置文件application.properties
改成SpringCloud的启动配置文件bootstrap..properties
2需要增加相关配置
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://eurekaserver2:9002/eureka/,http://eurekaserver1:9001/eureka/
4服务消费端配置类
需要增加一个注解 @LoadBalanced,用于在客户端实现负载均衡
package fengbo.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;
/**
* Created by @author LiuChunhang on 2020/7/21.
*/
@Configuration
public class RestTemplateBean {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
二整个用于测试的项目的整体结构
1 三个相同的服务客户端模块
module名称 server.port 端口号 spring.application.name 应用名称
eureka-client-account 8001 accountprovider
eureka-client-finance 8002 accountprovider
eureka-client-meter 8003 accountprovider
2 三个不同的数据库对应三个相同的服务客户端
Springcloud1 Springcloud2 Springcloud3
3 三个eureka服务注册中心
module名称 server.port 端口号 spring.application.name 应用名称
eureka-server-1 9001 eureka-server-1
eureka-server-2 9002 eureka-server-2
eureka-server-3 9003 eureka-server-3
4 一个实体类公共模块
eureka-common-entity
5一个eureka服务消费系统模块(与ribbon负载均衡集成)
module名称 server.port 端口号
eureka-system-account 8080
三 ribbon默认负载均衡策略测试
1业内负载均衡模式介绍
2启动三个eureka服务注册中心,三个相同服务的提供者客户端,一个带有负载均衡策略的服务消费者
3然后服务消费者在web段测试调用服务,连续请求三次,测试负载均衡是否生效
第一次访问,消费者调用的是第一个accountprovider服务提供者,第一个服务对应调用的是springcloud1数据库
第二次访问,消费者调用的是第二个accountprovider服务提供者,第二个服务对应调用的是springcloud2数据库
第三次访问,消费者调用的是第三个accountprovider服务提供者,第三个服务对应调用的是springcloud3数据库
测试基于服务消费者负载均衡策略有效,且默认的负载均衡策略是轮询法:
***RoundRobinRule:默认规则,通过简单的轮询服务列表来选择服务器***简单来说,就是按照index轮番询问注册表中的这个服务。
4常用的负载均衡算法
四修改负载均衡算法
1 再次修改启动类,增加一个注解@RibbonClient
package fengbo;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import ribbonbalance.IndividualBalance;
/**
* Created by @author LiuChunhang on 2020/7/21.
*/
@SpringBootApplication
@EnableEurekaClient
/**此注解的属性用于服务定制化负载均衡,且负载均衡配置类不能在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。*/
@RibbonClient(name = "accountprovider",configuration = IndividualBalance.class)
public class AccountSystem {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(AccountSystem.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
2 增加负载均衡规则配置类
package ribbonbalance;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by @author LiuChunhang on 2020/7/27.
*/
@Configuration
public class IndividualBalance {
@Bean
public IRule getRule(){
//指定负载均衡算法,修改为系统随机选择服务
return new RandomRule();
}
}
要知道的是