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


    服务拆分

    服务拆分注意事项

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

    微服务拆分注意事项

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

    远程调用

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

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

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

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

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

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

        org.springframework.boot

        spring-boot-starter-web

    然后,我们需要将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是什么角色。

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

  • 相关阅读:
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    idea打开项目时不小心点了attach,如何恢复?
    【牛客刷题】前端--JS篇(一)
    TS基础篇
    计算机毕业设计Java租车系统(源码+系统+mysql数据库+lw文档)
    leetcode-414-第三大的数
    树莓派系统镜像备份
    如何使用django 结合websocket 进行实时目标检测呢?以yolov5 为例
    中文核心期刊有哪些?
    云贝教育 |【DSI】Oracle数据库系列课-葵花宝典技术内幕实战课程
  • 原文地址:https://blog.csdn.net/hssjsh/article/details/132888719