微服务2--服务治理与服务调用

前言 :本文主要阐述微服务架构中的服务治理,以及Nacos环境搭建、服务注册、服务调用,负载均衡以及Feign实现服务调用。

服务治理

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服 务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中 的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实 例的访问。

这里还有一个必不可少的组件,就是服务注册中心,它是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的一个作用。

常见的服务注册中心 

 Zookeeper:是一个分布式服务框架,主要用来解决分布式应用中经常遇到的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用 配置项的管理等。

 Eureka:Spring Cloud 微服务框架默认的也是推荐的服务注册中心,主要作用就是做服务注册和发现。主要面向分布式,服务化的系统提供服务注册、服务发现 和 配置管理的功能。

 Nacos:Ailibab旗下的开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,负责服务注册发现和服务配置。

对比总结

特性EurekaNacosZookeeper
一致性模型APAP/CP 可切换CP
健康检查心跳TCP/HTTP/自定义心跳
配置管理不支持支持支持(ZNode)
多数据中心不支持支持不支持
社区生态停滞活跃(阿里云)成熟(Apache)
适用场景Spring Cloud 旧项目全功能服务治理强一致性协调服务

Nacos

        Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款集服务注册与发现、配置管理于一体的动态服务管理平台。它帮助开发者构建云原生应用和微服务架构,实现服务的动态发现、健康管理、配置统一管理等功能。 

环境搭建

下载地址:https://github.com/alibaba/nacos/releases

进入bin目录

启动Nacos 

startup.cmd -m standalone

访问网址:127.0.0.1:8848/nacos 

服务注册

 1.添加依赖

<!--nacos 客户端-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.启动类注解标签

@EnableDiscoveryClient 

3. 定义服务名,添加nacos服务地址

spring:application:name: service-order #服务名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 #nacos 地址

此时商品,订单,用户服务均已注册成功。 

服务调用

使用 nacos 客户端根据服务名动态获取服务地址和端口
@RestController
@RequestMapping("/order")
public class OrderController{@AutowiredOrderService orderService;@AutowiredDiscoveryClient discoveryClient;@AutowiredRestTemplate restTemplate;@RequestMapping("/create/{pid}/{uid}/{num}")public Order createOrder(@PathVariable("pid") int pid, @PathVariable("uid")int uid, @PathVariable("num") int num){ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0);//ip + portString purl = serviceInstance.getHost() + ":" + serviceInstance.getPort();//使用ServiceInstance userviceInstance = discoveryClient.getInstances("service-user").get(0);//ip + portString uurl = userviceInstance.getHost() + ":" + userviceInstance.getPort();Product p = restTemplate.getForObject( "http://" + purl + "/product/get/" + pid, Product.class);User u = restTemplate.getForObject( "http://" + uurl + "/user/get/" + uid, User.class);Order order= null;if(p!=null){if(p.getStock()>=num){if(u!=null){order = orderService.saveorder(pid,uid,num);}}}return order;}
}

 与单一使用 RestTemplate 使用 http 方式远程访问相比,解决了很多繁琐的步骤与人工维护。

负载均衡 

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

自定义实现

1.修改端口启动多个商品微服务

2.将获取服务的方式改为随机获取

 核心代码:

//获取服务列表
List<ServiceInstance> instances =
discoveryClient.getInstances("service-product");
//随机生成索引
Integer index = new Random().nextInt(instances.size());
//获取服务
ServiceInstance productService = instances.get(index);
//获取服务地址
String purl = productService.getHost() + ":" +
productService.getPort();

Ribbon实现

 Ribbon 是 Spring Cloud 的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡。

1.在 RestTemplate 的生成方法上添加@LoadBalanced 注解

2.修改服务调用的方法

        Product p = restTemplate.getForObject( "http://service-product/product/get/" + pid, Product.class);User u = restTemplate.getForObject( "http://service-user/user/get/" + uid, User.class);

Ribbon 支持的负载均衡策略 Ribbon 内置了多种负载均衡策略,内部负载均衡的顶级接口为 com.netflix.loadbalancer.IRule

3. 配置

ribbon:ConnectTimeout: 2000 # 请求连接的超时时间ReadTimeout: 5000 # 请求处理的超时时间
service-product: # 调用的提供者的名称ribbon:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule #负载均衡策略

