微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念

  • 区别于单体项目

  • 单体项目拆分成微服务项目的目标:高内聚、低耦合

  • 拆分思路

    • 纵向拆分:根据功能模块

    • 横向拆分:抽取可复用模块

2 微服务拆分——远程调用

背景:微服务单一职责,每个服务只有自己的功能和数据,拆分出来的模块需要用到其他模块的功能,如查询购物车时也需要查询商品信息,但是两个模块不能直接调用

  • 模拟前端向后台发送请求

  • RestTemplate:通过远程调用,发送 HTTP 请求,得到 HTTP 响应

3 服务治理

服务远程调用存在问题:

  1. 写代码时还不知道要调用的服务地址(还没启动):例如 cart-service 不知道 item-service 启动的地址 / 端口

  2. 如果知道了地址,集群模式下 item-service 部署在多台服务器上(多实例部署),开启了负载均衡,cart-service 不知道该访问哪个端口

  3. 选了一个进行访问,如果该服务挂了,怎办?

  4. 写死了访问地址,item-service 又在新的服务器 / 端口上启动了,怎么知道新启动的服务的地址?无法感知服务状态的变更

以上问题统称为 服务治理

3.1 注册中心原理

如何解决服务治理问题?1 2 3 4

三个角色

  • 每个服务既可以作为服务的调用者

  • 也可以作为服务的提供者

  • 注册中心(家政中心)

    • 服务提供者到注册中心注册服务信息

    • 服务调用者访问注册中心,订阅所需服务的信息

      • 负载均衡:随机、轮询、加权随机、加权轮询、哈希

    • 监控服务状态变更

      • 服务提供者需要与注册中心进行 心跳续约,如果服务挂了(不再发送续约消息)就会将该服务从服务注册表中移除,并向服务调用者推送变更

      • 注册中心会向服务调用者推送服务状态变更(有服务挂了、有新的服务启动)的新消息

3.2 搭建 Nacos 实现注册中心

  • Nacos 是一个注册中心组件

  • 使用 Docker 部署 Nacos 服务

  • 可以进入 Nacos 控制面板监控服务的健康状态和服务详情(如启动服务器 IP 和端口等)

3.3 服务注册

步骤

  1. 引入 nacos discovery 依赖

  2. 配置要注册的服务名称和 Nacos 的地址

  3. 启动服务实例(IDEA 的多个端口)

3.4 服务发现

步骤

  1. 引入 nacos discovery 依赖

  2. 配置 Nacos 地址

  3. 服务发现:到 Nacos 注册中心获取服务注册列表(可以使用 Spring Cloud 提供的 API)

    • 根据服务名称,获取服务实例列表

    • 负载均衡,选择一个实例进行请求

    • 获取实例的 IP 和端口,发起远程调用

3.5 治理结果

  • 服务调用者不再需要记住服务提供者的 IP 地址和端口号,而是根据服务名称 动态拉取 服务实例列表,并通过负载均衡选择随机选择一个服务实例进行调用

  • 服务挂了 ✔ 心跳续约

  • 新启动的服务 ✔ 推送变更

4 OpenFeign 的使用

1. 基本介绍

  • 声明式的 HTTP 客户端,基于 SpringMVC 的常见注解,更简单地实现 HTTP 请求的发送

2. 使用步骤

  • 引入依赖

负载均衡的实现早期用的是 Spring Cloud 的 Ribbon,现在用的是 loadbalancer

  • 项目主类 / 启动类使用注解 @EnableFeignClients 开启 OpenFeign 功能

  • 编写 FeignClient:使用 @FeignClient(value = "item-service"),@FeignClient 会将该类标记为一个 FeignClient 客户端,value 是服务名称, OpenFeign 会根据该 value 到注册中心去拉取实例列表

注意:这是一个不需要实现的接口,OpenFeign 会自动帮我们实现该接口

  • 使用 FeignClient,实现远程调用:配置好 FeignClient 接口后就可以像使用本地方法一样实现远程调用

List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3));

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

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

相关文章

[PYthon] 字典

如题&#xff0c;这篇博客将带大家来学习Python中的字典~ 那么&#xff0c;是我们想象中的那种字典嘛&#xff1f;接下来跟着可莉去一探究竟吧~ 可莉将这篇文章收录在了&#xff1a;《Python》 可莉推荐的优质博主主页&#xff1a;Keve ’ s blog Python 中的字典&#xff08;D…

-转换流-

它是字节流和字符流之间转换的桥梁 转换流本身其实是字符流&#xff1b; 转换流的位置&#xff1a; 分为两个&#xff1a;字符转换输入流&#xff1a;InputStreamReader将InputStream转换为Reader字符转换输出流&#xff1a;OutputStreamWriter将Writer转换为OutputStream 作用…

