1.什么是Ribbon
目前主流的负载方案分为以下两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如Nginx)。
客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。
Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超
时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
springCloud alibaba 版本
- #properties 写入下面版本
- <spring-boot.version>2.3.2.RELEASE</spring-boot.version>
- <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
- <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
-
-
- #导入dependency依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>${spring-cloud-alibaba.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- server:
- port: 12000
- spring:
- application:
- name: stockserv
- cloud:
- nacos:
- discovery:
- server-addr: 192.168.64.200:8848
- username: nacos
- password: nacos
- namespace: public
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
编写订单的配置文件
- @Configuration
- public class RemoteConfig {
- @Bean
- public RestTemplate getAjax(){
- return new ResTemplate;
- }
- }
- 浏览器输入地址
-
- http://localhost:1201/order-server/addorder
负载均衡
http://localhost:1201/order-server/addorder
轮询策略
- 轮询
- 区域轮询
- 区域分区
- 从事轮询
- 线性轮询
- #Application中上面加这个注解
- @RibbonClients(value={
- @RibbonClient(name="stockserv",configuration= RibbonRule.class)
- })
-
-
- #不在applicaiton目录下 新建实体类RibbonRule
- @Configuration
- public class RibbonRule {
- //手动权重
- @Bean
- public IRule iRule(){
- return new NacosRule();
- }
- }
- yum里面配置
- stockserv:
- ribbon:
- NFloadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
--------------注意2种方法不能一起写*--------------
- #类似规则引擎。。。。。。。
- #自定义负载策略
-
- public class MyNacosRule extends AbstractLoadBalancerRule {
-
- @Autowired
- private NacosDiscoveryProperties nacosDiscoveryProperties;
-
- @Override
- public void initWithNiwsConfig(IClientConfig iClientConfig) {
-
- }
-
- @Override
- public Server choose(Object o) {
- //从注册中心上获取动态服务列表
- DynamicServerListLoadBalancer lb= (DynamicServerListLoadBalancer)getLoadBalancer();
- //获取服务名
- String serverName = lb.getName();
- //构建服务名实例
- NamingService ns = nacosDiscoveryProperties.namingServiceInstance();
- //nacos基于权重的算法
- try {
- Instance instance = ns.selectOneHealthyInstance(serverName);
- //放入服务器
- return new NacosServer(instance);
- } catch (NacosException e) {
- e.printStackTrace();
- }
- //如果出现问题 则返回用户null
- return null;
- }
- }
-
配置yum
- stockserv:
- ribbon:
- NFloadBalancerRuleClassName: com.kgc.mynacos.rrules.custrules.MyNacosRule
- #1 controller配置系统权重
-
- #controller层 注意(configuration= RibbonRule.class 中修改为RibbonRule)
- #
- @SpringBootApplication
- //@RibbonClients(value={
- // @RibbonClient(name="stockserv",configuration= RibbonRule.class)
- //})
- public class OrderApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class,args);
- }
- }
-
- #rules层 提供系统自带的权重 rules的位置不要和application一级
-
- @Configuration
- public class RibbonRule {
- //手动权重
- @Bean
- public IRule iRule(){
- // return new NacosRule();
- //自动权重
- return new RandomRule();
- }
- }
-
-
-
- #2 controller配置自定义权重
- #controller层
- 注意(configuration= MyNacosRule.class 中修改为MyNacosRule)
- #
- @SpringBootApplication
- //@RibbonClients(value={
- // @RibbonClient(name="stockserv",configuration= MyNacosRule.class)
- //})
- public class OrderApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class,args);
- }
- }
-
- #rules层
- #提供自定义的权重 rules的位置不要和application一级
- #-----------------------------
- public class MyNacosRule extends AbstractLoadBalancerRule {
-
- @Autowired
- private NacosDiscoveryProperties nacosDiscoveryProperties;
-
-
-
- @Override
- public Server choose(Object o) {
- //从注册中心上获取动态服务列表
- DynamicServerListLoadBalancer lb= (DynamicServerListLoadBalancer)getLoadBalancer();
- //获取服务名
- String serverName = lb.getName();
- //构建服务名实例
- NamingService ns = nacosDiscoveryProperties.namingServiceInstance();
- //nacos基于权重的算法
- try {
- Instance instance = ns.selectOneHealthyInstance(serverName);
- //放入服务器
- return new NacosServer(instance);
- } catch (NacosException e) {
- e.printStackTrace();
- }
- //如果出现问题 则返回用户null
- return null;
- }
-
- @Override
- public void initWithNiwsConfig(IClientConfig iClientConfig) {
-
- }
- }
- #1 yum 中配置系统权重 (这个暂时不能用 )
- 注意(RibbonRule类别写错 NFLoadBalancerRuleClassName 这个注意大小写)
- stockserv:
- ribbon:
- NFLoadBalancerRuleClassName: com.kgc.mynacos.rrules.custrules.RibbonRule
-
- #rules层 提供系统自带的权重 rules的位置不要和application一级
-
- @Configuration
- public class RibbonRule {
- //手动权重
- @Bean
- public IRule iRule(){
- // return new NacosRule();
- //自动权重
- return new RandomRule();
- }
- }
-
-
- #2 yum 中配置自定义权重 注意(MyNacosRule类别写错 NFLoadBalancerRuleClassName 这个注意大小写)
- stockserv:
- ribbon:
- NFLoadBalancerRuleClassName: com.kgc.mynacos.rrules.custrules.MyNacosRule
-
- #rules层
- #提供自定义的权重 rules的位置不要和application一级
- #-----------------------------
- public class MyNacosRule extends AbstractLoadBalancerRule {
-
- @Autowired
- private NacosDiscoveryProperties nacosDiscoveryProperties;
-
-
-
- @Override
- public Server choose(Object o) {
- //从注册中心上获取动态服务列表
- DynamicServerListLoadBalancer lb= (DynamicServerListLoadBalancer)getLoadBalancer();
- //获取服务名
- String serverName = lb.getName();
- //构建服务名实例
- NamingService ns = nacosDiscoveryProperties.namingServiceInstance();
- //nacos基于权重的算法
- try {
- Instance instance = ns.selectOneHealthyInstance(serverName);
- //放入服务器
- return new NacosServer(instance);
- } catch (NacosException e) {
- e.printStackTrace();
- }
- //如果出现问题 则返回用户null
- return null;
- }
-
- @Override
- public void initWithNiwsConfig(IClientConfig iClientConfig) {
-
- }
- }