微服务使用指南

微服务使用指南

1.初识微服务

微服务可以认为是一种分布式架构的解决方案,提供服务的独立性和完整性,做到服务的高内聚、低耦合。

目前服务架构主要包含:单体架构和分布式架构

1.1 单体架构

单体架构:把所有业务功能模块都放在一个项目中进行开发,打成一个包部署。

优点:架构简单、易部署

缺点:功能模块耦合度高,升级维护困难

1.2 分布式架构

分布式架构:将系统中每个业务功能模块作为独立项目进行开发,分开进行部署,每个项目称为一个服务。

优点:耦合度低、有利于功能模块升级与维护

缺点:架构复杂、部署有一定难度

2.微服务特点

  • 独立职责:每个服务对应一个业务功能,职责独立
  • 自治:因为每个服务都是一个独立项目,因此可以根据技术背景让不同的团队开发不同的服务,每个服务有自己的数据库,开发完成后进行独立部署,实现团队独立、技术独立、数据自治、独立部署与运行
  • 面向服务:服务提供统一标准的接口与外界进行交互,与语言和技术无关
  • 隔离性强:服务之间都是独立的,只能通过统一接口进行访问,隔离性强

3.微服务框架-SpringCloud

全球各地的互联网公司都在寻求可以落地的微服务方案,目前国内使用最广泛的微服务框架还是SpringCloud,官网地址:https://spring.io/projects/spring-cloud。SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

在这里插入图片描述

:SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系

在这里插入图片描述

4.服务拆分与远程调用

4.1 服务拆分

任何分布式架构方案都需要考虑服务拆分的问题:

  • 服务拆分的粒度如何确定?
  • 不同服务之间如何调用?
  • 不同服务之间调用关系如何管理?

微服务进行服务拆分的原则:

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

例:现在要开发两个微服务:支付微服务和订单微服务,支付微服务中需要用到订单微服务中的数据

  • 支付微服务和订单微服务是两个完全不同的业务,不能包含相同的业务

  • 支付微服务和订单微服务都需要有自己的数据库,支付微服务不能访问订单微服务的数据库

  • 支付微服务和订单微服务都可以暴露自己的Restful接口供其它微服务使用,支付微服务可以通过访问订单微服务暴露的接口去获得数据

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

服务调用者:业务中访问其它微服务的服务称为服务调用者,就是一个服务去访问其它微服务暴露的业务接口

服务提供者:业务中被其它微服务访问的服务称为服务提供者,就是一个服务暴露业务接口供其它微服务访问

服务调用者和服务提供者的角色并不是绝对的,是相对与业务而言的,一个微服务既可以是服务调用者也可以是服务提供者

4.2 远程调用

实现微服务之间的调用,最开始的方式可以使用注册RestTemplate实例的方式,RestTemplate是用于服务之间远程通信的一个类,以上文提到的支付微服务和订单微服务为例,支付微服务中需要用到订单微服务中的数据。步骤如下:

