SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

目录

一, 服务架构的演变

1.1 单体架构

1.2 分布式架构

1.3 微服务

1.4 SpringCloud

二, 服务拆分和远程调用

2,1 服务拆分原则

2.2 服务拆分示例

2.3 创建相应数据库

 2.4 实现远程调用示例

1, 更改需求

2, 注册RestTemplate实现远程调用

 2.5 服务消费者和提供者


一, 服务架构的演变

1.1 单体架构

将业务的所有功能集中在一个项目中开发,打成一个包进行部署项目称为单体架构.

假设有一个商城项目,该项目包含订单模块,用户功能,商品功能以及支付功能,将该项目进行部署时,只需要将该项目的所有功能打包成一个包部署在Tomcat上即可,该项目所有业务功能都只访问一个数据库,如图所示:

单体架构的优点:结构简单,部署成本低(只需要将整个项目打包放在一个Tomcat下即可);

单体架构的缺点:耦合度高(因为一个项目中包含了所有业务功能,不同业务之间的数据都密切耦合).

1.2 分布式架构

根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务,多个这样的服务的组合称为分布式.

还是商城项目,项目包含4个业务功能,每个业务功能只需要开发和自己业务相关的代码即可,用户需要获取数据时只需要调用相应的模块即可,但是这几个模块使用的还是同一个数据库,如图所示:

分布式架构的优点:降低服务耦合(业务和业务之间相互独立),有利于服务的升级和拓展(需要其他业务模块时只需要单独开发该模块的代码即可);

分布式架构的缺点:服务调用关系错综复杂(假设某一个业务模块需要其他业务模块时就需要调用其他模块进行数据的获取).

1.3 微服务

分布式架构相对于单体架构一定程度上降低了业务模块之间的耦合性,但是正因为业务模块之间的耦合,不同业务模块想要进行交互时就会变的更加困难,还有我们定义的不同业务的粒度是多大,如何做到业务模块拆分的比较合理等等都是需要进一步解决的,所以引出了微服务的概念,微服务需要解决的问题如下:

  • 服务粒度的拆分;
  • 服务集群地址的维护;
  • 服务之间的远程调用;
  • 服务健康状态的感知.

微服务的架构特征

  • 单一职责:微服务拆分粒度很小,每一个服务对应唯一的业务能力,做到单一职责;
  • 自治:团队独立,技术独立,数据独立,独立部署和交付;
  • 面向服务:服务提供统一标准接口,与语言技术无关;
  • 隔离性强:服务调用做好隔离,容错,降级,避免出现级联问题.

用户进行服务访问时,会先经过服务网关,网关进行请求的过滤和路由,路由到相应的服务上,在相应的服务上进行数据库的访问等操作.

微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性,做到高内聚低耦合.

1.4 SpringCloud

从上述微服务的特征来看,可以认为微服务是一种经过良好架构设计的分布式架构方案,但是方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案,其中Java领域最引人注目的就是SpringCloud提供的方案了.

SpringCloud是目前国内使用最广泛的微服务框架;官网地址:Spring CloudSpring Cloud

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验,其中常见的组件包括:

二, 服务拆分和远程调用

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

2,1 服务拆分原则

微服务拆分一般有以下几个原则:

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

2.2 服务拆分示例

假设有一个微服务名为cloud-demo,其结构如下:

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

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

要求:

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

2.3 创建相应数据库

因为不同微服务所使用的数据库不一样,所以这里为了演示效果分别给order-service和user-service项目在一个机器上创建两个不同的数据库作为区分

order-service项目的tb_order表:

 user-service项目的tb_user表:

 2.4 实现远程调用示例

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

 根据查询结果可以看到,返回的Order对象中的user属性为null;

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

1, 更改需求

 order-service和user-service都可以根据id查询到相应的订单和用户信息,假设现在有一个需求是在查询到订单的同时返回相应的用户信息.

 因为不同业务模块之间是相互独立的,在order-service中查询相应订单的用户信息就需要在order-service模块下向user-service模块下发送一次http请求调用http://localhost:8081/user/{userId}这个接口获取到用户信息后再进行封装返回.

大概得步骤是这样的:

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

2, 注册RestTemplate实现远程调用

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

2.修改OrderService类中的queryOrderById方法实现远程调用

 3.重启服务器查看结果

 2.5 服务消费者和提供者

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

  • 服务提供者:一次业务中,被其他微服务调用的服务(提供接口给其他微服务)
  • 服务消费者:一次业务中,调用其他微服务的服务(调用其他微服务提供的接口)

 但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言,如果服务A调用了服务B,而服务B又调用了服务A,服务B既是服务提供者也是服务消费者.

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

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

相关文章

Pinia的十个简答小案例

1. 使用Pinia进行状态管理: import { defineStore } from piniaexport const useCounterStore defineStore({id: counter,state: () > ({count: 0}),actions: {increment() {this.count},decrement() {this.count--}} }) 2. 在组件中使用Pinia: &…

Nginx搭载负载均衡及前端项目部署

目录 ​编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 ​编辑三.前端项目打包 ​编辑四.前端项目部署 1.上传项目…

Mysql系列 -索引模型数据结构

索引就是排好序的数据结构,可以帮助我们快速的查找到数据,那么底层的数据到底是如何存储的呢? 为什么InnoDB 用的是Btree 存储结构? 大家可以看看这个可视化的网站 数据结构和算法的可视化工具 可以看到数据结构里面有链表&…

Postman接口自动化测试之——批量参数化(参数文件)

Postman接口请求中的参数引用格式:{{参数名}}参数文件只适用于集合中。 创建参数文件 以记事本举例,也可以使用其他编辑器;第一行参数名,用半角逗号(英文逗号)隔开,第二行为参数值&#xff0c…

