1、关于 Ribbon

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是在配置文件中列出 Load Balancer(简称LB)后面所有的机器,Ribbon 会自动的基于某种策略(如轮询连接、随机连接等)去连接这些服务器。也很容易使用 Ribbon 实现自定义的负载均衡算法来满足项目中常见的业务环境需求。

2、Ribbon 的作用

LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。负载均衡简单的说就是将用户的请求平均分配到多个服务上,从而达到系统的 HA(也就是我们常说的高可用!!!)。常见的负载均衡有软件 Nginx,LVS,硬件 F5 等,话又说回来,一般没有实力的公司都用不起 F5。相应的在中间件,例如:Dubbo 和 Spring Cloud 中均给我们提供了负载均衡机制,其负载均衡算法都是可以自定义的。

上面说那么多其实就是利用ribbon可以将请求分配到多个服务器,分担每个系统的压力,现在我们开始动手实现一个Demo,程序员请记住这句金科玉律:Talk is cheap, show me the code;

先新建两个provider服务,这里叫service-provider-port(端口号)

贴出provider核心代码如下:

package com.xu.serviceprovider2.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloWorldController { @Value("${server.port}")
String port; @RequestMapping("/hi")
public String home(@RequestParam String name) { return "hi " + name + ", i am from port: " + port;
} }

具体怎么创建我之前的文章说过了,这里不赘述,以后也不会做赘述,想学习SpringCloud的读者请务必自己动手搭建一个最简单的多模块Springcloud项目,随时备用作为模板修改,我相信你经过大量的修改和测试后,SpringCloud学习才会有乐趣和真的能达到事半功倍的效果,这里我直接贴出我的消费端代码和截图

package com.xu.serviceconsumer.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class HelloService { @Autowired
RestTemplate restTemplate; public String hiService(String name)
{
return restTemplate.getForObject("http://SERVICE-HELLO/hi?name=" + name, String.class);
}
}

接下来我们看看我们在启动类里做了什么配置:

可以看到,我们的RestTemplate在初始化时候加了一个注解@LoadBalanced,英文不差的同学应该知道这个单词的大概意思就是负载均衡的意思

package com.xu.serviceconsumer.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class HelloService { @Autowired
RestTemplate restTemplate; public String hiService(String name)
{
return restTemplate.getForObject("http://SERVICE-HELLO/hi?name=" + name, String.class);
}
}

Service部分我们已经定义好了,我们开始在Controller中调用试试看

下面贴出我的Controller代码,请只关注上图截图部分的代码即可

package com.xu.serviceconsumer.controller;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.xu.serviceconsumer.service.HelloService;
import com.xu.serviceconsumer.service.UserFeignClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import java.util.HashMap;
import java.util.Map; @RestController
public class HelloControler { private static final Logger LOGGER = LoggerFactory.getLogger(HelloControler.class); @Autowired
private HelloService helloService; @Autowired
private LoadBalancerClient loadBalancerClient; @Autowired
private UserFeignClient userFeignClient; @RequestMapping(value = "/hi")
public String hi(@RequestParam String name) { return helloService.hiService(name);
} @RequestMapping(value = "/hello")
public String hello(@RequestParam String name) { return userFeignClient.getName(name);
} @RequestMapping(value = "/log-instance")
public Object logInstance() {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("SERVICE-HELLO");
LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(),
serviceInstance.getHost(),serviceInstance.getPort()); JSONObject object1 = new JSONObject();
object1.put("ServiceId",serviceInstance.getServiceId());
object1.put("Host",serviceInstance.getHost());
object1.put("Port",serviceInstance.getPort());
return object1.toJSONString();
} }
我们打开浏览器输入http://localhost:8767/hello?name=Ronnie访问一下我们的请求试试,看他到底调用了哪些服务

既然是负载均衡,那么我们肯定要多调用几次,看看他们是不是分别调用了不同的服务,刷新浏览器再次得到结果如下

端口8763和8764分别是我们的两个同名服务不同的端口,说明请求的确分别请求了两个同名的服务,实现了负载均衡

好了,这次的课程就到这里,有不清楚的读者请及时留言尽快答复,拜拜

===============================================================================

如果您觉得此文有帮助,可以打赏点钱给我支付宝或扫描二维码

SpringCloud学习之Ribbon使用(四)的更多相关文章

  1. SpringCloud学习之Ribbon

    一.负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服 ...

  2. SpringCloud学习(4)——Ribbon负载均衡

    Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...

  3. SpringCloud学习成长之十四 服务注册(consul)

    这篇文章主要介绍 spring cloud consul 组件,它是一个提供服务发现和配置的工具.consul具有分布式.高可用.高扩展性. 一.consul 简介 consul 具有以下性质: 服务 ...

  4. SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解

    前言 本篇主要介绍的是SpringCloud中的服务消费者(Feign)和负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡. SpringCloud Feign Fei ...

  5. SpringCloud学习笔记(2):使用Ribbon负载均衡

    简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...

  6. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  7. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  8. SpringCloud学习之feign

    一.关于feigin feigin是一种模板化,声明式的http客户端,feign可以通过注解绑定到接口上来简化Http请求访问.当然我们也可以在创建Feign对象时定制自定义解码器(xml或者jso ...

  9. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

随机推荐

  1. JDK8中的HashMap实现原理及源码分析

    大纲 一.什么是Hash?什么是HashMap? 二.HashMap的内部实现机制 1.HashMap基本元素 ①DEFAULT_INITIAL_CAPACITY&MAXIMUM_CAPACI ...

  2. 008、Java中变量与常量的区别

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  3. 010.Oracle数据库 , ORDER BY 按升序降序排序

    /*Oracle数据库查询日期在两者之间*/ SELECT DISTINCT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-0 ...

  4. DNS and Bind

    DNS  :  工作在应用层 DNS 作用 :  完成域名到IP的解析过程  FQDN --> IP 例如  :  www.ifeng.com  -->  123.103.122.24 D ...

  5. Shell脚本之awk篇

    目录:一.概述二.awk基本语法格式三.awk基本操作四.awk条件及循环语句五.awk函数六.awk演示示例(源自于man手册) 一.概述 1. 产品概述: awk是一种编程语言,用于在linux/ ...

  6. uni-app开发小程序-使用uni.switchTab跳转后页面不刷新的问题

    uni.switchTab({ url: '/pages/discover/discover', success: function(e) { var page = getCurrentPages() ...

  7. WebStorm 使用经验

        1.优点 1.1 可自动提示图片的宽高 1.2 标签名字可重构(改名) 1.3 css重命名 1.4 可把内联的style移到外部 1.5 可实现声明提升 1.6 设置项是可搜索的 1.7 有 ...

  8. nginx proxy_pass解释

    在当前大部分对外提供的web服务会使用nginx做负载均衡,日常相关的proxy_pass设置有: 以http://192.168.1.101/proxy/test.html进行访问为例子 第一种: ...

  9. 139-PHP static后期静态绑定(二)

    <?php class test{ //创建test类 public function __construct(){ static::getinfo(); //后期静态绑定 } public s ...

  10. sublime text快速运行浏览web/html页面

    安装View In Browser插件 快捷键 Ctrl+Shift+P(菜单栏Tools->Command Paletter),输入 pcip选中Install Package并回车,输入Vi ...