注册RestTemplate到容器到支付微服务的Spring中

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class PayApplication {

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

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

在支付微服务的业务方法中使用RestTemplate向订单微服务发起请求

一般是在支付微服务的service层代码中,步骤如下:

  1. 注入RestTemplate对象
  2. 定义url,包括订单微服务的ip、端口、访问接口、访问参数
  3. 调用RestTemplate的getForObject对象,进行结果的解析和封装
    @Autowired
    private RestTemplate restTemplate; 

	String url = "http://127.0.0.1:8080/order/"+id;
 	Order order = restTemplate.getForObject(url, Order.class);
String url = "http://127.0.0.1:8080/order/"+id;
Order order = restTemplate.getForObject(url, Order.class);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【代码随想录】算法训练计划16

【代码随想录】算法训练计划04 1、111. 二叉树的最小深度 题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路: 用递归&#xff0…

在已有的虚拟环境中升级python版本

对于现有的虚拟环境,想升级python版本方法,试了无数的方法终于找对了。 1.首先activate对应的虚拟环境,然后输入下面的命令: conda install python3.8 建议加上镜像源 ​conda install python3.8 -i https://pypi.tuna.tsingh…

css实现进度条

预期样式 方法一 <script setup> import { ref } from "vue"; // import ScreenLeft from "./ScreenLeft/index.vue"; const width ref("76.5%"); </script><template>Screen<div class"progress-contain">…

操作系统 day08(进程通信)

进程通信的概念 进程间通信是指两个进程之间产生数据交互进程通信需要操作系统的支持&#xff0c;由于进程是分配系统资源&#xff08;包括内存地址&#xff09;的单位&#xff0c;因此各进程拥有的内存地址空间相互独立。同时为了保证安全&#xff0c;一个进程不能直接访问另…

如何实现云端开发能力快速提升?【DevRun】云上开发创新实践带你实现

随着企业数字化的转型趋势&#xff0c;软件成为数字化转型的关键驱动力&#xff0c;在云计算越来越普及且作用愈发重要的今天&#xff0c;现代应用正以难以想象的速度在增长&#xff0c;同时对软件开发工具提出了新的要求。 华为云CodeArts作为一站式云上开发创新工具&#xf…

【Python自学笔记】Flask调教方法Internel Server Error

收到老师的小组作业任务说是写一个自动报告程序&#xff0c;用PythonSQLiteHTML实现&#xff0c;好吧。 前面没什么问题&#xff0c;打开VSCode&#xff0c;连数据库读数据处理可视化模板拼凑&#xff0c;最后调用Flask框架出网页报告的时候总报错连接不了。 但换了jinjia2的渲…

【Linux】文件重定向以及一切皆文件

文章目录 前言一、重定向二、系统调用dup2三、重定向的使用四、一切皆文件 前言 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2&#xff0c; 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff…

Git的简介以及基本使用

目录 一.Git的简介 拓展&#xff1a;Git与SVN的区别&#xff08;各自的优点与缺点&#xff09; 二.Git文件的4种状态 三.Git的常用命令 搭建完成之后&#xff0c;将项目文件也上传之后&#xff0c;现在模拟其他人来下载这个代码 今天就分享到这啦&#xff01;&#xff01;…

第五章:Testing Modules

文章目录 State and ProgramsTestability of State-Based Programsintrusively test 侵入性测试Non-intrusive test 非侵入测试java和其他工具的实践有限状态机进行单元测试(Unit testing with FSA)构建状态机步骤step1:识别 FSA 状态step2:确定某个状态下的可用操作step3:…

pytorch_神经网络构建5

文章目录 生成对抗网络自动编码器变分自动编码器重参数GANS自动编码器变分自动编码器gans网络Least Squares GANDeep Convolutional GANs 生成对抗网络 这起源于一种思想,假如有一个生成器,从原始图片那里学习东西,一个判别器来判别图片是真实的还是生成的, 假如生成的东西能以…

Qt 二维码生成与识别

1.简介 QZXing是一个基于Qt框架的二维码解码库&#xff0c;它是对ZXing&#xff08;Zebra Crossing&#xff09;开源项目的一个Qt封装。ZXing是一个功能强大的开源二维码解码库&#xff0c;支持多种类型的码&#xff0c;包括QR码、DataMatrix码、Aztec码等。 QZXing提供了一个…

Flink(一)【WordCount 快速入门】

前言 学完了 Hadoop、Spark&#xff0c;本想着先把 Kafka、Flume 这些工具先学完的&#xff0c;但想了想还是把核心的技术先学完最后再去把那些工具学学。 最近心有点累哈哈哈&#xff0c;偷偷立个 flag&#xff0c;反正也没人看&#xff0c;明年的今天来这里还愿哈&#xff0c…

vue3错误排查-POST请求的body参数 传参方式form-data和json

问题&#xff1a;vue3实现登录功能&#xff0c;登录成功后 跳转到登陆后的界面 一秒后 闪退回登录页 对应的输出结果也一闪而过&#xff0c;反复复查了代码&#xff0c;没问题。&#xff08;封装的 post 请求未成功发起&#xff09; 自测&#xff1a;进行断点输出调试。强行跳…

接口幂等性详解

1. 什么是幂等性 幂等性指的是对同一个操作的多次执行所产生的影响与一次执行的影响相同。无论操作执行多少次&#xff0c;系统状态都应该保持一致。 在计算机科学和网络领域中&#xff0c;幂等性通常用来描述服务或操作的特性。对于RESTful API或HTTP方法&#xff0c;一个幂…

049-第三代软件开发-软件部署脚本(一)

第三代软件开发-软件部署脚本(一) 文章目录 第三代软件开发-软件部署脚本(一)项目介绍软件部署脚本(一)其他方式 关键字&#xff1a; Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object…

Java 最常见的面试题:常用的 jvm 调优的参数都有哪些?

Java 最常见的面试题&#xff1a;常用的 jvm 调优的参数都有哪些? 常用的Java虚拟机&#xff08;JVM&#xff09;调优参数有很多&#xff0c;以下是一些重要的参数&#xff1a; -Xms 和 -Xmx&#xff1a;这两个参数分别设置了JVM启动内存的最小值和最大值&#xff0c;单位通…

毅速丨为什么不锈钢材料在金属3D打印中应用广泛

不锈钢材料作为一种常见材料&#xff0c;在金属3D打印中应用广泛&#xff0c;可以说是目前使用率最高的材料&#xff0c;为什么不锈钢大受欢迎&#xff0c;主要由几点原因。 第一、工艺适合性 金属3D打印的工艺&#xff0c;如直接金属激光烧结&#xff08;DMLS&#xff09;或选…

Leetcode—2578.最小和分割【简单】

2023每日刷题&#xff08;二十三&#xff09; Leetcode—2578.最小和分割 实现代码 class Solution { public:int splitNum(int num) {vector<int> a;while(num) {a.push_back(num % 10);num / 10;}int n a.size();sort(a.begin(), a.begin() n);int num1 0;int num…

【Spring】bean的自动装配

目录 一.byName 二.byType 快捷书写 people1 package org.example;public class People1 {public void eat(){System.out.println("吃饭");} }people2 package org.example;public class People2 {public void sleep(){System.out.println("睡觉");} …

【SVN】

SVN 1 svn使用1.1 主干合并到分支1.2 分支合并到主干1.3 分支建立1.4 创建分支1.5 切换分支1.6 合并分支1.7 删除分支 2 概念理解 1 svn使用 1.1 主干合并到分支 首先&#xff0c;在本地trunk中先update一下&#xff0c;有冲突的解决冲突&#xff0c;保证trunk和repository已…