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

服务拆分

服务拆分注意事项

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

微服务拆分注意事项

  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是什么角色。

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

相关推荐
Smoothcloud润云7 小时前
从“预测下一个词”到“预测下一个世界状态”:世界模型作为AGI新范式的深度分析报告
人工智能·测试工具·微服务·容器·github·状态模式·agi
却话巴山夜雨时i10 小时前
互联网大厂Java面试实录:技术栈解析与场景剖析
java·大数据·spring boot·spring cloud·微服务·ai·面试
为什么不问问神奇的海螺呢丶11 小时前
Oracle Golden Gate 19c 微服务版 (19.1.0.0.4) 静默安装
数据库·微服务·oracle
无忧智库12 小时前
企业数字化的“底层逻辑”:深度解构4A架构中的数据基石(PPT)
分布式·微服务·架构
钝挫力PROGRAMER12 小时前
关于软件架构的一些疑惑
微服务·云原生·架构
Rick199313 小时前
Spring Cloud 原理是什么?
后端·spring·spring cloud
色空大师14 小时前
【微服务项目-短信平台】
java·redis·微服务·rabbitmq·springcloud·短信
jinggongszh14 小时前
数字化转型先上系统还是先理流程?
大数据·人工智能·微服务·制造
暗暗别做白日梦14 小时前
Maven与Spring Cloud SpringBoot核心配置文件解析
spring cloud·maven
Devin~Y16 小时前
大厂内容社区面试实录:从 Spring Boot 微服务到 AI RAG 问答(附详细解析)
java·spring boot·redis·elasticsearch·spring cloud·微服务·kafka