详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用

news2025/2/25 11:41:36

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:首期文章
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

在此之前,耗时半个月,我已经将Redis进行了一个原理上的速成以及项目的制作,整个项目我觉得还是很不错的,基本已经涵盖了单结点Redis能做的所有事。而且在学习的过程中,我也将mybatis-plus、docker、nginx的反向代理、负载均衡都速成了一遍,收获还是很大的。

当然Redis的哨兵机制、分片集群这些我都还没去怎么学习,为了快点将自己的技术栈叠高一点,我直接进军微服务架构。

微服务技术栈的学习内容主要涵盖了SpringCloud、RabbitMQ、Docker、Redis、ElasticSearch、分布式等,要花上一段时间去学习,并且做一个中小型的项目。

微服务技术栈导学

  • 服务架构演变
    • 单体架构
    • 分布式架构
    • 微服务
  • 微服务技术对比
  • SpringCloud
  • 服务拆分及远程调用
    • 服务拆分
    • Demo工程
    • 远程调用

服务架构演变

微服务架构学习之前,经常做的项目是一个单体架构的。

单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:架构简单、部署成本低
缺点:耦合度高
单体架构肯定是不适合进行大型项目的开发的。

分布式架构

分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点:降低服务的耦合度,有利于服务的升级拓展
缺点:不同的功能都做成了服务集群,方法之间不再那么方便互相调用了,因此我们需要进行服务的治理

分布式架构要考虑以下的问题:

1、服务的拆分粒度;
2、服务集群地址的维护
3、服务之间的远程调用
4、感知服务的健康状态

微服务

到目前为止,微服务是解决分布式架构考虑问题的最佳解决方案,它是一种经过良好架构设计的分布式架构方案,微服务架构的特征:

1、单一职责:拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
2、面向服务:微服务对外暴露业务接口
3、自治:团队独立、技术独立、数据独立、部署独立
4、隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

总之,微服务架构非常符合我们之前学习软件工程、设计模式这些理论课过程中反复提到的高内聚、低耦合

微服务技术对比

在这里插入图片描述
可以看到,Feign是基于http请求的,只要我们是restful风格,调用和之前就差不多,学习成本会相对低很多。
学习微服务架构,比较推荐的方式就是SpringCloud+Feign或者SpringCloudAlibaba+Feign。

SpringCloud

官网地址:SpringCloud官网地址
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验,这也是它这么火热的原因。
需要注意好版本号问题:
在这里插入图片描述

服务拆分及远程调用

服务拆分

注意事项:

1、单一职责:不同微服务,不要重复开发相同业务
2、数据独立:不要访问其它微服务的数据库
3、面向服务:将自己的业务暴露为接口,供其它微服务调用

Demo工程

想要模拟一下服务的拆分,可以先自己试一下demo,查看不访问其他服务的数据库,能否实现业务之间的调用。

demo的工程代码,以及两个数据库表tb_user、tb_order都可以看我的资源去自行下载并验证,也可以直接在下面的百度网盘中下载:demo
这个demo的来源出自于黑马程序员。

导入工程,并且创建2个数据库,分别是cloud_order与cloud_order,各包含一张表(tb_order与tb_user),2张表不要创建在同一个数据库下面,要做到数据独立性,体现分布式。

自行修改配置文件,运行代码调通,都是很简单的query操作,不做解析了。
在这里插入图片描述
在这里插入图片描述

远程调用

当我们的用户想要看到订单详情表的时候,这个详情表除了要有订单的信息,还需要有购买的用户的信息,在单体架构我们很好实现这一点,只要我们能访问到用户的相关信息,那么用注解开发是很容易增加字段去注入用户信息的。
然而现在数据库是分离的,也就是说order-service无法直接访问user-service的数据库,因此,只能让订单业务去向用户业务发出请求:
在这里插入图片描述
远程调用方式分析:

1、回顾一下http请求原理,简单来说无非就是浏览器发出http请求信息,而服务中利用@GetMapping去接受请求,查询数据库后返还相应的信息给前端
2、因此可以设想让订单模块发起http请求给用户模块,用户模块查询自己的数据库后将相应数据返还给订单模块,做出拼接后即可得到订单详情表。

因此,应该思考如何使得java代码发出http请求。

Spring提供了一个工具叫做RestTemplate,专门用于在java代码中发起http请求。
1、在order-service的启动类OrderApplication中用@Bean注解注册RestTemplate:

	@Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

2、对订单的业务做修改:

@Service
public class OrderService {

    @Resource
    private OrderMapper orderMapper;

    @Resource
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.查询用户,利用RestTemplate发起http请求
        String url = "http://localhost:8081/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);//getForObject默认是返回json格式,如果指定返还的内容,则会自动反序列化
        //将用户注入到order中
        order.setUser(user);
        // 4.返回
        return order;
    }
}

现在已经成功查询到详情页了:
在这里插入图片描述
这篇文章就当洒洒水了,今天太累了,就摆烂了,明天调整回来。

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

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

相关文章

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而,通过采用一些有效的策略和方法,我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度,分享一些实用的建议和技巧,帮助读者在…

