SpringCLoud——服务的拆分和远程调用

news2025/1/2 0:13:23

服务拆分

服务拆分注意事项

一般是根据功能的不同,将不同的服务按照功能的不同而分开。

微服务拆分注意事项

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

远程调用

对于远程调用,之前我们说过,微服务之所以不能像单个服务那样互相的调用各自服务的信息,是因为他们各自的服务都部署在各自的服务器上,而与部署在单个服务上不同,跨服务器之间的互相传递信息需要的是请求,而不是调用,所以如果我们想要实现远程调用,首先,我们要将服务向外暴露一个可供访问的请求端口,类似于下面的这种:api.gumengya.com/Api/UserInfo?format=json

当我们访问这个网址的时候,对应的数据就会被返回到浏览器中:

同样的,假设这是你的业务暴露接口,当我们访问这个接口的时候,你对应的服务就会启动,那么你的数据库中的数据就会被查询出来然后被返回到浏览器中。既然请求的对象从之前的单一服务器中的方法变成了一个网址,那么剩下的问题就是【如何在Java中发送Http请求,并将数据获取到】

这样,当我们在执行某些业务服务的时候,就可以通过另一个服务器暴露的接口,查询到存在于另一个服务器以及其数据库中的数据。

在SpringBoot中,我们选择使用RestTemplate来发送HTTP请求。

在使用RestTemplate工具之前,我们首先要创建一个SpringBoot的项目,然后导入Web的依赖:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

然后,我们需要将RestTemplate工具以第三方Bean的方式注册到SpringBoot中:

package Redis;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.client.RestTemplateBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

@SpringBootApplication

public class SpringBootRedisApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootRedisApplication.class, args);

    }

    @Bean

    public RestTemplate RestTemplate(){

        return new RestTemplate();

    }

}

以及,我们需要创建一个用来存储数据的容器类,因为这个请求的数据是嵌套的,所以我们需要两个类:

package Redis.pojo;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

@Data

@AllArgsConstructor

@NoArgsConstructor

public class test {

    private int code;

    private String msg;

    private data data;

}

package Redis.pojo;

import lombok.Data;

@Data

public class data {

    private String ip;

    private String location;

    private String isp;

    private String os;

    private String area;

    private String browser;

}

接下来,就是在测试类中使用RestTemplate来发送请求测试能否正常的拿到数据:

package Redis;

import Redis.pojo.test;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.web.client.RestTemplate;

import java.net.URI;

@SpringBootTest

public class RestTest {

    @Autowired

    private RestTemplate restTemplate;

    @Test

    void RestHttpRequestTest(){

        String url = "https://api.gumengya.com/Api/UserInfo?format=json";

        test forObject = restTemplate.getForObject(url, test.class);

        System.out.println(forObject);

    }

}

运行测试,结果如下:

现在能够顺利的拿到请求的结果,那么这个远程调用的小案例就完成了,做这个案例的意义在于,想象你当前处于微服务的一种一台服务中,比如订单服务,但是现在有一个业务需求是当你在展示订单的时候,顺便展示这个订单的下单用户,这时候,由于微服务的特性,你无法直接调用用户的Service,也无法访问到用户服务的数据库,那么这时候,你只有通过用户服务向外暴露的接口去访问用户的数据信息,这个用户向外暴露的接口,就和我们之前看到的那个网址是一样的,当我们在代码中使用RestTemplate去请求用户的接口的时候,我们就可以拿到用户的信息,并且可以指定不同的请求参数,根据当前服务的请求参数,去获取不同的对应用户的请求参数也是可以的,这就完成了一个最基本的远程调用的过程。

所谓的远程调用,其实就是将之前的单一服务器中,不同的Service之间的方法调用,变成了现在的不同服务之间的HTTP请求调用,其本质还是一样的,发送请求,获取数据。

提供者与消费者

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

假设,服务A调用了服务B,服务B调用服务C,那么服务B是什么角色。

角色是相对与业务来说的,所以服务具体扮演什么角色,要取决于当时所处的业务环境,【一个服务既可以是提供者,又可以是消费者】。

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

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

相关文章

「打造个人网盘」教你一招使用Net2FTP即可搭建免费web文件管理器

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

VR全景算不算好的创业项目?有哪些特性?

现在是全民创业的时代&#xff0c;大家都在找创业项目&#xff0c;那么什么是好的创业项目呢&#xff1f;有人会问VR全景算不算创业好项目呢&#xff1f;一般情况下好的创业项目&#xff0c;发展前景和市场消费群体都是比较大的&#xff0c;市场需求大才能满足多数消费者的需求…

acclerator和tensorboard共同使用采坑记录

acclerator和tensorboard共同使用采坑记录 问题描述可采用的方案可采用的方案1可采用的方案2其他可采用方案可采用方案的总结 建议的最终方案 问题描述 最近在做用多个GPU训练&#xff0c;我选择的是hugging face开源团队的acclerate库中的accelerator类来实现的&#xff0c;在…

多元函数的微分法

目录 复合函数微分法 隐函数微分法 复合函数求导与全微分 隐函数偏导数与全微分 复合函数微分法 复合函数微分法是一种求导方法&#xff0c;用于计算复合函数的导数。 假设有一个复合函数yf(u)&#xff0c;其中ug(x)&#xff0c;则复合函数微分法可以用于计算y对x的导数。根…

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化&#xff1f; OBJ格式是一种常用的三维模型文件格式&#xff0c;通常包含模型的顶点、法线、纹理坐标等信息&#xff0c;但有时候这些信息可能会使模型文件变得较大&#xff0c;不利于网络传输、加载和运行。 OBJ&#xff08;Object&#xff09;模型轻量化…

