spring cloud服务之间的调用之ribbon详解

 更新时间:2021年08月03日 08:44:29   作者:云中志  
关于spring-cloud的服务调用,我们首先需要了解它的两个核心组件Ribbon和Feign。接下来通过本文给大家详细介绍spring-cloud服务之间的调用之ribbon,感兴趣的朋友一起看看吧

前言

昨天,我们通过一个实例演示了,spring-cloud服务注册组件——Eureka的基本配置和简单用法,但是服务注册就是为了方便后期的发现和调用,所以今天我们趁热打铁,分享下spring-cloud服务之间的调用。

服务间的调用

关于spring-cloud的服务调用,我们首先需要了解它的两个核心组件RibbonFeign

我们都知道,spring boot的接口都是基于REST实现的,但是在实际线上运行的时候,考虑到用户规模、服务可用性等方面的因素,我们一般很少是单节点运行的,通常都是以集群模式部署的,但是在集群部署中,又有一个核心的问题必须解决——负载均衡。关于负载均衡,各位小伙伴应该不陌生,最常用的组件之一nginx其中一个很核心的用途就是做负载均衡,但是nginx在实际做负载均衡的时候,确实不够方便,需要手动配置服务地址,如果服务地址发生变化,相关配置也需要修改,所以不够灵活。

当然spring cloud作为一款微服务综合框架,它自然也提供了自己的一套负载均衡解决方案,所以接下来我们就来看下spring cloud的负载均衡组件——Ribbon

Ribbon

Ribbon中文的意思是丝带、带状物,正如它的含义,它就是连接调用方和服务之间的纽带。

依赖

我们先通过一个简单实例,来演示下,然后在示例的过程中来解释,首先是它的核心依赖:

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

配置

这个组件你需要添加到服务调用方的依赖中。同时,还需要增加它的配置:

@Configuration
public class RibbonConfig {

    // 多节点负载
    @LoadBalanced
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@LoadBalanced注解的作用是启用多节点负载,这样后期我们在调用的时候,RestTemplate客户端其实就是通过负载均衡的方式在调用服务提供者。

服务调用方

然后,在服务调用方,我们通过RestTemplate去调用我们的服务提供者:

@Autowired
private RestTemplate restTemplate;

@GetMapping("/ribbon")
public Object queryUserByProductId() {
    List<JSONObject> jsonObjectList = Lists.newArrayList();
    for (int i = 0; i < 10; i++) {
        JSONObject forObject = restTemplate.getForObject("http://user-center/user/" + (i + 1), JSONObject.class);
        jsonObjectList.add(forObject);
    }
    return jsonObjectList;
}

这里我们通过前面配置的restTemplate来调用我们的用户服务,接口的地址就是我们eureka注册中心显示的地址:

这里的地址不区分大小写,都可以正常访问。调用十次,主要是为了测试负载均衡的效果。

服务提供者

首先我们看下服务提供者配置:

server.port=8776
eureka.client.service-url.defaultZone=http://localhost:8999/eureka, http://localhost:9000/eureka

第一个配置是指定服务的端口,如果在本地启动的话,需要每启动一次改一个端口,否则会提示端口冲突,如果你用的是IDEA的话,要先运行多应用启动:

第二个配置就是设定我们的注册中心,我们有两个注册中心,所以指定了两个地址。

服务提供者就是一个简单的controller,在controller内部,我们通过DiscoveryClient打印出被调用者的信息,方便我们查看。

@RestController
public class UserController {
    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/user/{id}")
    public JSONObject getUserById(@PathVariable(name = "id") Long id) {
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        logger.info("instances = {}",  instances);
        JSONObject user = new JSONObject();
        user.put("id", id);
        user.put("name", "syske");
        return user;
    }
}

这里需要注意的是,我们导入的DiscoveryClientorg.springframework.cloud.client.discovery包下的,如果不是同这个类,启动的时候会报错:

Consider defining a bean of type 'com.netflix.discovery.DiscoveryClient' in your configuration.

测试

我们分别启动服务调用发和被调用方,这里我启动了5user-center,同时eureka服务也启动了两个,这个两个注册中心互相注册监控,在实际应用中也可以确保服务稳定性。5user-center2个注册在8999的注册中心上,有3个注册在9000的注册中心上:

然后,我们访问productribbon接口:

http://localhost:8881/ribbon

浏览器返回结果如下:

同时,在user-center端口为87718775的控制台,会看到如下信息:

为什么只有87718775收到了请求,因为87718775都注册到了8999的注册中心,而且我们的product-service也注册在该服务中心,所以就只调用了87718775这两个服务:

根据运行结果,我们还发现在10次请求中,87718775各处理五次,这里面还有一个潜藏的知识点:Ribbon默认的负载策略是轮询策略,这样可以确保同一个注册中心下的所有服务节点接收到同样的请求频次。

如果你把user-center5个服务)、product-serive都注册在同一个注册中心,那么你会发现每个服务都会被调用2次。

