2.服务拆分和远程调用

2.服务拆分和远程调用

任何分布式架构都离不开服务的拆分,微服务也是一样。

2.1.服务拆分原则

这里我总结了微服务拆分时的几个原则:

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

在这里插入图片描述

2.2.服务拆分示例

以课前资料中的微服务cloud-demo为例,其结构如下:

在这里插入图片描述

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

2.2.1.导入Sql语句

首先,将课前资料提供的cloud-order.sqlcloud-user.sql导入到mysql中:

在这里插入图片描述

cloud-user表中初始数据如下:

在这里插入图片描述

cloud-order表中初始数据如下:

在这里插入图片描述

cloud-order表中持有cloud-user表中的id字段。

2.2.2.导入demo工程

用IDEA导入课前资料提供的Demo:

在这里插入图片描述

项目结构如下:

在这里插入图片描述

导入后,会在IDEA右下角出现弹窗:

在这里插入图片描述

点击弹窗,然后按下图选择:

在这里插入图片描述

会出现这样的菜单:

在这里插入图片描述

配置下项目使用的JDK:

在这里插入图片描述

2.3.实现远程调用案例

在order-service服务中,有一个根据id查询订单的接口:

在这里插入图片描述

根据id查询订单,返回值是Order对象,如图:

在这里插入图片描述

其中的user为null

在user-service中有一个根据id查询用户的接口:

在这里插入图片描述

查询的结果如图:

在这里插入图片描述

2.3.1.案例需求:

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

在这里插入图片描述

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器
  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User
  • 将查询的User填充到Order对象,一起返回

2.3.2.注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:

package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

2.3.3.实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

在这里插入图片描述

2.4.提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

在这里插入图片描述

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

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

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

相关文章

接口测试详解,看完就会。。。

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递…

6. Z字形变换(js)

题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你…

力扣移掉k位数字402

Problem: 402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 : 给你一个以字符串表示的非负整数 num 和一个整数 k &…

服务器端口被占用怎么解决

服务器端口指的是用一个程序向服务器发起连接时的请求端口。 比如 FTP:23,HTTP:80,SMTP:25 这些都是TCP的端口,有的也用到UDP的端口。 1、公认端口:这种类型的端口通常称为“常用端口”。 这些…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

kubuctl patch 直接修改yaml文件,不使用edit

kubectl patch命令可以用于直接修改Kubernetes对象,而无需使用edit命令。这种方法非常适合在需要更新某些初始化后无法更新的资源字段时使用。 1、合并 假设我们有一个名为nginx-daemonset.yaml的DaemonSet对象,我们想要在其中添加一个新的容器。 apiV…

怎么抹掉 Macbook系统 并将它还原为出厂设置

抹掉 Mac 并将它还原为出厂设置 借助“抹掉所有内容和设置”这项功能,你可以快速安全地抹掉所有设置、数据和 App,同时保留当前安装的操作系统。 使用“抹掉所有内容和设置” 这项功能要求装有 macOS Monterey 或更高版本,且使用搭载 Apple 芯…

Gin之gin快速开始

1、gin快速开始 1.1 新建一个项目 [rootzsx src]# mkdir ginquickstart [rootzsx src]# cd ginquickstart/ [rootzsx ginquickstart]# go mod init ginquickstart go: creating new go.mod: module ginquickstart1.2 复制启动文件模板到项目目录中 [rootzsx ginquickstart]#…

网络安全笔记

一、简介 网络安全是指通过管理和技术手段保护网络系统免受未经授权的访问、数据泄露、破坏或摧毁。随着互联网的普及,网络安全问题日益突出,对个人和企业信息安全构成了严重威胁。因此,了解和掌握网络安全知识对于保护个人信息和企业数据至…

如何使用C++ max函数

在C中&#xff0c;你可以使用std::max()函数来获取两个值中的较大值。这个函数位于<algorithm>头文件中。 下面是使用std::max()函数的示例代码&#xff1a; #include <iostream> #include <algorithm>int main() {int a 10;int b 20;int max_value std…

关联系统-智能座舱控制器ICC

智能座舱构成 如上图所示&#xff0c;智能座舱主要是由仪表、中控、HUD、语音、DMS/OMS等多种交互通道组成&#xff0c;其宗旨是提升人的交互体验&#xff0c;使车辆更加智能化&#xff0c;情感化。 智能座舱内部功能 仪表功能 SR场景重构 如上图所示&#xff0c;仪表区域可实…

Redis相关面试题大全

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

为啥现在4位单片机依然没有被淘汰?

为啥现在4位单片机依然没有被淘汰&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xf…

详解gorm中DB对象的clone属性

详解gorm中DB对象的clone属性 Gorm 版本&#xff1a;v1.22.4 Where函数源码 // Where add conditions func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB) {tx db.getInstance()if conds : tx.Statement.BuildCondition(query, args...); len(conds) &…

网络安全概述

目录 网络安全背景 网络安全常识及术语 网络的脆弱性和常见安全攻击 网络环境的开放性 协议栈(TCP/IP)自身的脆弱性 物理层 -- 物理攻击 链路层 网络层 -- ICMP攻击 传输层 -- TCP SYN Flood攻击 应用层 -- DNS欺骗攻击 ​编辑 操作系统的脆弱性及常见安全攻…

DevEco Studio4.0/3.1预览器报错综合整理

题外话&#xff1a;额&#xff0c;这篇文章的由来&#xff0c;是在这篇文章DevEco Studio3.1报错...发布后&#xff0c;仍有人没解决预览不了的问题&#xff0c;然后就有小伙伴让我看看到底哪个地方出错了&#xff0c;为什么按照文章上的去做了&#xff0c;还是无法使用&#x…

JVM知识点总结

<<Java虚拟机规范>> 堆&#xff1a; Java堆可以处于物理上不连续的内存空间中&#xff0c;但在逻辑上应该被视为连续的。 所有对象实例及数组都应该堆上分配。注意:虽然规范是这样的&#xff0c;由于及时编技术的进步&#xff0c;尤其 逃逸分析技术的日渐强大&…

HCIP----MGRE实验

实验要求&#xff1a; 第一步&#xff0c;基本的IP地址配置 R1&#xff1a; [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 #配置PC的网关 [R1]int Serial 4/0/0 [R1-Serial4/0/0]link-protocol hdlc #R1和R2之间采用hdlc封装 [R1-S…

如何使用WebDAV云同步

如何使用WebDAV云同步 文章目录 如何使用WebDAV云同步1.WebDAV是什么&#xff1f;1.1 发现WebDAV的背景1.2 WebDAV是什么&#xff1f; 2.使用WebDAV国内推荐坚果云 1.WebDAV是什么&#xff1f; 1.1 发现WebDAV的背景 不久前我写过如何搭建chatGPT的web页面的博客&#xff0c;…

爬虫入门到精通_基础篇1(爬虫基本原理讲解, Urllib库基本使用)

01 爬虫基本原理讲解 1.什么是爬虫:请求网站并提取数据的自动化程序 2.爬虫基本流程&#xff1a; 发起请求&#xff1a;通过HTTP库向目标站点发起请求&#xff0c;即发送一个Request,请求可以包含额外的headers等信息&#xff0c;等待服务器响应。获取响应内容&#xff1a;如…