服务拆分
服务拆分注意事项
微服务拆分注意事项
远程调用
对于远程调用,之前我们说过,微服务之所以不能像单个服务那样互相的调用各自服务的信息,是因为他们各自的服务都部署在各自的服务器上,而与部署在单个服务上不同,跨服务器之间的互相传递信息需要的是请求,而不是调用,所以如果我们想要实现远程调用,首先,我们要将服务向外暴露一个可供访问的请求端口,类似于下面的这种: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>
然后,我们需要将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请求调用,其本质还是一样的,发送请求,获取数据。
提供者与消费者
假设,服务A调用了服务B,服务B调用服务C,那么服务B是什么角色。
角色是相对与业务来说的,所以服务具体扮演什么角色,要取决于当时所处的业务环境,【一个服务既可以是提供者,又可以是消费者】。