Ribbon 的七种负载均衡策略

轮询策略: RoundRobinRule,按照一定的顺序依次调用服务实例。比如一 共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务 3, 依次类推。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
权重策略: WeightedResponseTimeRule,根据每个服务提供者的响应时 间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服 务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
随机策略: RandomRule,从服务提供者的列表中随机选择一个服务实例。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
最小连接数策略: BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
可用敏感性策略: AvailabilityFilteringRule,先过滤掉非健康的服务实例, 然后再选择连接数较小的服务实例。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
区域敏感策略: ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

Feign

服务调用

1.添加依赖

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

2.启动类添加Feign注解

@EnableFeignClients//开启 Fegin

 3.创建Service接口,使用Feign实现服务调用

@FeignClient(name = "service-product")
public interface ProductService {@GetMapping("/product/get/{id}")Product findProductById(@PathVariable int id);
}

4.调用

    //使用前要注入@AutowiredProductService productService;
        //使用feignProduct p = productService.findProductById(pid);//不使用feignUser u = restTemplate.getForObject( "http://service-user/user/get/" + uid, User.class);

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

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

相关文章

智能麻将出牌组件

开篇引言​ 麻将作为一款风靡全球的策略性游戏&#xff0c;其复杂的规则和多变的牌局给玩家带来了无尽乐趣。在数字化时代&#xff0c;运用编程技术为麻将游戏赋予智能&#xff0c;实现自动出牌功能&#xff0c;不仅能提升玩家体验&#xff0c;还能深入探索算法在博弈游戏中的…

“大湾区珠宝艺境花园”璀璨绽放第五届消博会

2025年4月13日&#xff0c;第五届中国国际消费品博览会&#xff08;以下简称"消博会"&#xff09;重要主题活动——《大湾区珠宝艺境花园》启动仪式在海南国际会展中心2号馆隆重举行。由广东省金银珠宝玉器业厂商会组织带领粤港澳大湾区优秀珠宝品牌&#xff0c;以“…

基于前端技术的QR码API开发实战:从原理到部署

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…

利用耦合有限元和神经网络计算的骨重塑模拟多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要&#xff1a;本文旨在开发一种基于有限元分析&#xff08;FEA&#xff09;和神经网络&#xff08;NN&#xff09;计算的多尺度分层混合模型&#xf…

使用异步特征引发的错误error[E0195]: lifetime parameters or bounds on method `before_save`

问题描述&#xff1a; 使用SeaOrm保存实体到数据库时不想每次都设置更新时间&#xff0c;所以想通过实现ActiveModelBehavior在保存实体前统一设置更新时间 impl ActiveModelBehavior for ActiveModel {async fn before_save<C>(self, _db: &C, _insert: bool) -&…

TVS管与ESD保护二极管详解:原理、区别与应用选型

一、TVS管&#xff08;瞬态电压抑制二极管&#xff09; 1. 基本定义 TVS管&#xff08;Transient Voltage Suppressor&#xff09; 是一种用于抑制瞬态高压脉冲的半导体器件&#xff0c;通过雪崩击穿效应快速钳位电压&#xff0c;保护后端电路。 2. 核心特性参数 参数定义公…

Day08 【基于jieba分词实现词嵌入的文本多分类】

基于jieba分词的文本多分类 目标数据准备参数配置数据处理模型构建主程序测试与评估测试结果 目标 本文基于给定的词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;然后将词基于词表进行初步编码&#xff0c;之后经过网络层&#xff0c;输出在已知类别标…

入门-C编程基础部分:6、常量

飞书文档https://x509p6c8to.feishu.cn/wiki/MnkLwEozRidtw6kyeW9cwClbnAg C 常量 常量是固定值&#xff0c;在程序执行期间不会改变&#xff0c;可以让我们编程更加规范。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字…

第二阶段:数据结构与函数

模块4&#xff1a;常用数据结构 (Organizing Lots of Data) 在前面的模块中&#xff0c;我们学习了如何使用变量来存储单个数据&#xff0c;比如一个数字、一个名字或一个布尔值。但很多时候&#xff0c;我们需要处理一组相关的数据&#xff0c;比如班级里所有学生的名字、一本…

