上节我们学会了如何搭建一个eureka server服务,本节我们使用ribbon来实现服务间的调用。

前置条件:

1、创建几个工程

eureka-server
            |- 服务注册中心
        product-provider-8777
        product-provider-8778
        product-provider-8779
        product-provider-8780
            |- 服务提供者,提供商品查询服务,请求url为: http://host:port/product/selectOne/{productId},返回服务的端口、服务名和商品信息
            |- 上面四个product-provider-%d的工程代码都是一样的
            |- 8777 和 8778 一组,spring.application.name = product-provider-01
            |- 8779 和 8780 一组,spring.application.name = product-provider-02
        order-consumer
            |- 服务消费者,调用product-provider-%d服务,来完成商品信息的获取
            |- 访问url : http://host:port/orders/create/{providerId}/{productId}
                ** providerId 用来替换上面%d的值
                ** productId 商品编号,可以使用p0001、p0002、p0003

需求:

|- 在consumer工程中使用ribbon来完成provider工程的调用
    |- 调用 product-provider-01 时修改默认的负载均衡策略(轮询)采用自定义的随机策略

|- ribbon客户端立即初始化,服务端配置

ribbon:
eager-load:
enabled: true
clients: product-provider-8780 # 需要立即初始化的服务名

实现步骤:

1、eureka-server和product-provider功能没有什么特殊的地方,需要将8777和8778工程的spring.application.name的值改成product-provider-01另外2个修改成product-provider-02
    2、consumer工程
        |- 配置RestTemplate,需要加上@LoadBalanced注解,使之具有客户端负载均衡的能力(ribbon)
        |- 由于product-provider-01的负载均衡策略需要改变,因此需要配置RibbonClient
            ** 注意在RibbonClient中指定的配置文件不可在spring boot的主上下文中被扫描到,否则会是一个全局的配置,对所有的RibbonClient都会生效,如果需要对单独的RibbonClient
                     生效,则需要定义一个配置文件 RibbonProductProvider01Conf 这个可以在spring boot的主上下文中,里面的RibbonClient指定的配置文件 RibbonProductProvider01Configuration
                     必须要在spring boot的主上下文之外。

代码结构:

实现:

一、注册中心和服务提供者

这部分的代码都是普通的代码,没有什么需要注意的

二、服务消费者

1、定义RestTemplate

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

   注意: @LoadBalanced注解 加上即可

2、修改product-provider-01的负载均衡策略
    2.1、RibbonProductProvider01Configuration文件的编写

/**
* 注意: 此类不可被spring 的主上下文扫描到,否则就是全局配置,对所有的ribbon客户端都会起作用
* <p>
* 对 spring.application.name = product-provider-01 进行单独配置
* 修改对product-provider-01的负载均衡策略为随机访问,不在是默认的轮训访问
*
* @author huan.fu
* @date 2018/5/29 - 11:40
*/
@Configuration
public class RibbonProductProvider01Configuration { /**
* 设置负载均衡策略为 随机,默认是轮训
*
* @return
*/
@Bean
public IRule ribbonRule() {
return new RandomRule();
} }

可以进行配置的选项,以及默认值
    IClientConfig  DefaultClientConfigImpl
    IRule  ZoneAvoidanceRule
    IPing  DummyPing
    ServerList<Server>  ConfigurationBasedServerList
    ServerListFilter<Server>  ZonePreferenceServerListFilter
    ILoadBalancer  ZoneAwareLoadBalancer
    ServerListUpdater  PollingServerListUpdater

2.2、 RibbonProductProvider01Conf配置文件的编写

/**
* 对 spring.application.name = product-provider-01 进行单独配置
* 修改对product-provider-01的负载均衡策略为随机访问,不在是默认的轮训访问
*
* @author huan.fu
* @date 2018/5/29 - 11:40
*/
@RibbonClient(name = "product-provider-01", configuration = RibbonProductProvider01Configuration.class)
@Component
public class RibbonProductProvider01Conf { }

注意:@RibbonClient中的name的是服务提供者的spring.application.name的值,configuration指向上面编写的配置文件

3、编写控制层进行调用

