【JAVA企业级开发】详解分布式系统中负责服务调用的Ribbon组件与Eureka组件的集成应用,通过配置类修改调用服务的负载均衡算法和自定义负载均衡规则的过程

这里写目录标题

一级目录

二级目录

三级目录

一 搭建自身带有负载均衡策略的消费者系统模块(首先参考我前几篇文章使用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();
    }

}

要知道的是

① 这个自定义配置类不能放在@ComponentScan或者@SpringBootApplication所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。 @RibbonClient的目的就是指定加载哪个负载配置类bean,而@ComponentScan或者@SpringBootApplication作用是所扫描的当前包下以及子包下把配置类和@service,@controller等注解的类自动加载进IOC容器,所以就无法定制化配置服务消费端。

② 如果想要所有ribbon客户端都使用一个负载规则,那么可以把配置类放在@ComponentScan或者@SpringBootApplication所扫描的当前包下以及子包下,启动类上的@RibbonClient也无需给定属性值!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵牛刘先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值