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

news2024/12/29 9:39:44

目录

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 ? "下单成功" : "下单失败";

    }
}

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

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

相关文章

搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)

文章目录 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools2.3 分词问题(中文不友好) 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;1&#xff09;查看数据卷…

相机图像质量研究(1)Camera成像流程介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

检测到目标X-XSS-Protection响应头缺失

详细描述 HTTP X-XSS-Protection 响应头是 Internet Explorer&#xff0c;Chrome 和 Safari 的一个特性&#xff0c;当检测到跨站脚本攻击 (XSS)时&#xff0c;浏览器将停止加载页面。 X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。 解决办法 将您的服务…

清华青年AI自强作业hw7:基于Yolo实现位置检测任务

清华青年AI自强作业hw7&#xff1a;基于Yolo实现位置检测任务 简述作业实现相关链接 一起学AI系列博客&#xff1a;目录索引 简述 hw7作业为基于Yolo模型&#xff0c;对PASCAL_VOC_2007数据集的20类物体进行位置探测。数据集为600张图像&#xff0c;因此建议训练迭代次数小于10…

chrome插件”hello-world“开发详细流程以及日志定位

本插件开发文档翻译于Google官方文档Chrome Extension development basics - Chrome Developers 一、插件开发 hello-world插件开发的具体流程如下&#xff1a; 创建目录hello-world&#xff0c; 存放源代码 在此目录中创建一个名为manifest.json的新文件并添加以下代码&…

会声会影2023旗舰版Corel VideoStudio Ultimate 2023 V26.0.0.136整合盘版本

会声会影2023旗舰版Corel VideoStudio Ultimate 2023 V26.0.0.136整合盘版本是一款有趣且直观的视频编辑器&#xff0c;包含高级工具和高级效果&#xff0c;智能功能和最佳性能的高级视频编辑软件&#xff0c;将您最美好的时刻和生活体验变成令人惊叹的电影。 从自定义标题和过…

克服“一支笔,一双手,一道力扣(Leetcode)做一宿”的窘境:我的烦恼和建议

文章目录 每日一句正能量前言原因建议自己相关的经历可能存在的问题根据问题进行分解或建立思维导图分享好用的刷题网站并进行介绍后记 每日一句正能量 想升高&#xff0c;有两样东西&#xff0c;那就是必须作鹰&#xff0c;或者作爬行动物。——巴尔扎克 前言 作为一名计算机…

用Maven的exec插件执行Java程序

Maven的exec插件介绍 利用maven的exec插件可以执行系统和Java程序。 官网资源 exec插件官网&#xff1a;https://www.mojohaus.org/exec-maven-plugin/java-mojo.html Goals exec:exec表示在一个单独的进程内执行系统和Java程序。 exec:java表示在当前的Java虚拟机内执行J…

Jetpack Compose之学习前的准备~

作者&#xff1a;TimeFine 一、为啥学习Compose 学习Compose一开始我是拒绝的&#xff0c;因为习惯改变太大&#xff0c;写xml挺好的为啥要卷Compose&#xff1f; 后来看了郭霖大佬的文章 写给初学者的Jetpack Compose教程&#xff0c;为什么要学习Compose&#xff1f; 觉得大…

MySQL 进阶之王,MySql 性能实战源码 + 笔记 + 项目实战

随着互联网时代的兴起&#xff0c;MySQL 在数据库领域日益显现出举足轻重的地位&#xff0c;它不断扩大的用户群体就是很好的证明。在这样的背景下&#xff0c;需要越来越多的人在知识资源方面为之付出&#xff0c;将自己对 MySQL 数据库的学习过程、运维经验、个人理解等记录下…

强强联手!迅镭激光与安易控达成战略合作,双方携手发展再提速!

7月伊始&#xff0c;安易控中国首个新能源船舶动力电池系统自动化制造基地揭幕仪式在珠海高新区隆重举行&#xff0c;迅镭激光与安易控达成战略合作&#xff0c;双方秉承开放、共赢的合作理念&#xff0c;在船舶动力电池系统领域全面合作&#xff0c;共同为船舶动力系统与储能系…

前端 | (一)前端简介 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;前言&#x1f4da;课程前序知识&#x1f407;两位先驱&#x1f407;计算机基础知识&#x1f407;应用软件架构&#x1f407;浏览器&#x1f407;网页相关概念…

电解质溶液的电传导率

1 概述 在通电、交变磁场等外界作用下&#xff0c;溶液的离子浓度分布变化导致溶液电传导率改变。在电镀、电泳等电化学作业中&#xff0c;需要考虑离子浓度和电传导率之间的相互影响导致的质量问题。 仿真的电镀层厚度分布&#xff08;图源&#xff1a;comsol.com&#xff09;…

【玩转Linux操作】Linux进程(进程基本介绍,父子进程,终止进程,进程树)

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;进程的基本介绍&#x1f354;显示系统执行的进程⭐…

uniapp实现微信小程序自带的分享功能

定义 share.js 文件 export default {data() {return {// 默认的全局分享内容share: {title: 标题,path: /pages/index/index, // 全局分享的路径imageUrl: , // 全局分享的图片(可本地可网络)}}},// 定义全局分享// 1.发送给朋友onShareAppMessage(res) {return {title: this…

剑指offer37.序列化二叉树

先不讲题目&#xff0c;先讲讲序列化和反序列化。 一&#xff0c;序列化与反序列化 在Java中&#xff0c;序列化和反序列化是用于将对象转换为字节流和将字节流转换回对象的过程。序列化是将对象转换为字节流&#xff0c;以便可以在网络上传输或保存到文件中。而反序列化则是…

jb2文件在web端展示之easyJBIG2show

easyJBIG2show an easy JBIG2 file web show github地址 一、背景 最近无意中接触到了一个二维码图片&#xff0c;该图片格式是jb2格式。翻阅资料发现JBIG标准最初在1993年发布&#xff0c;在当时被广泛应用于传真机和文档扫描仪等设备中。JBIG采用了一种自适应二进制编码算…

7.14~7.15学习总结

Java的前置知识学习时间截至了&#xff0c;慌的一批~~。 看看自己学的&#xff0c;再看看要求学的&#xff0c;简直&#xff1a; 现在继续&#xff1a;IO流里面的Commons_IO的用法&#xff1a; public class Main {public static void main(String[]args) throws IOException…

初识Linux——“Linux”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰开了一个全新的专栏啦&#xff0c;这就是Linux&#xff0c;下面&#xff0c;让我们一起进入Linux的世界吧&#xff01;&#xff01;&#xff01; Linux 背景介绍 搭建 Linux 环境 使用 XShell 远程登陆到 Linux Lin…

图片速览 DCN K-means-friendly Spaces: Simultaneous Deep Learning and Clustering

本文使用了一种交替更新网络参数和聚类中心的方法。在网络更新完成之后&#xff0c;对于固定的网络参数和 M&#xff0c;再更新当前样本的分配向量。然后根据新的分配结果如式子3.8更新聚类中心&#xff1a; 注&#xff1a;文中还有问题是否能进行凸优化的部分 CG https…