/**
* 订单控制器
*
* @author huan.fu
* @date 2018/5/28 - 16:52
*/
@RestController
@RequestMapping("orders")
public class OrdersController { @Autowired
private RestTemplate restTemplate; /**
* 创建订单
*
* @param productId
* @return
*/
@GetMapping("create/{providerId}/{productId}")
public Map<String, Object> createOrders(@PathVariable String providerId, @PathVariable String productId) {
return restTemplate.getForObject("http://product-provider-" + providerId + "/product/selectOne/" + productId, Map.class);
} }

测试:

1、注册中心截图

2、运行结果

完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/ribbon

spring cloud ribbon的使用的更多相关文章

  1. 撸一撸Spring Cloud Ribbon的原理-负载均衡器

    在上一篇<撸一撸Spring Cloud Ribbon的原理>中整理发现,RestTemplate内部调用负载均衡拦截器,拦截器内最终是调用了负载均衡器来选择服务实例. 接下来撸一撸负载均 ...

  2. 笔记:Spring Cloud Ribbon 客户端配置详解

    自动化配置 由于 Ribbon 中定义的每一个接口都有多种不同的策略实现,同时这些接口之间又有一定的依赖关系,Spring Cloud Ribbon 中的自动化配置能够很方便的自动化构建接口的具体实现 ...

  3. 笔记:Spring Cloud Ribbon 客户端负载均衡

    Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,基于 Netflix Ribbon 实现,通过Spring Cloud 的封装,可以让我们轻松的将面向服 ...

  4. 为Spring Cloud Ribbon配置请求重试(Camden.SR2+)

    当我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问. 下面的例 ...

  5. Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon

    客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...

  6. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  7. 撸一撸Spring Cloud Ribbon的原理-负载均衡策略

    在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...

  8. spring cloud Ribbon

    参考:https://www.jianshu.com/p/1bd66db5dc46 Ribbon 是什么 spring cloud ribbon 是一个基于HTTP 和 TCP 的客户端负载均衡工具, ...

  9. 第四章 客户端负载均衡:Spring Cloud Ribbon

    spring cloud ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netflix Ribbon 实现.通过Spring Cloud 的封装,可以轻松的将面向服务的R ...

  10. Spring Cloud Ribbon入门

    一.简介 Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它 ...

随机推荐

  1. vue el-transfer新增拖拽排序功能---sortablejs插件

    <template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 -  --> ...

  2. k8s nodes节点 notready问题

    1.在master查看node状态 [root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready co ...

  3. electron-vue 开发问题合集

    (一)Found 'electron' but not as a devDependency, pruning anyway 原因:对electron没有严格要求的话可以忽略,不影响打包,但会影响第三 ...

  4. 使用Git上传项目到GitHub仓库

    GitHub账号注册很长时间了,但是没怎么上传过东西.今天学习如何利用Git工具将代码上传到GitHub,了解了一些常用命令 $ git config --global user.name " ...

  5. 基于Typora的Latex代码书写并移植到word中

    如何使用Markdown编译器 编辑Latex公式 并嵌入word内 ​ 前言:对于科研党来讲,在论文中数学公式的展示是必不可少的一环,但是如果不使用公式的格式去敲,那么公式就会过于难看,会大大降低你 ...

  6. PHP中的数组分页实现(非数据库)

    在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...

  7. 还不知道PHP有闭包?那你真OUT了

    做过一段时间的Web开发,我们都知道或者了解JavaScript中有个非常强大的语法,那就是闭包.其实,在PHP中也早就有了闭包函数的功能.早在5.3版本的PHP中,闭包函数就已经出现了.到了7以及后 ...

  8. Jenkins操作手册 - 巨详细,一篇足矣!

    一.继续集成相关概念 1.1.什么是持续集成? 随着软件开发复杂度的不断提高,团队开发成员间如何更好的协同工作以确保软件开发的质量已经成为开发过程中不可回避的问题.尤其是近年来敏捷开发在软件领域越来越 ...

  9. vs code安装leetcode插件

    vs code 安装不成功啊 1.首先确保有node.js 10+,没有的话去官网下载,安装就可以,安装好之后在cmd命令行中输入: node -v 若出现相关版本信息说明安装成功 2.由于leetc ...

  10. python风格对象

    对象表示形式 python提供了两种获取对象字符串表示形式的标准方式 repr()         //便于开发者理解的方式返回对象的字符串表示形式(一般来说满足obj==eval(repr(obj) ...