Spring Cloud Alibaba Ribbon组件的使用

Ribbon组件在Spring Cloud的作用是实现负载均衡,这里简单的说一下负载均衡的概念,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。如下图:

 Nacos为我们提供了注册中心和配置中心,在集群模式下,Ribbon可以将请求通过一些策略分摊到各个Nacos,在讲具体实现之前,先来简单的自定义模拟一下负载均衡的实现:

自定义模拟负载均衡:

创建两个服务提供者工程:

ribbon_provider_1

pom依赖:导入nacos启动器和springboot的web启动器,同时注入common公共属性工程(这里不展示,common工程只声明了一个User实体类)

         <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

配置文件:application.yaml

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.40.141:8848
  application:
    name: ribbon-provider

controller:

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

service:

public interface UserService {
    User getUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {

    @Override
    public User getUserById(Integer id) {
        return new User(id,"张三-1",18);
    }
}

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class,args);
    }
}

ribbon_provider_2:

配置文件:application.yaml

server:
  port: 9091
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.40.141:8848
  application:
    name: ribbon-provider

Controller、Service与启动类和ribbon_provider_1保持一致(Service稍作区分,打印的User对象name属性为"张三-2")

创建服务消费者ribbon_consumer:

pom依赖(与ribbon_provider一样):

         <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

application.yaml配置文件

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.40.141:8848
  application:
    name: ribbon-consumer

controller:

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    //访问Rest服务的客户端
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    private int currentIndex;

    @RequestMapping(value = "/getUserById/{id}")
    public User getUserById(@PathVariable  Integer id){
        //获取nacos中注册的指定服务信息
        List<ServiceInstance> serviceList = discoveryClient.getInstances("ribbon-provider");
        //通过Random工具类获取随机数
        currentIndex = new Random().nextInt(serviceList.size());
        //随机获取服务
        ServiceInstance serviceInstance = serviceList.get(currentIndex);
        //拼接访问服务的url
        String serviceUrl = serviceInstance.getHost() + ":" + serviceInstance.getPort();
        String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
        //调用服务
        return restTemplate.getForObject(url,User.class);
    }
}

配置类(注册RestTemplate到ioc容器):

@Configuration
public class ConfigBean {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class,args);
    }
}

启动消费者跟提供者工程,然后启动nacos服务,浏览器进入nacos后台(关于nacos上篇文章已详细记载)查看注册的服务

 看到服务提供者实例数为2,服务消费者实例数为1,注册成功!

访问localhost/consumer/getUserById/1测试

查看响应结果是访问了ribbon_provider_2

继续刷新(这里模拟的策略为随机,可能连续几次访问的都是ribbon_provider_2)

 负载均衡的随机分配模拟成功!

Ribbon入门使用:

首先,nacos里面已经集成了ribbon,所以不用额外的再去引入依赖。

Ribbon实现负载均衡的核心在于IRule接口,这个接口给出了负载均衡的规范,并且官方提供了多个实现类,每个实现类可以近似的看做是负载均衡的一个实现策略。

如上图中的RandomRule就是随机分配策略,RoundRobinRule是轮询策略

简单的看下RandomRule源码如何实现:

    //该注解的作用是告诉JVM,忽略掉一些警告信息
    @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;

            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                //获取所有服务的列表
                List<Server> upList = lb.getReachableServers();
                List<Server> allList = lb.getAllServers();
                int serverCount = allList.size();
                if (serverCount == 0) {
                    return null;
                }
                //调用自身的chooseRandomInt方法获取一个随机数
                int index = this.chooseRandomInt(serverCount);
                //通过随机索引获取服务
                server = (Server)upList.get(index);
                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }

                    server = null;
                    Thread.yield();
                }
            }

            return server;
        }
    }
    
    //生成随机数的方法
    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }

 源码中的核心业务逻辑跟模拟随机分配的实现很相似,都是获得所有服务的列表再通过随机索引去获取服务并调用。

 了解这些原理后,改造一下上面的模拟实现案例,通过Ribbon来实操一波。

1.修改ribbon_consumer的ConfigBean配置类:

在RestTemplate的注册方法上加上@LoadBalanced注解,这样在通过ioc容器获取restTemplate对象时,Ribbon会通过拦截器将请求拦截并处理,拿到注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换掉serviceId,同时在ioc容器中查找IRule是否已注册,如果已注册则根据IRule的类型来实施负载策略,否则通过实施默认策略。

    @Bean
	/**
	 * 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,在拦截器中获取
	 * 注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。
	 */
	@LoadBalanced //开启负载均衡
	public RestTemplate getRestTemplate(){
		return new RestTemplate();
	}

	//随机策略
	@Bean
	public IRule iRule() {
		return new RandomRule();
	}

修改ribbon_consumer的controller:

@RequestMapping(value = "/getUserById/{id}")
    public User getUserById(@PathVariable("id")  Integer id){
        //在ribbon中不再使用host + ":" + port的方式获取url,而是通过serviceId(nacos中注册服务的名称)查找
        String serviceUrl = "ribbon-provider";
        String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
        //调用服务
        return restTemplate.getForObject(url,User.class);
    }

 启动测试:

浏览器的地址栏输入localhost/consumer/getUserById/2测试访问

 至此Ribbon的入门案例结束

<think>好的,用户想了解SpringCloud阿里巴巴的五大核心组件及其功能和集成方式。首先,我需要回忆一下相关的知识,然后结合提供的引用内容来组织回答。 根据引用3提到的,Spring Cloud Alibaba包含了Netflix的功能,并且五大组件应该是Nacos、Sentinel、Seata、RocketMQ和Dubbo。不过需要确认是否正确,因为不同资料可能有不同说法。比如,引用3里提到Ribbon、Hystrix、zuul、Eureka、config进入维护模式,而Spring Cloud Alibaba可能替代了这些组件。 首先,Nacos作为服务发现和配置中心,替代了Eureka和Config。Sentinel负责流量控制,替代Hystrix。Seata处理分布式事务。RocketMQ是消息队列,Dubbo作为RPC框架。需要逐一列出每个组件的功能、解决的问题以及集成方法。 还要注意引用中的内容,比如引用1提到Spring Cloud Alibaba的目的是为了给使用阿里巴巴产品的开发者带来便利,整合Spring Boot和Cloud的优势。引用2指出两者都是构建分布式系统的重要框架,需要区分它们的核心组件。 接下来需要确保每个组件的描述准确,例如Nacos的服务注册与发现、配置管理;Sentinel的流量控制、熔断降级;Seata的分布式事务解决方案;RocketMQ的消息服务;Dubbo的RPC通信。集成部分需要简要说明如何在Spring Cloud项目中引入依赖和配置。 最后生成相关问题,可能涉及组件对比、具体使用场景、性能优化等,确保问题与主题相关且有助于用户深入学习。</think>### Spring Cloud Alibaba五大核心组件功能与集成 #### 1. **Nacos** **功能**: - **服务注册与发现**:替代Netflix Eureka,提供动态服务注册、健康监测及DNS服务[^3]。 - **配置中心**:统一管理分布式系统的配置信息,支持动态配置更新和版本控制[^1]。 - **解决问题**:微服务架构中服务实例动态变化的管理难题,以及多环境配置的复杂性。 **集成方式**: ```xml <!-- Maven依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` --- #### 2. **Sentinel** **功能**: - **流量控制**:通过QPS、线程数等指标限制接口访问流量。 - **熔断降级**:自动屏蔽不稳定服务,防止级联故障。 - **解决问题**:高并发场景下的服务稳定性问题,如雪崩效应。 **集成方式**: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> ``` --- #### 3. **Seata** **功能**: - **分布式事务**:提供AT(自动补偿)、TCC(手动补偿)等事务模式。 - **解决问题**:跨数据库或服务的业务操作中数据一致性问题。 **集成方式**: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> ``` --- #### 4. **RocketMQ** **功能**: - **消息队列**:支持异步通信、削峰填谷、顺序消息和事务消息。 - **解决问题**:系统解耦、异步任务处理及高吞吐量场景需求[^1]。 **集成方式**: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-stream-rocketmq</artifactId> </dependency> ``` --- #### 5. **Dubbo** **功能**: - **RPC通信**:基于接口的高性能远程调用,替代Feign或RestTemplate。 - **解决问题**:微服务间的高效通信需求,减少HTTP协议的开销[^3]。 **集成方式**: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> ``` --- ### 组件对比与Spring Cloud Netflix Spring Cloud Alibaba组件多数为Netflix组件的增强或替代方案: - **Nacos** → Eureka + Config - **Sentinel** → Hystrix - **Dubbo** → OpenFeign 这些组件在性能、扩展性和中文支持方面更具优势[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值