微服务导学

news2024/11/15 21:34:10

一、微服务导学

1.1 对比单体架构与分布式架构

单体架构

将业务的所有功能集中再一个项目中开发,打成一个包部署。

分布式架构

缺点: 模块多导致部署麻烦;架构复杂,难度大

1.2 微服务

经过良好架构设计的分布式架构方案,微服务架构特征:

缺点:架构更复杂,运维、监控、部署难度提高

为了实现高内聚,低耦合,降低程序之间的影响

1.2.1 微服务结构

注册中心:维护微服务里面每个节点的信息,并且监控节点的状态

配置中心:统一管理整个微服务群的配置。利用通知的方式让对应的服务去监控配置的变化,从而实现配置的更新

服务网关:作为入口。用户访问网关,然后由网关把请求路由到我们的微服务群(路由的时候还可以做负载均衡,路由的时候以及服务调用的过程中我们要做好服务的容错处理)

1.2.2

若使用Hoxton.SR10,则对应spring boot版本2.3.x版本

二、服务的拆分及远程调用

2.1 服务拆分注意事项

  • 不同微服务,不要重复开发相同业务

  • 微服务数据独立,不要访问其他微服务的数据库(每个微服务都有自己独立的数据库,从根源上杜绝了耦合性的一些业务)

  • 将自己的业务暴露为接口,供其他微服务调用

2.2服务拆分

我们可以准备两个不同的database去存储这些表,如下图所示

之后启动两个服务,下面的两个服务就符合拆分原则,order服务查寻订单,user服务查询用户,除此之外数据库也做了分离,每个服务都对应一个数据库而不是对应一张表

总结

  • 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务

  • 微服务可以将业务暴露为接口,供其他微服务使用

  • 不同微服务都应该有自己独立的数据库

2.3 微服务远程调用

2.3.1 根据订单id查询订单功能

案例:根据订单id查询订单的同时,把订单所属的用户信息一起返回

如下图所示,当我们查询订单信息的时候,发现最后一个参数"user"为null,下面我们就要实现"user"参数复制

下图所示的需求更清晰

那订单模块不能直接昂问用户模块的数据库,订单模块怎么获取用户信息呢? 答案是远程调用!

2.3.1.1怎么远程调用?

分析如下图所示:

订单模块可以通过http的形式向用户模块发送http请求从而获取到对应的用户数据

在订单数据表中我们发现有"user_id"字段,我们完全可以使用"user_id"字段的数据作为http请求的参数来获取用户数据

2.3.1.2 那订单模块怎么发送http请求?

第一步:注册RestTemplate

在order-service的OrderApplication中注册RestTemplate

通过@Bean的方式将RestTemplate注册为spring对象,将来我们在任何地方都能够注入这个对象

bean的注入一般放在配置类中,一般带有@SpringBootApplication的启动类也是配置类,那我们也可以在启动类中注入bean,注入之后我们便可以使用RestTemplate发送http请求

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
    
}
第二步:发送HTTP请求并封装数据

下面这个实体类就是我们要封装之后的

@Data
public class Order {
    private Long id;
    private Long price;
    private String name;
    private Integer num;
    private Long userId;
    private User user;
}
 @Autowired
    private RestTemplate restTemplate;


    public Order queryOrderById(Long orderId) {
        // 1.查询订单    从数据库中获取订单,订单数据中有user_id字段的值,我们要用这个字段的值找user
        Order order = orderMapper.findById(orderId);
        
        //2. 利用RestTemplate发起HTTP请求,获取用户
        //         get请求:getForObject(url路径,返回值类型)
        //                 我们下面的返回值类型不需要JSON,而是需要一个User对象的形式,所以写User.class
        //         post请求:postForObject()
        String url = "http://localhost:8081/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);

        //3. 封装user到Order中
        order.setUser(user);
        // 4.返回
        return order;
    }

最终访问时带有user用户信息,说明我们封装成功!!!

2.3.2 远程调用总结

  • 基于RestTemplate发起的http请求实现远程调用

  • http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可

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

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

相关文章

【Springboot系列】解析Springboot事件机制,从入门到大师

系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 继续写Springboot系列,争取早点结束。 1、是什么 Spring的事件(Application Event)为Bean与Bean之间的消息通信提供了支持 事件机制中有三种角色&#x…

RTOS中事件集的实现原理以及实用应用

事件集的原理 RTOS中事件集的实现原理是通过位掩码来实现的。事件集是一种用于在任务之间传递信号的机制。在RTOS中,事件集通常是一个32位的二进制位向量。每个位都代表一个特定的事件,例如信号、标志、定时器等。 当一个任务等待一个或多个事件时&…

Hbase备份与恢复工具Snapshot的基本概念与工作原理

数据库都有相对完善的备份与恢复功能。备份与恢复功能是数据库在数据意外丢失、损坏下的最后一根救命稻草。数据库定期备份、定期演练恢复是当下很多重要业务都在慢慢接受的最佳实践,也是数据库管理者推荐的一种管理规范。HBase数据库最核心的备份与恢复工具——Sna…

Spark+Vue+Springboot 协同过滤额音乐推荐大数据深度学习项目

一、项目背景 随着互联网的发展,大数据的到来,传统的音乐行业受到了很大的冲击,原有的音乐数字化给人们生活带来了极大的便利。随着数字音乐的兴起,各大音乐平台层出不穷,人们在音乐平台上收听音乐的时,常常因为歌曲信息繁杂,而不能找到自己想听的音乐。为了解决这个问题,音乐…

