nacos注册中心+Ribbon负载均衡+完成openfeign的调用(超详细步骤)

目录

1.注册中心

1.1.nacos注册中心

1.2. 微服务注册和拉取注册中心的内容

2.3.修改订单微服务的代码

3.负载均衡组件

3.1.什么是负载均衡

3.2.什么是Ribbon

3.3.Ribbon 的主要作用

3.4.Ribbon提供的负载均衡策略

4.openfeign完成服务调用

4.1.什么是OpenFeign

4.2.完成openfeign的调用


 继  微服务工程  文章扩展的注册中心及负载均衡


1.注册中心

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现

服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳30s 90s的方式去监测清单中 的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。

服务发现:服务调用方向服务注册中心咨询服务,并获取*所有服务*的实例清单,实现对具体服务实例的访问。

通过上面的调用图会发现,除了微服务,还有一个组件是服务注册中心,它是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能:

1. 服务发现:

服务注册:保存服务提供者和服务调用者的信息

服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息

2. 服务配置:

配置订阅:服务提供者和服务调用者订阅微服务相关的配置

配置下发:主动将配置推送给服务提供者和服务调用者

3. 服务健康检测

检测服务提供者的健康情况,如果发现异常,执行服务剔除

1.1.nacos注册中心

官网nacos

nacos资源已上传

解压后打开

修改:

默认它启动模式为--集群模式---修改它为单机模式  

 修改后保存退出

访问:

http://localhost:8848/nacos账号和密码: nacos

1.2. 微服务注册和拉取注册中心的内容

商品微服务:

引入依赖

 <!--引入nacos的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

修改配置文件

#nacos注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
#为微服务定义名称
spring.application.name=qy165-product

发现:

2.3.修改订单微服务的代码

 引入依赖

 <!--引入nacos的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

修改配置文件

#nacos注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
#为微服务定义名称
spring.application.name=qy165-order

解决硬编码问题

package com.wqg.order.controller;import com.wqg.entity.Order;
import com.wqg.entity.Product;
import com.wqg.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.List;@RestController
@RequestMapping("order")
public class OrderController01 {@Autowiredprivate OrderService orderService;@Autowiredprivate RestTemplate restTemplate;//在springcloud依赖中存在一个类DiscoveryClient 该类可以从注册中心拉取指定的服务列表清单@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("insert")public String insert(Long pid, Integer num) {//创建订单--添加数据Order order = new Order();order.setUid(5L);order.setUsername("笔记本");order.setNumber(num);List<ServiceInstance> instances = discoveryClient.getInstances("qy165-product");ServiceInstance serviceInstance = instances.get(0);//根据服务实例对象获取相对应的ip和端口号String path = serviceInstance.getUri().toString();//商品信息Product product = restTemplate.getForObject(path+"/product/getById/"+pid, Product.class);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());int i = orderService.saveOrder(order);return i > 0 ? "下单成功" : "下单失败";}
}

3.负载均衡组件

3.1.什么是负载均衡

通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡

而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求

我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行.

演示:---手动完成负载均衡

模拟搭建商品微服务n台

手动实现负载均衡----随机负载均衡

修改OrderController订单代码