Linux -----------------------Shell 流程判断

什么是shell Shell是操作系统的用户界面,负责接收和解释用户的命令,并将这些命令转化为操作系统内部能够理解的指令,然后执行相应的操作。Shell还允许用户编写脚本,以自动化和批处理任务,从而提高效率。在Linux系统中&…

100G QSFP28 BIDI LR1光模块最新解决方案

上期文章我们有介绍到100G QSFP28 BIDI ER1 Lite光模块,本期内容我们将继续为大家介绍100G光模块系列的100G QSFP28 BIDI LR1光模块。这款产品同样也在易天ECOC光通讯展展出,下面跟着小易一起来看看吧! 易天光通信的100G QSFP28 BIDI LR1单纤…

Redis中String类型的命令

目录 Redis中的内部编码 redis的数据结构和内部编码 Redis中的String类型 String类型的常见命令 set get mget mset String类型的计数命令 incr incrby decr incrbyfloat 其他命令 append getrange setrange strlen String类型的内部编码 Redis中的内部编码…

【源码】智能导诊系统,通过患者的主诉症状,自动匹配挂号科室和医生

随着计算机技术、网络技术、医院内网、智能终端的发展成熟,自动化、智能化就诊将是未来医院的发展模式。在目前综合性医疗机构,医院建设物庞大且复杂,接待就诊人员数量较大,医院诊疗科室众多,就诊人员容易迷失其中&…

Vue监听事件

一、问题场景 项目有个需求&#xff0c;在登录页面&#xff0c;输入好账号密码后&#xff0c;直接可以点击回车就能够登录&#xff0c;效果和点击登录按钮一样&#xff0c;登录页面源码如下 <template><body id"poster"><el-form class"login-…

linux 下 物理迁移 mysql 数据库 不能启动问题

1、授权问题 # chown -R 777 /app/db/mysql 2、/etc/my.cnf配置问题 [mysqld] basedir/app/db/mysql datadir/app/db/mysql/data socket/app/db/mysql/mysql.sock.lock innodb_buffer_pool_size128M innodb_force_recovery 1 symbolic-links0 [mysqld_safe] log-error/app/…

嵌入式linux常用的文件传输方式

做嵌入式就避免不了移植工作&#xff0c;所谓移植就是将交叉编译生成的可执行程序&#xff0c;库&#xff0c;配置文件等传输到开发板上进行工作。 常用传输方式有以下几种&#xff1a;1.串口传输 就是使用串口传输工具rz/sz; 该工具通过串口传输在SRT串口工具…

软文推广没效果?媒介盒子分享软文优化技巧

虽然软文推广能够为企业实现品牌增值&#xff0c;但也有许多企业在推广过程中犯错导致宣传没有效果&#xff0c;今天媒介盒子就来和大家聊聊企业在进行软文推广中的常见问题以及优化技巧。 问题1&#xff1a;内容生硬无法自然融入品牌信息 这也是企业在软文写作中较常出现的问…

win7中安装node14和vue

下载并安装低版本node 13 到官网去找早期历史版本的 nodejs 13 msi格式即可&#xff0c;并一键安装&#xff0c;我安装在了 D:\Program Files\nodejs 目录下 https://nodejs.org/download/release/v13.14.0/ 下载高版本node 14 下载高版本的node zip包 https://nodejs.org/…

生产环境docke问题排查

查看进程top查看具体的线程 top -H -p 8898如果cpu 过高&#xff0c;就是有问题的地方&#xff1b; 接下来根据docker查看具体的问题 查看dockers容器哪个内存、cpu占用过高 docker stats前言&#xff1a; 有java 启动容器&#xff1b;有jre包启动的容器。如下图 根据cpu很高…

【flink】Task 故障恢复详解以及各重启策略适用场景说明

文章目录 一. 重启策略种类&#xff08;Restart Strategies&#xff09;1. Fixed Delay Restart Strategy2. Failure Rate Restart Strategy3. Fallback Restart Strategy4. No Restart Strategy 二. 故障恢复策略&#xff08;Failover Strategies&#xff09;1. &#xff08;全…

【pdf密码】PDF没有密码,为什么不能编辑?

打开PDF文件的时候&#xff0c;没有提示带有密码&#xff0c;但是打开文件之后发现没有办法编辑PDF文件&#xff0c;这个是因为PDF文件设置了限制编辑&#xff0c;我们需要将限制取消才能够编辑文件。 那么&#xff0c;我们应该如何取消密码&#xff0c;编辑文件呢&#xff1f…

如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?

1. 数据库设计 首先&#xff0c;设计订单数据结构。使用数据库&#xff08;例如MySQL、MongoDB等&#xff09;&#xff0c;创建订单表以存储订单相关信息&#xff0c;包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…

02【保姆级】-GO语言开发注意事项(特色重点)

02【保姆级】-GO语言开发注意事项&#xff08;特色重点&#xff09; 一、Go语言的特性1.1 第一个hello word&#xff08;详解&#xff09;1.2 开发编译。&#xff08;重要点 / 面试题&#xff09;1.3 开发注意事项1.4 GO语言的转义字符1.5 注释1.6 API 文档 之前我学过C、Java、…

Nginx代理转发请求POST变GET请求问题

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接 &#x1f96d; 作者&#xff1a;Yuan-Programmer &#x1f34e; 个人博客&#xff1a;https://boke.open-yuan.com &#x1f349; 已经替换了新的域名&#xff0c;总站叫做&#xff1a;OpenYuan开袁网&#xff0…

EASYX实现多物体运动

eg1:单个物体运动使用easyx实现单个小球的运动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 4…