SpringCloud微服务之服务调用-Ribbon的使用及自定义策略的实现


前言

springcloud技术栈分布图:
在这里插入图片描述


一、Ribbon是什么?

Ribbon是一个负载均衡的客户端组件,可以在客户端进行负载均衡,使客户端可以根据自身的需要选择一个可用的服务实例进行调用。Ribbon集成在Spring Cloud Netflix中,常常与Eureka等注册中心进行配合使用,实现自动化的服务发现和负载均衡(Load Load Banlance)。

二、负载均衡LB?

我们最常见的实现负载均衡的有Nginx,其实负载均衡就是将用户的请求平摊的分配在多个服务器上,从而达到系统的HA(高可用)。那么Nginx和Ribbon实现方式有什么区别呢?
Ribbon是进程式LB,是本地负载均衡,调用微服务接口时,会在注册中心获取注册信息服务列表之后缓存到JVM本地,从而实现RPC远程调用技术。
Nginx是集中式LB,是服务器负载均衡,客户端所有请求都交给Ngninx来实现转发,它是由服务端实现的。

三、Ribbon 的工作逻辑

First:选择注册中心,优先选择同一个区域内的负载较少的服务器。
Two:根据用户指定的策略,从获取的服务注册列表中选择一个地址。
常用的Ribbon策略:轮询 、随机、重试等。

四、使用步骤

1.引入库

代码如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

如果你配合Eureka使用,则只需要引用一个Eureka包,因为Eureka内部已经集成了Ribbon包。
代码如下:

 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>

2.启动类添加@EnableDiscoveryClient

代码如下:

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

3.使用@LoadBalanced注解实现负载均衡

代码如下:

@Configuration
public class ApplicationContextConfig {
    
    @Bean
    @LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

4.controller

@RestController
@Slf4j
public class OrderController {
    private static final String URL = "http://注册中心服务地址";
    @Resource
    private RestTemplate restTemplate;
    @Resource
    private DiscoveryClient discoveryClient;
    
	@GetMapping(value = "/pay/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(URL + "/payment/get/" + id, CommonResult.class);
    }
    }

五、使用自定义的策略算法

自定义之前,先去查看Ribbon的核心组件IRule接口,IRule的常用的实现类有轮询(RoundRobinRule) 、随机(RandomRule)、重试(RetryRule)等。

1、在和启动类的package同级新建一个package,新建文件:MySelfRule.class
说明:此目录的创建必须和启动类不在同一目录下,因为Ribbon官网有规范说明,否则不生效,具体查看目录图。
在这里插入图片描述
代码如下:

@Configuration
public class MySelfRule {
    @Bean
    public IRule iRule() {
        return new RandomRule();//随机
    }
}

2、修改启动类,增加@RibbonClient注解,name是注册中心服务名称,configuration是自定义的文件

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "service-name",configuration = MySelfRule.class)
public class OrderMain {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain.class, args);
    }
}

在以上代码中,@LoadBalanced注解会自动为RestTemplate实例添加负载均衡功能。当调用时,Ribbon会根据负载均衡算法选择一个可用的服务器实例进行调用。


总结

总的来说,使用Ribbon可以方便地实现客户端负载均衡,提高了服务的可用性和可靠性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Nacos是一个非常流行的微服务注册中心和配置中心,而Ribbon则是一个负载均衡组件。结合起来,可以实现服务的自动发现和负载均衡。 下面是一个简单的示例: 1. 在pom.xml文件中添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ``` 2. 在application.properties或application.yml中配置Nacos和Ribbon: ```yaml # Nacos配置 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Ribbon配置 service-provider.ribbon.listOfServers=localhost:8081,localhost:8082 service-provider.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList ``` 3. 创建一个Ribbon的配置类,用于自定义负载均衡策略等: ```java @Configuration public class RibbonConfig { @Bean public IRule ribbonRule() { return new RandomRule(); // 随机负载均衡策略 } @Bean public IPing ribbonPing() { return new PingUrl(false, "/health"); // 检查服务健康状态的URL } } ``` 4. 在服务消费方的代码中,注入RestTemplate对象,并使用@LoadBalanced注解: ```java @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/hello") public String hello() { String url = "http://service-provider/hello"; return restTemplate.getForObject(url, String.class); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 在这里,我们使用了"http://service-provider/hello"作为服务提供方的URL,而不是具体的IP和端口。这是因为Ribbon会根据服务名自动选择一个可用的实例。 以上就是使用Spring Cloud Nacos和Ribbon调用服务的基本步骤。需要注意的是,在使用Nacos作为注册中心时,服务提供方需要在启动时注册自己。可以参考Nacos的官方文档或者Spring Cloud官方文档进行配置和使用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值