@RestController
@RequestMapping("order")
public class OrderController02 {@Autowiredprivate OrderService orderService;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("insert")public String insert(Long pid, Integer num) {//创建订单--添加数据Order order = new Order();order.setUid(5L);order.setUsername("笔记本");order.setNumber(num);List<ServiceInstance> instances = discoveryClient.getInstances("qy165-product");int index = new Random().nextInt(instances.size());ServiceInstance serviceInstance = instances.get(index);String s = serviceInstance.getUri().toString();//商品信息Product product = restTemplate.getForObject(s+"/product/getById/"+pid, Product.class);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());int i = orderService.saveOrder(order);return i > 0 ? "下单成功" : "下单失败";}
}

上面通过手动完成了负载均衡的调用,存在的问题: 它采用的随机负载均衡,如何我想使用轮询负载均衡策略。

只能修改源代码。耦合。---springcloud提供了一个组件--可以灵活的完成负载均衡。--ribbon

3.2.什么是Ribbon

是 Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP 客户端行为。在 Springcloud中, nacos 一般配合 Ribbon 进行使用,Ribbon 提供了客户端负载均衡的功能,Ribbon 利用从 nacos 中读 取到的服务信息,在调用服务节点提供的服务时,会合理(策略) 的进行负载。在Springcloud 中可以将注册中心和Ribbon 配合使用,Ribbon 自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。

3.3.Ribbon 的主要作用

(1)服务调用

基于 Ribbon 实现服务调用,是通过拉取到的所有服务列表组成 ( 服务名-请求路径的 ) 映射关系。借助 RestTemplate最终进行调用.

(2)负载均衡

当有多个服冬提供者时,Ribbon 可以根据负载均衡的算法自动的选择需要调用的服务地址

如何使用Ribbon实现负载均衡

在RestTemplate生成类上加入@LoadBalanced

修改OrderController订单代码

@RestController
@RequestMapping("order")
public class OrderController03 {@Autowiredprivate OrderService orderService;@Autowiredprivate RestTemplate restTemplate;@GetMapping("insert")public String insert(Long pid, Integer num) {//创建订单--添加数据Order order = new Order();order.setUid(5L);order.setUsername("笔记本");order.setNumber(num);//商品信息Product product = restTemplate.getForObject("http://qy165-product/product/getById/"+pid, Product.class);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());int i = orderService.saveOrder(order);return i > 0 ? "下单成功" : "下单失败";}
}

测试

3.4.Ribbon提供的负载均衡策略

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule,具体的负载策略如下所示:

策略名策略描述实现说明
BestAvailableRule选中一个最小的并发请求的server逐个考察Server,如果Server被 tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
RandomRule随机选择一个server在index上随机,选择index对应位置的server
RoundRobinRule轮询方式轮询选择轮询index,选择index对应位置的
AvailabilityFilteringRule过滤掉那些因为一直连接失败的被标记为circuittripped的后端server,并过滤掉 那些高并发的的后端server (activeconnections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查 status里记录的各个server的运行状态
WeightedResponseTimeRule根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
RetryRule对选定的负载均衡策略机上重试机制在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
ZoneAvoidanceRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉

ribbon内置的负载均衡策略,默认轮询,也可以自定义负载均衡。

如何修改ribbon组件的负载均衡策略----修改配置文件

修改为随机:

#修改ribbon的负载均衡策略---随机
qy165-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

4.openfeign完成服务调用

4.1.什么是OpenFeign

OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地方法一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了OpenFeign, OpenFeign负载均衡默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。

4.2.完成openfeign的调用

订单微服务

(1)依赖

<!--openfeign依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

(2)创建openfeign接口

@FeignClient(value = "qy165-product")
public interface ProductFeign {//接口的方法 必须 和被调用者的接口的参数一致@GetMapping("/product/getById/{id}")public Product getById(@PathVariable Long id); //springcloud 扫描到@FeignClient注解时--生产一个代理实现类.
}

(3)开启openfeign注解驱动

(4)修改OrderController

@RestController
@RequestMapping("order")
public class OrderController04 {@Autowiredprivate OrderService orderService;@Autowiredprivate ProductFeign productFeign;@GetMapping("insert")public String insert(Long pid, Integer num) {//创建订单--添加数据Order order = new Order();order.setUid(5L);order.setUsername("笔记本");order.setNumber(num);//商品信息Product product = productFeign.getById(pid);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());int i = orderService.saveOrder(order);return i > 0 ? "下单成功" : "下单失败";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode remote-ssh配置

使用vscode的插件remote-ssh进行linux的远程控制。 在vscode上安装完remote-ssh插件后&#xff0c;还需要安装openssh-client。 openssh-client安装 先win R打开cmd&#xff0c;输入ssh&#xff0c;查看是否已经安装了。 如果没有安装&#xff0c;用管理员权限打开powershe…

Linux云服务器,docker compose文件部署多个jar,docker部署多模块boot项目

前提条件 Linux服务器 服务器已经安装docker docker已经安装jdk镜像 docker已经安装mysql镜像 将要部署的项目的jar包打包好&#xff0c;项目是多模块springboot项目 部署过程 项目是3个模块的Spring boot项目&#xff0c;打出来3个jar&#xff0c;将这些jar包拷贝到…

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤&#xff1a;预处理->编译->汇编->链接 注意&#xff1a;-o 用于修改生产的文件名 2、gcc常用参数 指定头文件&#xff1a;-I 语法&#xff1a; gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…

性能测试 Linux 环境下模拟延时和丢包实现

在性能测试过程中&#xff0c;我们还需要模拟网络异常的情况下&#xff0c;是否会出现一些异常数据。最常见的就是写库操作&#xff0c;比如说我们下单的场景&#xff0c;如果出现网络异常的时候是否会出现数据对不上这种情况。 如我们JMeter发送成功的请求数量和最终数据库表…

linux之Ubuntu系列(五)用户管理、查看用户信息 终端命令

创建用户 、删除用户、修改其他用户密码的终端命令都需要通过 sudo 执行 创建用户 设置密码 删除用户 sudo useradd -m -g 组名 新建用户名 添加新用户 -m&#xff1a;自动建立用户 家目录 -g&#xff1a;指定用户所在的组。否则会建立一个和用户同名的组 设置新增用户的密码&…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞&#xff0c;导致在每次上线发布的时间长、出问题&#xff0c;对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用&#xff1a; 多功能并行开发时&#xff0c;测试人员可以根据需求任务分配测试自己的功能&#…

Ceph 分布式存储之应用

一、创建 CephFS 文件系统 MDS 接口 1、服务端操作 1&#xff09;在管理节点创建 mds 服务 [rootadmin ceph]# cd /etc/ceph [rootadmin ceph]# ceph-deploy mds create node01 node02 node03 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.c…

.Net5 mvc项目UseBrowserLink插件功能失效的原因

前期基于.Net Framework创建的Web项目&#xff0c;使用了BrowserLink插件协助前端开发&#xff0c;功能一直都比较稳定&#xff0c;后来项目迁到.Net5 &#xff0c;发现BrowserLink 已经失去了从浏览器定位到项目源代码的功能&#xff0c;希望在后面的版本还能继续支持此版本&a…

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…

SDN系统方法 | 1. 概述

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

基于FT232HL的USB2.0转ARINC429板卡

基于FT232HL的USB2.0转ARINC429板卡 1 概述 《USB2.0转ARINC429板卡》采用底板子板&#xff0c;层叠安装的结构&#xff1b;使用同样的底板&#xff0c;变换不同功能的子板实现不同的功能版本。 a) 降低硬件设计复杂度&#xff1a;新板卡设计只需要设计子板&#xff0c;子板的…

MySQL中这14个小玩意,让人眼前一亮!!!

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

《动手学深度学习》(pytorch版本)中`d2lzh_pytorch`包问题

《动手学深度学习》&#xff08;pytorch版本&#xff09;中d2lzh_pytorch包问题

【深度学习】张量的广播专题

一、说明 张量广播&#xff08;tensor broadcasting&#xff09;是一种将低维张量自动转化为高维张量的技术&#xff0c;使得张量之间可以进行基于元素的运算&#xff08;如加、减、乘等&#xff09;。在进行张量广播时&#xff0c;会将维度数较少的张量沿着长度为1的轴进行复制…

YOLOv5图像和视频对象生成边界框的目标检测实践(GPU版本PyTorch错误处理)

识别图像和视频里面的对象&#xff0c;在计算机视觉中是一个很重要的应用&#xff0c;比如无人驾驶&#xff0c;这个就需要实时的检测到周边环境的各种对象&#xff0c;并及时做出处理。目标检测在以往的文章中有重点讲解过几种&#xff0c;其中Faster R-CNN的源码解读&#xf…

7.kafka+ELK连接

文章目录 kafkaELK连接部署Kafkakafka操作命令kafka架构深入FilebeatKafkaELK连接 kafkaELK连接 部署Kafka ###关闭防火墙systemctl stop firewalld systemctl disable firewalldsetenforce 0vim /etc/selinux/configSELINUXdisabled###下载安装包官方下载地址&#xff1a;ht…

Vue自定义指令

需求1&#xff1a;定义一个v-big指令&#xff0c;和v-text功能类似&#xff0c;但会把绑定的数值放大10倍。 需求2&#xff1a;定义一个v-fbind指令&#xff0c;和v-bind功能类似&#xff0c;但可以让其所绑定的input元素默认获取焦点。 自定义指令函数式v-big&#xff1a; &l…

2023最新版本Activiti7系列-事件篇

事件篇 事件&#xff08;event&#xff09;通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。在BPMN 2.0中&#xff0c;有两种主要的事件分类&#xff1a;*捕获&#xff08;catching&#xff09;与抛出&#xff08;throwing&#xff09;*事件。 捕获: 当流程执…

文件共享服务器

文章目录 一、共享服务器概述二、创建共享三、访问共享四、创建隐藏的共享五、访问隐藏共享的方法六、共享相关命令七、屏蔽系统隐藏共享自动产生1. 打开注册表2. 定位共享注册表位置 八、查看本地网络连接状态&#xff08;查看开放端口&#xff09;九、关闭445服务 一、共享服…