Echarts图表如何利用formatter自定义tooltip的内容和样式

在展示多数据图表的时候 有的时候需要图例也展示出一些内容来,例如官方这样子:鼠标悬停的时候展示该点数据 但是,官方提供的样式有时不适用所有的开发场景 我的项目需要实现鼠标悬停在某一点的时候,只展示该条线的数据&#xff0…

【python】进阶--->MySQL数据库(三)

一、修改列的类型长度及约束 alter table 表名 modify 列名 类型(长度) [约束];修改列名 : alter table 表名 change 旧列名 新列名 类型(长度) [约束];二、数据查询语言 查询表中所有的数据 : select * from 表名; 查询表中部分列数据 : select 列名1, 列名2 from 表名;1. …

长亭科技-雷池WAF的安装与使用

目录 1、安装雷池 2、登录雷池 3、简单配置 4、防护测试 5、其他补充 1、安装雷池 在Linux系统上执行如下命令 (需要docker环境,提前把docker、docker-compose 装好) bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release…

MySQL8.0安装(Linux - centos)

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 其他…

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访,使用运营商专线或是采用内网穿透方案,彼此之间究竟有何区别呢? 简单来说,MPLS专线和普通宽带类似是运营商提供的网络租…

【GitHub项目推荐--国外大神复刻暗黑2】【转载】

《暗黑破坏神2》,由顶尖游戏公司暴雪研发,2000 年上市,其资料片 2001 年上市,2D 画面。相信这款游戏已经成为很多人的回忆了,不知道当时是不是也和我一样沉迷于收集套装呢? 这款游戏的剧情设计、画面感都令…

js关闭当前窗口报错Scripts may close only the windows that were opened by them

文章目录 一、问题二、原因三、解决四、最后 一、问题 在Chrome浏览器中调用window.close()关闭当前页面时浏览器控制台报出 Scripts may close only the windows that were opened by them. 且无法关闭当前页面。 先上结论:不是通过JS打开的浏览器标签&#xff0c…

HTML--CSS--边框、列表、表格样式

边框样式 属性: border-width 边框宽度 border-style 边框外观 border-color 边框颜色 需要同时设定三个属性 border-width 边框宽度 取值为像素值 border-style 边框样式 none 无样式 dashed 虚线 solid 实线 border-color 边框颜色 如示例: 为div设…

知识点整理[(GraphGeo)RELATED WORK]

2 RELATED WORK 2.1 IP Geolocation 问题一:IP定位预测方法之一:Data mining-based methods 回答: 依赖于在公开的资源中挖掘位置线索来对目标IP(target IP)进行地理定位。其中一些数据分析了来自与IP相关的数据库,如WHOIS数据库和DNS的数据。 (1)例如,Moore等…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

NLP论文阅读记录 - WOS | 2022 使用语言特征空间的抽象文本摘要的神经注意模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Neural A…

SMART PLC绝对值定位往复运动控制(脉冲绝对定位+状态机编程)

三菱FX3GA系列绝对定位指令DDRVA实现往复运动控制详细内容介绍请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍SMART PLC里如何开启绝对值定位指…

前缀和模板题 P8218 【深进1.例1】求区间和

一道前缀和的模板题 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; ll a[N],prefix[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin >> n;for(int i 1; i < n; i) cin >> a[i]…

这可能是最全面的Java集合面试八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

yum来安装php727

yum 安装php727,一键安装&#xff0c;都是安装在系统的默认位置&#xff0c;方便快捷 先确定linux平台中centos的版本信息&#xff0c;一下内容针对el7 查看linux版本 &#xff1a; cat /etc/redhat-release 查看内核版本命令&#xff1a; cat /proc/version (0)如果有安装好…

RocketMQ源码阅读-Broker消息接收

RocketMQ源码阅读-Broker消息接收 1. 从单元测试入手2. Broker启动流程3. Broker接收消息4. Broker接收消息时序图5. 小结 Broker接收 Producer发送的消息。 Broker在RocketMQ中也是一个独立的Model&#xff0c;rocketmq-broker。 Broker的核心类为SendMessageProcessor。 …

vue项目之.env文件.env.dev、test、pro

.env文件是vue运行项目时的环境配置文件。 .env: 全局默认配置文件&#xff0c;所有环境(开发、测试、生产等&#xff09;均会加载并合并该文件 .env.development(开发环境默认命名) 开发环境的配置&#xff0c;文件名默认为.env.development,如果需要改名也是可以的&#xf…

[小程序]定位功能实现

第一步:首先要认识三个小程序的 api wx.chooseLocation 和 wx.getLocation 和 wx.openLocation (1).wx.chooseLocation 用于在小程序中选择地理位置。当用户点击选择位置按钮时&#xff0c;小程序会调起地图选择界面&#xff0c;用户可以在地图上选择一个位置&#xff0c;并可以…

openfeign服务启动成功但是注册不上nacos? 我看看怎么个事儿!

spring-cloud-starter-alibaba-nacos-discovery和spring-boot-starter-web不得不说的秘密 ! 直接上答案: 给你的服务加上springbootweb依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifa…