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服务调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Cloud 负载均衡器 Ribbon原理及实现

    Ribbon简介 分布式系统中,各个微服务会部署多个实例,如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器 Ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询.随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发 为服务消费者整合Ribbon 添加 Ribbon 依赖库 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri

  • SpringCloud 2020-Ribbon负载均衡服务调用的实现

    1.概述 官网:https://github.com/Netflix/ribbon/wiki/Getting-Started Ribbon目前也进入维护模式,未来替换方案: LB(负载均衡) 集中式LB 进程内LB Ribbon就是负载均衡+RestTemplate调用 2.Ribbon负载均衡演示 1.架构说明 总结:Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例. 2. 3.二说RestTemplate的使用 官网

  • SpringCloud实战之Feign声明式服务调用

    在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻. 那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义

  • 浅谈Spring Cloud Ribbon的原理

    Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器.我们也很容易使用Ribbon实现自定义的负载均衡算法. 说起负载均衡一般都会想到服务端的负载均衡,常用产品包括LBS硬件或云服务.Nginx等,都是

  • SpringCloud使用Feign实现服务调用

    Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能以外,它还提供了一种声明式的Web服务客户端定义方式.使用它可以进行服务的消费,但是它的客户端负载平衡仍是通过Ribbon实现的 使用Spring Cloud Feign 创建一个SpringBoot工程,作为服务调用方 1.pom.xml <dependency> <group

  • springcloud中Ribbon和RestTemplate实现服务调用与负载均衡

    文件目录结构 文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描. 写pom <dependencies> <!--springboot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependenc

  • SpringCloud Feign 服务调用的实现

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列--Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用. Feign是一个声明性web服务客户端.它使编写web服务客户机变得更容易,本质上就是一个http,内部进行了封装而已. GitHub地址:https://github.com/OpenFeign/feign 官方文档:https://cloud.spring.io/spring-cloud-

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

    前言 昨天,我们通过一个实例演示了,spring-cloud服务注册组件--Eureka的基本配置和简单用法,但是服务注册就是为了方便后期的发现和调用,所以今天我们趁热打铁,分享下spring-cloud服务之间的调用. 服务间的调用 关于spring-cloud的服务调用,我们首先需要了解它的两个核心组件Ribbon和Feign. 我们都知道,spring boot的接口都是基于REST实现的,但是在实际线上运行的时候,考虑到用户规模.服务可用性等方面的因素,我们一般很少是单节点运行的,通常都

  • Spring Cloud Eureka 注册与发现操作步骤详解

    在搭建Spring Cloud Eureka环境前先要了解整个架构的组成,常用的基础模式如下图: 服务提供者:将springboot服务编写好以后,通过配置注册中心地址方式注册,提供给消费者使用. 注册中心:服务的中间桥梁,服务提供者将服务注册.服务消费者可以通过注册信息调用需要使用的服务. 服务消费者:通过规定的调用方式,读取注册中心的注册信息,调用相应的服务. 根据后续的服务复杂度进化以后,可以看到服务提供者也可以是服务消费者,服务消费者也可以是服务提供者.根据不同的业务情况是可以互相调用的

  • Spring Cloud Config分布式配置中心使用介绍详解

    目录 1.分布式配置中心应用场景 2.Spring Cloud Config 2.1.Config简介 2.2.Config分布式配置应用 2.3.构建Config Server统一配置中心 2.4.构建Client客户端(在已有简历微服务基础上) 1.分布式配置中心应用场景 往往,我们使用配置文件管理⼀些配置信息,比如application.yml 单体应用架构:配置信息的管理.维护并不会显得特别麻烦,手动操作就可以,因为就一个工程: 微服务架构:因为我们的分布式集群环境中可能有很多个微服务,

  • Spring cloud alibaba之Gateway网关功能特征详解

    目录 1.网关简介 2.什么是spring cloud gateway 2.1核心概念 3.Spring Cloud Gateway快速开始 5.路由断言工厂(Route Predicate Factories)配置 6.自定义路由断言工厂 7.Filter过滤器 8.自定义过滤器 9.自定义全局过滤器(Global Filters) 10.Gateway跨域配置(CORS Configuration) 11.Gateway整合Sentinel进行流控 12.流控配置说明 13.自定义重写流控返

  • spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

  • Spring Cloud应用实现配置自动刷新过程详解

    这篇文章主要介绍了Spring Cloud应用实现配置自动刷新过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过spring cloud 的消息总线,将配置github 等源代码仓库的变更通知到spring cloud 的所有组件. spring-bus 需要用到rabbitmq ,所以需要提前准备rabbitmq消息队列环境 配置中心调整 1.配置中心配置引用pom <dependency> <groupId>org.

  • Spring Cloud Alibaba Nacos Config加载配置详解流程

    目录 1.加载节点 2.NacosPropertySourceLocator的注册 3.加载 3.1.加载share 3.2.加载extention 3.3.加载主配置文件 1.加载节点 SpringBoot启动时,会执行这个方法:SpringApplication#run,这个方法中会调prepareContext来准备上下文,这个方法中调用了applyInitializers方法来执行实现了ApplicationContextInitializer接口的类的initialize方法.其中包括

  • Spring Cloud动态配置刷新RefreshScope使用示例详解

    目录 引言 一.了解@RefreshScope,先要了解@Scope 二.RefreshScope 的实现原理 三.使用——@RefreshScope 使用流程 引言 用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个 @RefreshScope,在类上才可以实现对象属性的的动态更新. @RefreshScope 能实现动态刷新全仰仗着 @Scope这个注解. 一.了解@RefreshScope,先要了解@Scope 1.RefreshScope继承于GenericSco

  • Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解

    本文实例讲述了Android实现Activity.Service与Broadcaster三大组件之间互相调用的方法.分享给大家供大家参考,具体如下: 我们研究两个问题, 1.Service如何通过Broadcaster更改activity的一个TextView. (研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity) 2.Activity如何通过Binder调用Service的一个方法. (研究这个问题,考虑到与服务器端交互的动作,打包至Service,Ac

  • Spring Cloud Config Client超时及重试示例详解

    简介 有时客户端需要在 config server 无响应时进行重试,以给 config server 时间进行恢复.利用 spring 提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试次数等.下面话不多说了,来一起看看详细的介绍吧. 项目源码 点击下载 为 web 项目添加依赖 开启客户端重试功能需要两个新依赖,spring-retry 和 spring-boot-starter-aop,把如下代码添加到 web 项目的 pom.xml 文件中: <dependency> &l

随机推荐