【SpringCloud】简单应用(三)——Ribbon负载均衡

标签: SpringCloud  java  spring

一、引入

上面那个使用者一直都是访问的第一个goods-serivce服务,那如果我有很多个service服务,后面岂不是都是没用的,所以我们要解决这一问题。现版本的Eureka Server已经自动集成了Ribbon无需引入。

二、开启多个goods服务

现来模拟有3个goods-server服务
更改goods配置文件中的端口号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再打印一下信息,这样让我们知道是那个服务收到的信息

@RestController
@RequestMapping(value = "/goods" ,produces ="application/json;charset=UTF-8")
public class GoodsController {
    @Autowired
    GoodsService goodsService;
    @GetMapping("/{id}")
    public JSONObject get(@PathVariable("id") int id){
        System.out.println("1号收到请求");
        return goodsService.findGoodsByID(id);
    }
}

因为是直接用的同一个项目开启服务,所以一定要修改之后再选择对应的启动器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开启3个之后我们再Eureka中查看一下
在这里插入图片描述

三、开启负载均衡

在order的restTemplate上添加`` @LoadBalanced```

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

修改实现类

	@Autowired
    RestTemplate restTemplate;

    @Override
    public JSONObject queryOrderByUserIDII(int id) {
        List<Order> orders = orderMapper.queryOrderByUserIDII(id);
        JSONArray goods = new JSONArray();
        for (Order order:orders){
            /**
             * 有多台服务器用ribbon做负载均衡
             */
            String service = "goods-service";
            String url = "http://" + service + "/goods/" + order.getGoods_id();
            Goods good =restTemplate.getForObject(url,Goods.class);
            JSONObject jsonObject = (JSONObject) JSONObject.toJSON(good);
            goods.add(jsonObject);
        }
        JSONObject returnJsono = new JSONObject();
        returnJsono.put("code",200);
        returnJsono.put("msg","success");
        returnJsono.put("data",goods);
        return returnJsono;
    }

四、查看是否实现

在提供的数据中2017用户的订单有两个,那么就会查询两次物品信息
再次访问http://localhost:8888/order/query/2017在打印台中我们能看知道
在这里插入图片描述
在这里插入图片描述
多刷新几次就会发现2条信息,总会有一个服务不用做事,这就是轮询的方式实现负载均衡,当使用者发来请求,注册中心会将调用多个同名服务中的下一个。

五、总结

我们关掉三个中的一个服务,刷新三次其中两次出现这样的问题:
在这里插入图片描述
另外一次就会成功查询。
  因为我们模拟了一个服务宕机,但是他没有从Eureka服务中立即删除。Eureka自我保护机制,当其注册表里服务因为网络或其他原因出现故障而关停时,Eureka不会剔除服务注册,而是等待其修复,90s发送一次心跳检测。轮询到关掉的服务之后就会报连接错误。
  测试觉得麻烦可以关闭自我保护机制,线上使用一定要开启
  因为虽然汇报一两次错,若返回错误次数多了就不会轮询这个服务。开启保护机制之后服务注册不会被删除,过一会再访问他还是会先去尝试使用掉线的服务,报错了之后不再使用。等待他重新接入。
  没有保护机制就直接删除服务。最简单的就是断网了的情况,后面如果回复通信了,可是服务已经被删除了,需要重新启动服务服务才行。

版权声明:本文为AssassinX99原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AssassinX99/article/details/103537193

智能推荐

三、负载均衡-Ribbon

上一章:二、Eureka集群高可用配置 什么是Ribbon? Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们很轻松的将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然是一个工具类框架,但是它不需要想注册中心、配置中心、...

springcloud之Ribbon负载均衡

一:简介 Ribbon是一套客户端 负载均衡的工具。主要提供客户端的软件负载均衡的算法   二:Ribbon配置 Ribbon是客户端负载均衡工具,所以配置在调用微服务的消费者一端。 1)增加Ribbon的maven配置   2)消费者调用微服务需要从Eureka服务端获取调用的微服务名称/信息,所以需要在yml中增加Eureka Server的配置信息。 3)消费者通过Res...

2018andoid混淆打包遇到Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.

在正式打包中,加上了 然后打包过程中,build中就报出了 Execution failed for task ‘:app:transformClassesAndResourcesWithProguardForRelease’. 然后就goodle了一下,最简单有效的回复,就是在 proguard-rules.pro 文件中加入 -ignorewarnings 但是在我这可...

element 表格 评分表(合并单元格,单选框按钮选分,计算表格总分)

element 表格 评分表(合并单元格,单选框按钮选分) 图片: html: css: js:...

matlab与python的交互

一、从matlab调用python 1、先给出官方链接 进入链接后点示例,内容更丰富一些。《Python 库 — 示例》 2、简单说一下环境配置(下面的图片内容来自https://blog.csdn.net/jnulzl/article/details/51170859) 3、添加python环境变量以加载模块 如果是将当前文件夹加入到python搜索路径,modpath='';即可。...

猜你喜欢

Java实现先序数组转换成后序数组

算法描述 满二叉树的先序序列存储在数组中,设计一个算法将其转换成后序遍历 满二叉树形状 先序和后序序列 先序序列:A B D H I E J K C F L M G N O 后序序列:H I D J K E B L M F N O G C A 算法思想 Transfer函数参数说明: pre就是先序序列数组,f1,l1分别是先序序列的第一个和最后一个元素; post就是后序序列数组,f2,l2分别...

markdown学习

欢迎随时骚扰:QQ为495470602 markdown学习 我们来学习一下markdown:什么是marjdown Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML 文档”。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 优点:由于 Markdown 的轻量化、易...

shell脚本案例(提供思路)

解释环境是什么就用什么,bash就行了...

一维搜索-黄金分割法matlab实现

一维搜索-黄金分割法matlab实现 前言 1、黄金分割法 1.1 黄金分割法的定义 1.2 黄金分割法的搜索过程 2、黄金分割matlab实现 2.1 求f(x)=x^2-7*x+10的极值 2.2 解析法验算: 3.黄金分割脚本编码 4.附上powell法链接 前言 求解优化问题可以用解析解法和数值解法,在很多情况下,机械优化设计问题限制条件比较多,与之对应的数学描述也比较复杂,不便于甚至不可...

输入一个链表,输出该链表中倒数第k个结点

题目:输入一个链表,输出该链表中倒数第k个结点 关于这道题目,我首先想到的解决方法就是先求出链表的长度,然后返回第length-k个节点 但是,这么做会遍历两次链表,求链表的长度会遍历依次链表,返回第k个节点又会遍历一次链表 为了遍历一次链表,就返回倒数第k个节点,我们采用类似于 "尺子" 的方法 定义两个节点,让其中一个节点先走k-1步,然后两个节点一起走,直到第一个节点走到...