又一重磅利好来袭!Zebec Payroll 集成至 Nautilus Chain 主网

流支付协议 Zebec Protocol 正在积极的拓展自身生态&#xff0c;随着此前其全新路线图的发布&#xff0c;揭示了该生态从 Web3 世界向 Web2 世界跨越的决心。根据其最新路线图&#xff0c;Zebec Protocol 正在从最初构建在 Solana 上的流支付协议&#xff0c;拓展为囊括模块化公…

Linux下修改jar包中的配置文件application.conf

文件位置 jar包文件工程目录 打包后解压jar包目录 提取和上传 jar tf XXX.jar # 获取包内文件 application.conf是jar包的配置文件&#xff0c;如果修改需要 提取文件 jar xf my-app.jar application.conf 修改后上传文件 jar uf my-app.jar application.conf

快速加入Health Kit,一文了解审核流程

HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。 在获取用户授权后&#xff0c;开发者可以使用Health Kit提供的开放能力获取运动健康数据&#xff0c;基于多种类型数据构建运动健康领域应用与服务&#xff0c;为用户打造丰富、便捷、…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具&#xff1a;WPS 举例&#xff1a; EXCEL如何把一个单元格内的文本和数字批量分开&#xff1f;不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格&#xff0c;输入快捷键【CTRLE】进行填充。B2单元格也是…

C++新经典 | C++ 查漏补缺(类)

目录 1. 类对象的复制 2. 权限修饰符 3. 成员函数的定义与声明 4. 构造函数 &#xff08;1&#xff09;explicit关键字 &#xff08;2&#xff09;构造函数初始化列表 &#xff08;3&#xff09;默认构造函数 &#xff08;4&#xff09;default&#xff1b;和delete&…

SEC的下一步目标是什么?过时的证券法与加密货币行业,哪个会被先淘汰?

加密货币已经“不合规”了&#xff0c;尤其是其“商业模式”&#xff0c;至少美国证券交易委员会(SEC)主席Gary Gensler这样认为。由于这种观点在美国监管机构中普遍存在&#xff0c;因此涉及加密的执法行动达到历史最高水平也不足为奇。 在短短几年内&#xff0c;我们目睹了所…

MFC项目改为多字节字符集界面风格变为win98风格的问题

在项目->属性->配置属性中,将字符集改为多字节字符集&#xff0c;则界面风格变成了win98风格 解决办法&#xff0c;在stdafx.h中有 #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"typewin32 nameMicrosoft.Windows.Com…

【建议收藏】职场人口头和书面沟通必备词语,瞬间高大上

这年头&#xff0c;在职场不但要会做&#xff0c;还要会说。 会说还不能平铺直叙的说&#xff0c;还要能把普通的工作说出话来&#xff0c;这就需要一些“考究”的用词。尤其是在某些头部企业的带领下&#xff0c;业务不够、产品不行、解决方案不够新&#xff0c;就用华丽的辞…

浅谈C++|STL之list+forward_list篇

一.list基本概念 功能:将数据进行链式存储 链表&#xff08;list)是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由—系列结点组成 结点的组成:一个是存储数据元素的数据域&#xff0c;另一个是存储下一个结…

前端深入理解JavaScript面向对象编程与Class

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 什么是面向对象编程&#xff1f; 2. Class的基本概念 3. Class的语法 3.1 构造函数 3.2 属性 3.3 方…

中断子系统 --- 硬件相关层

中断控制器驱动 由于linux支持中断控制器的级联&#xff0c;因此多个中断控制器就可能包含相同的硬件中断号。为了可以通过中断号唯一地标识一个中断&#xff0c;linux引入了irq domain机制以实现将硬件中断号映射为全局唯一的逻辑中断号。 Hwirq映射到irq 每个中断控制器都对…

hive创建hbase表映射

将hbase中的表映射至hive中&#xff0c;便于表的操作 create external table student_info(id string,student_name string,gender string,pwd string,school_name string,location string ) stored by org.apache.hadoop.hive.hbase.HBaseStorageHandler withserdeproperties…

Python二级 每周练习题18

练习一: 从键盘输入任意字符串&#xff0c;按照下面要求分离字符串中的字符: 1、分别取出该字符串的第偶数位的元素(提醒注意:是按照从左往右数的方式确定字符串的位置) 2、并依次存储到一个列表中; 3、输出这个列表。 答案: ninput(请输入任意字符串:) #创建变量n存放用户…

【深度学习】卷积神经网络(LeNet)

卷积神经网络 LeNet #前言LeNet 模型代码实现MINST代码分块解析1 构建 LeNet 网络结构2 加载数据集3 初始化模型和优化器4 训练模型5 训练完成 完整代码 Fashion-MINST代码分块解析1 构建 LeNet 网络结构2 初始化模型参数3 加载数据集4 定义损失函数和优化器5 训练模型 完整代码…

6种最流行的API架构风格

作为一名 Java程序员&#xff0c;编写业务 API是非常日常的开发工作&#xff0c;那么&#xff0c;如何选择合适的 API框架&#xff1f;今天我们就来一起聊聊当下最流行的 6种API架构风格。 一、SOAP 定义 SOAP&#xff0c;Simple Object Access Protocol&#xff0c;中文翻译…