Elasticsearch:使用 Logstash 构建从 Kafka 到 Elasticsearch 的管道 - Nodejs

在我之前的文章 “Elastic:使用 Kafka 部署 Elastic Stack”,我构建了从 Beats > Kafka > Logstash > Elasticsearch 的管道。在今天的文章中,我将描述从 Nodejs > Kafka > Logstash > Elasticsearch 这样的一个数据流。在…

modbus转profinet网关连接ABB变频器在博图程序案例

在博图里PLC无需编程利用兴达易控modbus转Profinet网关,将ABB变频器接入到西门子网络中.用到设备为西门子1200PLC,ABB变频器及兴达易控Modbus转profinet网关一个;兴达易控Modbus转profinet协议转换器(XD-MDPN100)一台 打开博图添加1200PLC&am…

121.(leaflet篇)leaflet结合echarts4迁徙图

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

【数据挖掘与商务智能决策】第二章 特征工程与数据预处理

数据预处理 非数值类型数据处理 Get_dummies哑变量处理 1. 简单示例&#xff1a;“男”和“女”的数值转换 import pandas as pd df pd.DataFrame({客户编号: [1, 2, 3], 性别: [男, 女, 男]}) df客户编号性别01男12女23男 df pd.get_dummies(df, columns[性别]) df客户…

DetectGPT:使用概率曲率的零样本机器生成文本检测

DetectGPT的目的是确定一段文本是否由特定的llm生成&#xff0c;例如GPT-3。为了对段落 x 进行分类&#xff0c;DetectGPT 首先使用通用的预训练模型&#xff08;例如 T5&#xff09;对段落 ~xi 生成较小的扰动。然后DetectGPT将原始样本x的对数概率与每个扰动样本~xi进行比较。…

浏览器主页被hao123劫持的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

Redis哨兵(Sentinel)模式

前言 上一期实现了Redis的主从复制架构&#xff0c;由于主从模式在主节点宕机故障时整个Redis服务都不能再执行写操作&#xff0c;而无法保证Redis在整个系统中的高可用。 Redis提供了Sentinel哨兵机制来解决以上问题&#xff0c;当哨兵服务监测到master下线或宕机&#xff0…

汽车标定知识整理(二):CCP报文基本命令介绍

目录 一、基本命令 CRO命令报文的基本命令表&#xff1a; 二、基本命令与可选命令帧格式介绍 1、CONNECT——建立连接&#xff08;0x01&#xff09; 2、GET_CPP_VERSION——获取CCP版本&#xff08;0x1B&#xff09; 3、SET_MTA——设置内存传输地址&#xff08;0x02&#…

FPGA_边沿监测理解

一、简易频率计设计中为什么一定要获取下降沿?gate_a:实际闸门信号gate_a_stand:将实际闸门信号打一拍之后的信号gate_a_fall_s:下降沿标志信号cnt_clk_stand: Y值&#xff0c;即在实际闸门信号下&#xff0c;标准时钟信号的周期个数cnt_clk_stand_reg:保存Y值的寄存器核心问题…

展示企业情况的BI数据可视化大屏怎么做?

做综合展示企业情况的BI数据可视化大屏&#xff0c;就意味着要综合展示多个子公司或者部门的数据情况。首先要解决的就是多系统数据的整合、数据孤岛的束缚&#xff0c;其次才是数据分析模型构建、BI数据可视化大屏报表的制作。 1、整合多系统数据&#xff0c;消除数据孤岛现象…

flink大数据处理流式计算详解

flink大数据处理 文章目录flink大数据处理二、WebUI可视化界面&#xff08;测试用&#xff09;三、Flink部署3.1 JobManager3.2 TaskManager3.3 并行度的调整配置3.4 区分 TaskSolt和parallelism并行度配置四、Source Operator(资源算子)五、Sink Operator(输出算子)六、Flink滑…

系统检测维护工具Wsycheck使用(18)

实验目的 &#xff08;1&#xff09;学习Wsycheck的基本功能&#xff1b; &#xff08;2&#xff09;掌握Wsycheck的基本使用方法&#xff1b; 预备知识 windows操作系统的基本知识如&#xff1a;进程、网络、服务和文件等的了解。 Wsycheck是一款强大的系统检测维护工具,进程和…

js求解《初级算法》19.删除链表的倒数第N个结点

一、题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 二、思路 用虚拟头结点&#xff0b;双指针的方法解决该题&#xff0c;我们知道题目要求我们返回的是…

SpringMVC源码:参数解析、方法调用与返回值处理

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?

第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别&#xff1f; 在上一讲中&#xff0c;我分析了 Java 并发包中的部分内容&#xff0c;今天我来介绍一下线程安全队列。Java 标准库提供了非常多的线程安全队列&#xff0c;很容易混淆。 今天我要问你的…

谷歌浏览器和火狐浏览器永久禁用缓存【一劳永逸的解决方式】

目录 前言 谷歌浏览器 方式一 方式二 火狐浏览器 前言 缓存对于开发人员来说异常的痛苦,很多莫名其妙的bug就是由缓存导致的,但当我们在网上查找禁用缓存的方式时,找到的方式大多数都是在开发者工具的面板中勾选禁用缓存的选项,但这种方式有个弊端就是需要一直打开这个…