【C++算法】61.字符串_最长公共前缀

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;解释 题目链接&#xff1a; 14. 最长公共前缀 题目描述&#xff1a; 解法 解法一&#xff1a;两两比较 先算前两个字符串的最长公共前缀&#xff0c;然后拿这个最长公共前缀和后面一个来比较&…

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中&#xff0c;Java 虚拟机&#xff08;JVM&#xff09;的性能调优一直是一项极具挑战性的任务&#xff0c;尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈&#xff0c;甚至频繁抛出内存溢出异常&#xff0c;影响业…

纷析云开源财务软件:企业财务数字化转型的灵活解决方案

纷析云是一家专注于开源财务软件研发的公司&#xff0c;自2018年成立以来&#xff0c;始终以“开源开放”为核心理念&#xff0c;致力于通过技术创新助力企业实现财务管理的数字化与智能化转型。其开源财务软件凭借高扩展性、灵活部署和全面的功能模块&#xff0c;成为众多企业…

【数字图像处理】数字图像空间域增强(3)

图像锐化 图像细节增强 图像轮廓&#xff1a;灰度值陡然变化的部分 空间变化&#xff1a;计算灰度变化程度 图像微分法&#xff1a;微分计算灰度梯度突变的速率 一阶微分&#xff1a;单向差值 二阶微分&#xff1a;双向插值 一阶微分滤波 1&#xff1a;梯度法 梯度&#xff1…

基于Linux的ffmpeg python的关键帧抽取

1.FFmpeg的环境配置 首先强调&#xff0c;ffmpeg-python包与ffmpeg包不一样。 1) 创建一个虚拟环境env conda create -n yourenv python3.x conda activate yourenv2) ffmpeg-python包的安装 pip install ffmpeg-python3) 安装系统级别的 FFmpeg 工具 虽然安装了 ffmpeg-p…

C#进阶学习(四)单向链表和双向链表,循环链表(上)单向链表

目录 前置知识&#xff1a; 一、链表中的结点类LinkedNode 1、申明字段节点类&#xff1a; 2、申明属性节点类: 二、两种方式实现单向链表 ①定框架&#xff1a; ②增加元素的方法&#xff1a;因为是单链表&#xff0c;所以增加元素一定是只能在末尾添加元素&#xff0c;…

RK3588 Buildroot 串口测试工具

RK3588 Buildroot串口测试工具(含代码) 一、引言 1.1 目的 本文档旨在指导开发人员能快速测试串口功能 1.2 适用范围 本文档适用于linux 系统串口测试。 二、开发环境准备 2.1 硬件环境 开发板:RK3588开发板,确保其串口硬件连接正常,具备电源供应、调试串口等基本硬…

HOJ PZ

https://docs.hdoi.cn/deploy 单体部署 请到~/hoj-deploy/standAlone的目录下&#xff0c;即是与docker-compose.yml的文件同个目录下&#xff0c;该目录下有个叫hoj的文件夹&#xff0c;里面的文件夹介绍如下&#xff1a; hoj ├── file # 存储了上传的图片、上传的临…

EtherCAT 的优点与缺点

EtherCAT&#xff08;以太网控制自动化技术&#xff09;是一种高性能的工业以太网协议&#xff0c;广泛应用于实时自动化控制。以下是其核心优缺点分析&#xff1a; ​一、EtherCAT 的核心优点​ 1. ​超低延迟 & 高实时性​ ​原理​&#xff1a;采用"​Processing…

高并发多级缓存架构实现思路

目录 1.整体架构 3.安装环境 1.1 使用docket安装redis 1.2 配置redis缓存链接&#xff1a; 1.3 使用redisTemplate实现 1.4 缓存注解优化 1.4.1 常用缓存注解简绍 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 优化 2.安装Ngin…

Qt QML实现Windows桌面颜色提取器

前言 实现一个简单的小工具&#xff0c;使用Qt QML实现Windows桌面颜色提取器&#xff0c;实时显示鼠标移动位置的颜色值&#xff0c;包括十六进制值和RGB值。该功能在实际应用中比较常见&#xff0c;比如截图的时候&#xff0c;鼠标移动就会在鼠标位置实时显示坐标和颜色值&a…