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 {
    @Autowired
    private OrderService orderService;
    @Autowired
    private RestTemplate restTemplate;

    //在springcloud依赖中存在一个类DiscoveryClient 该类可以从注册中心拉取指定的服务列表清单
    @Autowired
    private 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 {
    @Autowired
    private OrderService orderService;
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private 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 {
    @Autowired
    private OrderService orderService;
    @Autowired
    private 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 {
    @Autowired
    private OrderService orderService;
    @Autowired
    private 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 ? "下单成功" : "下单失败";

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四章 云原生架构之Kubernetes基础知识

1、K8S整体架构 1.1、概述 ​ Kubernetes是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;简称 K8S。K8S的本质是一组服务器集群&#xff0c;可以在对应服务器集群的每个节点上运行程序&#xff0c;来对节点中的容器进行管理。类似Mas…

Mac怎么把mov转换成mp4?

mac怎么把mov转换成mp4&#xff1f;在我们准备转换之前&#xff0c;让我们先了解一下为什么要将MOV格式转换为MP4格式。MOV格式是美国苹果公司独立开发发布的视频文件格式&#xff0c;在Mac电脑以及苹果其它智能设备上播放效果非常出色。然而&#xff0c;如果您想与他人分享视频…

[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他

前言 JDK1.8及之前和JDK9及之后的双亲委派模型是不一样的&#xff0c;这里学习了1.8及以前的双亲委派模型&#xff0c;记录笔记 一、类加载器 1.8之前主要是这几种类加载器&#xff1a; 1. 启动类加载器(Bootstrap ClassLoader)&#xff1a; 负责将存放在<JAVA_HOME>…

浅谈设计模式之单例模式

0 单例模式简介 单例模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。单例模式指的是单一的一个类&#xff0c;该类负责创建自己的对象&#xff0c;并且保证该对象唯一。该类提供了一种访问其唯一对象的方法&#xff0c;外部需要调用该类的对象可以通过方法获…

HTPP入门教程||HTTP 状态码||HTTP content-type

HTTP 状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

基于.net6的WPF程序使用SignalR进行通信

之前写的SignalR通信&#xff0c;是基于.net6api&#xff0c;BS和CS进行通信的。 .net6API使用SignalRvue3聊天WPF聊天_signalr wpf_故里2130的博客-CSDN博客 今天写一篇关于CS客户端的SignalR通信&#xff0c;后台服务使用.net6api 。其实和之前写的差不多&#xff0c;主要在…

基于html2canvas和jspdf将document DOM节点转换为图片生成PDF文件,并下载到本地

这里要用到html2canvas将document DOM节点转换为图片&#xff0c;并下载到本地_你挚爱的强哥的博客-CSDN博客前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件_你挚爱的强哥的博客-CSDN博客。会自动创建一个html文件。https://blog.csdn.net/qq_37860634/art…

stb_image简单使用

简介stb_image stb_image 是一个非常轻量级的、单文件的图像加载库&#xff0c;用于加载和解码多种图像格式&#xff08;如BMP、JPEG、PNG、GIF等&#xff09;的图像数据。它由Sean T. Barrett开发&#xff0c;并以公共领域&#xff08;Public Domain&#xff09;许可发布&…

字符函数和字符串函数上篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数 &a…

详解GPT技术发展脉络

文章目录 前言关于本篇的分享内容大语言模型大模型语言模型 百花齐放TransformerAuto-RegressiveResnetLayer-NormMaskScaled Dot-Product AttentionMulti-Head AttenionSelf-AttentionPositional Encoding关于并行计算关于长程依赖Transformer演化 GPT SeriesGPT-1GPT-2GPT-3 …

unity 2019 内置渲染管线 光照与Lighting面板 参数详解

文章目录 前言一 Unity的光照 与 烘焙光照1 unity完整的光照组成2 光的亮度与颜色3 全局光照直接光间接光5 间接光≠光照贴图 二 色彩空间与自动烘焙1 unity的色彩空间2 自动烘焙光照 三 烘焙1 什么是烘焙&#xff0c;烘焙的是什么2 如何进行烘焙3 烘焙的优点和缺点4 查看光照贴…

相交链表——力扣160

题目描述 法一&#xff09;哈希表 class Solution{ public:ListNode* getIntersectionNode (ListNode* headA, ListNode* headB){unordered_set<ListNode*> st;ListNode* temp headA;while(temp){st.insert(temp);temp temp->next;}temp headB;while(temp){if(st.c…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

《生活教育》期刊简介及投稿邮箱

《生活教育》期刊简介及投稿邮箱 《生活教育》杂志创办于1934&#xff0c;是中华人民共和国教育部主管的国家重点学术期刊&#xff0c;国家级期刊&#xff0c;中国知网全文收录G4期刊&#xff0c;它的理论是陶行知教育思想的主线和重要基石&#xff0c;陶行知的教育理论&#…

【C#】并行编程实战:使用延迟初始化提高性能

在前面的章节中讨论了 C# 中线程安全并发集合&#xff0c;有助于提高代码性能、降低同步开销。本章将讨论更多有助于提高性能的概念&#xff0c;包括使用自定义实现的内置构造。 毕竟&#xff0c;对于多线程编程来讲&#xff0c;最核心的需求就是为了性能。 延迟初始化 - .NET…

C#安装.Net平台科学计算库Math.Net Numerics

工作的时候需要使用到C#的Math.Net库来进行计算。 Math.Net库涵盖的主题包括特殊函数&#xff0c;线性代数&#xff0c;概率模型&#xff0c;随机数&#xff0c;插值&#xff0c;积分&#xff0c;回归&#xff0c;优化问题等。 这里记录一下&#xff0c;安装Math.Net库的过程…

el-date-picker组件的picker-options常规属性设置

查询已发生的配置项 // 日期选择器快捷键配置&#xff08;一般过去时&#xff09; pickerOptions: {shortcuts: [{text: 今天,onClick(picker) {let start new Date();let end new Date();picker.$emit(pick, [start, end]);}},{text: 昨天,onClick(picker) {let start new…

uniapp微信小程序使用axios(vue3+axios+ts版)

版本号 "vue": "^3.2.45", "axios": "^1.4.0", "axios-miniprogram-adapter": "^0.3.5", 安装axios及axios适配器&#xff0c;适配小程序 yarn add axios axios-miniprogram-adapter 使用axios 在utils创建utils/…

Flask SQLAlchemy_Serializer ORM模型序列化

在前后端分离项目中&#xff0c;经常需要把ORM模型转化为字典&#xff0c;再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前&#xff0c;我都是通过类似Java中的反射原理&#xff0c;获取当前ORM模型的所有字段&#xff0c;然后写一个to_dict方法来将字段以及…

计算机vcruntime140.dll丢失的解决方法,重新安装教程

vcruntime140.dll是Microsoft Visual C Redistributable文件中的一个动态链接库&#xff08;DLL&#xff09;。这个文件是由Microsoft开发的&#xff0c;用于支持C编程语言的运行环境。vcruntime140.dll是Windows系统非常重要的文件&#xff0c;通常会被一些应用程序或游戏所需…