1、定制网站负载均衡以及
1)Ribbon是什么?
- Spring Cloud Ribbon 是基于Netflix Ribbon 定制网站实现的一套定制网站客户端负载均衡的工具。
- 简单的说,Ribbon 是 Netflix 定制网站发布的开源项目,定制网站主要功能是提供客户端定制网站的软件负载均衡算法,将 Netflix 定制网站的中间层服务连接在一起。Ribbon 定制网站的客户端组件提供一系定制网站列完整的配置项,如:连接超时、重试等。简单的说,定制网站就是在配置文件中列出 LoadBalancer (简称LB:负载均衡) 定制网站后面所有的机器,Ribbon 定制网站会自动的帮助你基于某种规则 (定制网站如简单轮询,定制网站随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法!
2)Ribbon能干嘛?
- LB,即负载均衡 (LoadBalancer) ,在微服务或分布式集群中经常用的一种应用。
- 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高用)。
- 常见的负载均衡软件有 Nginx、Lvs 等等。
- Dubbo、SpringCloud 中均给我们提供了负载均衡,SpringCloud 的负载均衡算法可以自定义。
- 负载均衡简单分类:
- 集中式LB
- 即在服务的提供方和消费方之间使用独立的LB设施,如Nginx(反向代理服务器),由该设施负责把访问请求通过某种策略转发至服务的提供方!
- 进程式 LB
- 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。
- Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址!
- 集中式LB
2、Spring Cloud 2020.0 新特性
2020是大版本,2021是在2020的基础上小的升级
参考:
https://blog.csdn.net/alisystemsoftware/article/details/111935236
https://blog.csdn.net/u013277209/article/details/111610862
-
旧版本的
spring-cloud-netflix-dependencies
管理着 所有组件,包括 Hystrix、Ribbon、Zuul、Eureka 等。而自 2020.0 版本起它有且只管理Eureka
(包括 Server 和 Client) -
Spring Cloud 2020.0.0 作为一个主要版本,带来了众多显著的变化,其中进行了一些阻断式更新(不向下兼容)
-
组件替代方案
3、集成 LoadBalancer
1)导jar包
在消费者
springcloud-consumer-dept-80
模块的 pom.xml 中导入
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
- 1
- 2
- 3
- 4
- 只需要导入
spring-cloud-starter-netflix-eureka-client
即可(父工程中有版本号)- 里面包含了
LoadBalancer
spring-cloud-starter-netflix-ribbon
这个包不需要再导入;自SpringCloud 2020起,已经舍弃了ribbon
<!-- 不需要这个包 --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.10.RELEASE</version></dependency>
- 1
- 2
- 3
- 4
- 5
- 6
2)配置Eureka
- application.yml
# 配置eurekaeureka: client: # 消费者需要从注册中心获取服务,也要连接注册中心 # 因为不是服务提供者,不需要向注册中心注册,所以为 false register-with-eureka: false # 注册中心地址 service-url: defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3)@EnableEurekaClient
主启动类加上
@EnableEurekaClient
注解,开启Eureka
@SpringBootApplication@EnableEurekaClientpublic class DepartmentConsumer_80 { public static void main(String[] args) { SpringApplication.run(DepartmentConsumer_80.class,args); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4)@LoadBalanced
自定义Spring配置类:ConfigBean.java 配置负载均衡实现RestTemplate,添加
@LoadBalanced
注解使用
RestTemplate
和RestOperations
都可以;建议用新版RestOperations
@Configurationpublic class ConfigBean { /** * @LoadBalanced 配置负载均衡实现RestTemplate */ //public RestTemplate getRestTemplate(){ // return new RestTemplate(); //} @LoadBalanced @Bean public RestOperations getRestTemplate(RestTemplateBuilder builder){ return builder.build(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
5)修改conroller
@Autowired//private RestTemplate restTemplate;// 选用 RestOperations private RestOperations restTemplate;/*** 服务提供者基础路径*///private static final String REST_URL_PREFIX = "http://localhost:8001";// 通过服务名来访问;服务名不区分大小写private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
服务名:
- 不区分大小写
- 服务名指的是服务提供者的yml文件中配置信息
spring: application: # 服务名称 name: springcloud-provider-dept
- 1
- 2
- 3
- 4
6)测试
7)多服务提供者测试
(1)新建两个服务提供者
springcloud-provider-dept-8002
和springcloud-provider-dept-8003
与
springcloud-provider-dept-8001
一样,提供同样的服务
- 三个服务提供者提供相同的服务,服务名一致
# springspring: application: # 服务名称一样 name: springcloud-provider-dept
- 1
- 2
- 3
- 4
- 5
-
不同之处
-
每个服务端口不同:分别为
8001
、8002
、8003
-
每个服务连接的数据源不同
-
需要三个数据库:
springcloud_db01
,springcloud_db02
,springcloud_db03
-
分别修改
DepartmentMapper.xml
中的SQL语句如:
insert into springcloud_db01.department(dept_name, db_source) VALUES (#{deptName},DATABASE())
连接各自的数据库
-
-
MyInfo.java
:修改服务的info信息 -
主启动类名称不同
-
(2)启动测试
- 默认为轮询算法
4、切换负载均衡算法
Ribbon 中的算法实现类有多种;但已经舍弃
- 在新版
LoadBalancer
中的算法实现类只有两种:RoundRobinLoadBalancer
,RandomLoadBalancer
;可以自定义
切换随机算法
- 在集成
LoadBalancer
成功的基础上做如下修改
1)新建配置类
官方建议:
- 不与主启动类在同级目录
- 可以建在主启动类的上级目录下;目的是不让
@SpringBootApplication
或@ComponentScan
扫描到- 不要加
@Configuration
注解
提示:
经过测试,建立同级目录下,或者加上
@Configuration
之后,也可以;但可能会造成其它问题,没有深入探究
//@Configuration 不要加这个注解public class CustomLoadBalancerConfiguration { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); System.out.println("随机============="); return new RandomLoadBalancer(loadBalancerClientFactory .getLazyProvider(name, ServiceInstanceListSupplier.class), name); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2)@LoadBalancerClient
- 在
@SpringBootApplication
能扫描的范围内设置配置RestOperations
的配置类@LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class)
@Configuration@LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class)public class ConfigBean { @LoadBalanced @Bean public RestOperations getRestTemplate(RestTemplateBuilder builder){ return builder.build(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
解析:
请求服务SPRINGCLOUD-PROVIDER-DEPT
时,执行CustomLoadBalancerConfiguration
中定义的算法
3)测试
测试前:使用meven的
clean
清理项目、清理浏览器缓存、重启注册中心、服务提供者、服务消费者