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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值