当前位置: 首页 > article >正文

SpringCloud篇(服务拆分 / 远程调用 - 入门案例)

目录

一、服务拆分原则

二、服务拆分示例

1. 案例需求

2. 案例要求

3. 导入SQL语句

4. 实现思路

4.1. 创建父工程 cloud-demo 管理依赖

依赖导入思路

4.2. 创建子工程 order-servic

4.3. 创建子工程 user-servic

4.4. 创建 cloud_order 数据库和表并插入数据

4.5. 创建 cloud_user 数据库和表并插入数据

4.6. 子工程 order-service 的构建目录

4.7. 子工程 user-service 的构建目录

4.8. 调出并将启动类显示在Services中

4.9. 配置下项目使用的JDK

三、服务远程调用案例

1. 订单服务

2. 用户服务

3. 案例需求

4. 注册RestTemplate

5. 实现远程调用

6. 重启服务测试


任何分布式架构都离不开服务的拆分,微服务也是一样

一、服务拆分原则

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

二、服务拆分示例

1. 案例需求

以资料中的微服务 cloud-demo 为例,其结构如下:

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务

2. 案例要求

订单微服务和用户微服务都必须有各自的数据库,相互独立

订单服务和用户服务都对外暴露 Restful 的接口

订单服务如果需要查询用户信息,只能调用用户服务的 Restful 接口,不能查询用户数据库

3. 导入SQL语句

资料中的 cloud-order、cloud-user

4. 实现思路

4.1. 创建父工程 cloud-demo 管理依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloud</groupId>
    <artifactId>d1_cloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
        <mysql.version>5.1.47</mysql.version>
        <mybatis.version>2.1.1</mybatis.version>
    </properties>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencyManagement>
        <dependencies>
            <!-- springCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>
依赖导入思路

1. 创建父工程模块打包方式为 pom 的原因:

用在父级工程或聚合工程中,用来做 jar 包的版本控制,必须指明这个聚合工程的打包方式为 pom

父类打成 pom 包的意义在于:父工程不写代码,代码都在子工程里写,只在父类工程里写 pom.xml 里写 jar 的

版本,控制子工程所需依赖的版本

2. 自定义属性在 properties 节点下进行声明依赖版本号,管理版本号。

3. SpringCloud 底层是依赖于 SpringBoot 的,并且有版本的兼容关系,由于本人使用的是 Hoxton.SR10

从而本人选择的是稳定 SpringBoot 发布版本 2.3.9.RELEASE

4.2. 创建子工程 order-servic

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>d1_cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.3. 创建子工程 user-servic

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>d1_cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.4. 创建 cloud_order 数据库和表并插入数据

4.5. 创建 cloud_user 数据库和表并插入数据

4.6. 子工程 order-service 的构建目录

4.7. 子工程 user-service 的构建目录

4.8. 调出并将启动类显示在Services中

4.9. 配置下项目使用的JDK

三、服务远程调用案例

1. 订单服务

在order-service服务中,有一个根据 id 查询订单的接口:

根据id查询订单,返回值是Order对象,其中的user为null

访问地址:http://localhost:8080/order/101

结果:

2. 用户服务

在user-service中有一个根据id查询用户的接口:

访问地址:http://localhost:8081/user/1

结果:

3. 案例需求

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信

息,一起返回!

因此,我们需要在order-service中 向user-service发起一个http的请求,

调用http://localhost:8081/user/{userId}这个接口

步骤一:注册一个RestTemplate的实例到Spring容器

步骤二:修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查

询User

步骤三:将查询的User填充到Order对象,一起返回

4. 注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:

package com.cloud.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("com.cloud.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

5. 实现远程调用

修改order-service服务中的com.cloud.order.service包下的OrderService类中的queryOrderById方法:

6. 重启服务测试

重启服务测试,发现user不再为null,达到远程调用效果!


http://www.kler.cn/a/397069.html

相关文章:

  • transformers 操作篇
  • 每天五分钟机器学习:支持向量机算法数学基础之核函数
  • oneplus3t-Lineage16.1-Android.bp
  • RabbitMQ实战启程:从原理到部署的全方位探索(上)
  • ADC输出码和输入电压转换关系
  • opencv kdtree pcl kdtree 效率对比
  • 鸿蒙自定义UI组件导出使用
  • EXCEL 或 WPS 列下划线转驼峰
  • Dubbo RPC线程模型
  • ADS项目笔记 1. 低噪声放大器LNA天线一体化设计
  • 基于Python爬虫大屏可视化的热门旅游景点数据分析系统
  • 高斯混合模型回归(Gaussian Mixture Model Regression,GMM回归)
  • c语言学习19参数传递
  • WebChromeClient 方法分类及其功能
  • Python习题 250:删除空文件夹
  • dpdk tm eth event驱动协同完成收发包流程
  • [C++] 智能指针
  • Java爬虫(Jsoup)详解
  • [产品管理-82]:《产品经理从入门到精通》产品经理的基本思维与核心思想
  • 探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力
  • react 中 useMemo Hook 作用
  • 记录no.28
  • 代码随想录第46期 单调栈
  • 用户自定义IP核——ZYNQ学习笔记6
  • [JAVAEE] 网络编程
  • Pytest从入门到精通