总结

总体来说,Ribbon对用户来说感知确实不够强,而且经过我的测试,我发现就算拿掉ribbon的依赖,依然可以正常负载均衡,这是因为eureka-client的依赖,已经添加过ribbon的依赖了:

好了,今天的Ribbon分享就先到这里吧,我们明天分享基于Feign的声明式调用。

到此这篇关于spring-cloud服务之间的调用之ribbon的文章就介绍到这了,更多相关spring cloud服务调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java自定义equals产生的问题分析

    Java自定义equals产生的问题分析

    这篇文章主要介绍了Java自定义equals时super.equals带来的问题分析,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
    2023-01-01
  • jenkins和sonar实现代码检测过程详解

    jenkins和sonar实现代码检测过程详解

    这篇文章主要介绍了jenkins和sonar实现代码检测过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • MAC算法之消息摘要算法HmacMD5的实现

    MAC算法之消息摘要算法HmacMD5的实现

    这篇文章主要介绍了MAC算法之消息摘要算法HmacMD5的实现的相关资料,这里提供实例,帮助大家学习理解这部分知识,需要的朋友可以参考下
    2017-08-08
  • JavaSwing基础之Layout布局相关知识详解

    JavaSwing基础之Layout布局相关知识详解

    上次我们说到View的Mearsure流程,今天接着说说layout. 关于layout,很多朋友知道它是负责布局的,那么具体是怎么布局的?viewGroup和view的layout方法又有什么不同?一起来看看吧,需要的朋友可以参考下
    2021-05-05
  • SpringBoot设置接口超时的方法小结

    SpringBoot设置接口超时的方法小结

    这篇文章主要介绍了SpringBoot设置接口超时的方法小结,包括配置文件,config配置类及相关示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java线程Timer定时器用法详细总结

    Java线程Timer定时器用法详细总结

    在本篇文章里小编给大家整理的是关于Java线程Timer定时器用法详细总结内容,需要的朋友们学习下吧。
    2020-02-02
  • 使用java web 在jsp文件及Class中连接MySQL和SQLserver 的驱动方法

    使用java web 在jsp文件及Class中连接MySQL和SQLserver 的驱动方法

    这篇文章主要介绍了使用java web 在jsp文件及Class中连接MySQL和SQLserver的驱动方法的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Spring Boot多个定时任务阻塞问题的解决方法

    Spring Boot多个定时任务阻塞问题的解决方法

    在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,下面这篇文章主要给大家介绍了关于Spring Boot多个定时任务阻塞问题的解决方法,需要的朋友可以参考下
    2022-01-01
  • Java实现常用的三种加密算法详解

    Java实现常用的三种加密算法详解

    编程中常见的加密算法有以下几种:信息摘要算法、对称加密算法以及非对称加密算法。本文将利用Java实现这几种常见的加密算法,需要的可以参考一下
    2022-03-03
  • 超详细讲解SpringBoot参数校验实例

    超详细讲解SpringBoot参数校验实例

    经常需要提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的操作,为了避免出现一些错误的数据等,一般需要对数据进行校验,下面这篇文章主要给大家介绍了关于SpringBoot各种参数校验的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论