4.2 Verilog 过程赋值

关键词&#xff1a;阻塞赋值&#xff0c;非阻塞赋值&#xff0c;并行 过程性赋值是在 initial 或 always 语句块里的赋值&#xff0c;赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后&#xff0c;其值将保持不变&#xff0c;直到重新被赋予新值。 连续性赋值总是处…

LeetCode Python - 6.Z字形变换

文章目录 题目答案运行结果 题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输…

Qualcomm 蓝牙耳机 FAQ(41)---------Audio 问题分析之 ACAT Tools安装

大家好&#xff01; 新的一年&#xff0c;在此祝大家&#xff1a;新年快乐&#xff01;工作上步步高升&#xff01;&#xff01;龙年大吉&#xff01;&#xff01;&#xff01; 也欢迎大家登录大大通平台&#xff0c;春节期间正常更新文章&#xff0c;期待你的到来&#xff0…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例&#xff1a;使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1&#xff1a;自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2&#xff1a;实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

Qt中程序发布及常见问题

1、引言 当我们写好一个程序时通常需要发布给用户使用&#xff0c;那么在Qt中程序又是如何实现发布的呢&#xff0c;这里我就来浅谈一下qt中如何发布程序&#xff0c;以及发布程序时的常见问题。 2、发布过程 2.1、切换为release模式 当我们写qt程序时默认是debug模式&#x…

ICCV 2023 | 8篇论文看扩散模型diffusion用于图像检测任务:动作检测、目标检测、异常检测、deepfake检测...

1、动作检测 DiffTAD: Temporal Action Detection with Proposal Denoising Diffusion 基于扩散方法提出一种新的时序动作检测&#xff08;TAD&#xff09;算法&#xff0c;简称DiffTAD。以随机时序proposals作为输入&#xff0c;可以在未修剪的长视频中准确生成动作proposals。…

【爬虫作业】python爬虫作业——爬取汽车之家

爬取汽车之家期末作业&#xff1a; 代码如下所示&#xff1a; import random import timeimport requests #发送网络请求 import parsel import csv # 1.发送网络请求 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like G…

动漫风博客介绍页面源码

动漫风博客介绍页面源码&#xff0c;HTML源码&#xff0c;图片背景有淡入切换特效 蓝奏云&#xff1a;https://wfr.lanzout.com/iIDZu1nrmjve

Go内存优化与垃圾收集

Go提供了自动化的内存管理机制&#xff0c;但在某些情况下需要更精细的微调从而避免发生OOM错误。本文介绍了如何通过微调GOGC和GOMEMLIMIT在性能和内存效率之间取得平衡&#xff0c;并尽量避免OOM的产生。原文: Memory Optimization and Garbage Collector Management in Go 本…

codeforces 1400分

文章目录 1.[B. Phoenix and Beauty](https://codeforces.com/problemset/problem/1348/B)2.[C. Rotation Matching](https://codeforces.com/problemset/problem/1365/C)3.[C. Element Extermination](https://codeforces.com/problemset/problem/1375/C)4.[D. Epic Transform…

Java编程构建高效二手交易平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

二、Mybatis相关概念

1.对象/关系数据库映射&#xff08;ORM) ORM全称Object/Relation Mapping&#xff1a;表示对象-关系映射的缩写ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后&#xff0c;程序员既可以利用面向对象程序设计语言的简单易用性&#xff0c;又可以利用关系数…

【JS逆向三】逆向某某网站的sign参数,并模拟生成仅供学习

逆向日期&#xff1a;2024.02.06 使用工具&#xff1a;Node.js 类型&#xff1a;webpack 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某…

MySQL篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题二、解释 MySQL 外连接、内连接与自连接的区别三、Myql 中的事务回滚机制概述前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

来自谷歌的新年礼物!速来免费领取2个月谷歌Gemini Advanced会员!价值280元!对标ChatGPT Plus!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【iOS】——使用ZXingObjC库实现条形码识别并请求信息

文章目录 前言一、实现步骤二、扫描界面和扫描框的样式1.扫描界面2.扫描框 三、实现步骤 前言 ZXing库是一个专门用来解析多种二维码和条形码&#xff08;包括包括 QR Code、Aztec Code、UPC、EAN、Code 39、Code 128等&#xff09;的开源性质的处理库&#xff0c;而ZingObjC库…

网络编程..

1.互联网 有了互联网的出现 我们就可以足不出户的实现看电影、购物等等操作 我们认知中可能的互联网模型 较为真实的互联网模型 那么数据是如何从一个设备传递到另外一个设备的呢&#xff1f; 2.网络互联模型 统共有三种&#xff1a; 3.TCP/IP协议 TCP/IP是一群协议 里面…

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段&#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的&#xff0c;或者库是怎么形成的&…