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…

Hive(25):Select高级查询之Subqueries子查询

1 from子句中子查询 在Hive0.12版本&#xff0c;仅在FROM子句中支持子查询。而且必须要给子查询一个名称&#xff0c;因为FROM子句中的每个表都必须有一个名称。 子查询返回结果中的列必须具有唯一的名称。子查询返回结果中的列在外部查询中可用&#xff0c;就像真实表的列一…

常见前端项目性能优化方案

常见前端项目性能优化方案 一、页面内容优化 减少http请求次数减少DNS查询次数避免页面跳转缓存ajax延迟加载&#xff08;一般用在图片多的页面中&#xff0c;滚动时才加载&#xff09;预加载减少DOM元素数量减少iframe数量避免404 二、css优化 将样式表置顶将 &#xff08…

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 生成文件名 如果头文件和源文件中同一个文件夹…

华为OD真题-流水线-带答案

题目描述&#xff1a; 一个工厂有m条流水线&#xff0c;来并行完成n个独立的作业&#xff0c;该工厂设置了一个调度系统&#xff0c;在安排作业时&#xff0c;总是优先执行处理时间最短的作业。 现给定流水线个数m&#xff0c;需要完成的作业数n, 每个作业的处理时间分别为t1,t…

阿里云OSS迁移工具ossimport实战心得

前言 由于业务的增长&#xff0c;传统的基于磁盘的文件存储需要迁移到阿里云OSS对象存储中。我们的业务主要是涉及GPS轨迹小文件&#xff0c;大致有1TB&#xff0c;文件数量5千万。在使用阿里云ossimport工具的过程中有些基本概念不明确&#xff0c;导致了一些操作失误&#xf…

性能测试 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…

Velocity如何对变量中的引号特殊字符进行转义

简介 Velocity是一个基于Java的模板引擎&#xff0c;与Freemarker类似。相较于Freemarker更轻量&#xff0c;但带来的问题就是功能不如Freemarker强大&#xff0c;所以实际项目中可能会更倾向于用Freemarker&#xff0c;这里不作过多介绍了&#xff0c;本文主要记录一下在使用…

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

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

golang整合kafka

kafka 基本概念 消息队列 1、什么是消息队列 消息&#xff08;Message&#xff09;是指在应用之间传送的数据&#xff0c;消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 消息队列&#xff08;Message Queue&…

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包问题