您现在的位置是:首页 > 编程 > 

第一篇:如何拆分微服务

2025-07-20 06:08:51
第一篇:如何拆分微服务 SpringCloud教学文章第一篇:如何拆分微服务简介:本文讲解如何如何利用SpringCloud进行微服务的拆分。样例结构 cloud-demo:父工程,管理依赖order-service:订单微服务,负责订单相关业务user-service:用户微服务,负责用户相关业务要求:订单微服务和用户微服务都必须有各自的数据库,相互独立订单服务和用户服务都对外暴露Restfu

第一篇:如何拆分微服务

SpringCloud教学文章

第一篇:如何拆分微服务

简介:本文讲解如何如何利用SpringCloud进行微服务的拆分。

样例结构

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

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

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
数据库数据
  • cloud-order.sql
代码语言:javascript代码运行次数:0运行复制
-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` bigint(20) OT ULL AUTO_ICREMET COMMET '订单id',
  `user_id` bigint(20) OT ULL COMMET '用户id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci ULL DEFAULT ULL COMMET '商品名称',
  `price` bigint(20) OT ULL COMMET '商品价格',
  `num` int(10) ULL DEFAULT 0 COMMET '商品数量',
  PRIMARY KEY (`id`) USIG BTREE,
  UIQUE IDEX `username`(`name`) USIG BTREE
) EGIE = InnoDB AUTO_ICREMET = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
ISERT ITO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12 ', 699900, 1);
ISERT ITO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 209900, 1);
ISERT ITO `tb_order` VALUES (10, , '骆驼(CAMEL)休闲运动鞋女', 4900, 1);
ISERT ITO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 59900, 1);
ISERT ITO `tb_order` VALUES (105, 5, 'OPPO Reno Pro 双模5G 视频双防抖', 299900, 1);
ISERT ITO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II ', 544900, 1);
ISERT ITO `tb_order` VALUES (107, 2, '西昊/SIHOO 工学电脑椅子', 79900, 1);
ISERT ITO `tb_order` VALUES (108, , '梵班(FAMDBA)休闲男鞋', 1900, 1);
  • cloud-user.sql
代码语言:javascript代码运行次数:0运行复制
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) OT ULL AUTO_ICREMET,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci ULL DEFAULT ULL COMMET '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci ULL DEFAULT ULL COMMET '地址',
  PRIMARY KEY (`id`) USIG BTREE,
  UIQUE IDEX `username`(`username`) USIG BTREE
) EGIE = InnoDB AUTO_ICREMET = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
ISERT ITO `tb_user` VALUES (1, '柳岩', '湖南省衡阳市');
ISERT ITO `tb_user` VALUES (2, '文二狗', '陕西省西安市');
ISERT ITO `tb_user` VALUES (, '华沉鱼', '湖北省十堰市');
ISERT ITO `tb_user` VALUES (4, '张必沉', '天津市');
ISERT ITO `tb_user` VALUES (5, '郑爽爽', '辽宁省沈阳市大东区');
ISERT ITO `tb_user` VALUES (6, '范兵兵', '山东省青岛市');
后端配置
项目结构
父工程
  • 文件结构
  • pom.xml

这个父工程的pom.xml算是祖传的

代码语言:javascript代码运行次数:0运行复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"
         xmlns:xsi=";
         xsi:schemaLocation=".0.0 .0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast.demo</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0</version>
    <modules>
        <module>user-service</module>
        <module>order-service</module>
    </modules>

    <packaging>pom</packaging>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.>UTF-8</project.>
        <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>

    <dependencyManagement>
        <dependencies>
            <!-- springCloud -->
            <dependency>
                <groupId>org.</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>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>
子工程
order-service
  • pom.xml 对于子工程要通过,<parent>来引入父工程的pom.xml
代码语言:javascript代码运行次数:0运行复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"
         xmlns:xsi=";
         xsi:schemaLocation=".0.0 .0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0</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>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>
  • application.yml
代码语言:javascript代码运行次数:0运行复制
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:06/cloud_order?useSSL=false
    username: root
    password: 12456
    driver-class-name: jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
  • OrderApplication
代码语言:javascript代码运行次数:0运行复制
@MapperScan("cn.")
@SpringBootApplication
public class OrderApplication {

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

}
  • OrderMapper
代码语言:javascript代码运行次数:0运行复制
public interface OrderMapper {

    @Select("select * from tb_order where id = #{id}")
    Order findById(Long id);
}
  • Order
代码语言:javascript代码运行次数:0运行复制
@Data
public class Order {
    private Long id;
    private Long price;
    private String name;
    private Integer num;
    private Long userId;
    private User user;
}
  • User
代码语言:javascript代码运行次数:0运行复制
@Data
public class User {
    private Long id;
    private String username;
    private String address;
}
  • OrderService
代码语言:javascript代码运行次数:0运行复制
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 4.返回
        return order;
    }
}
  • OrderController
代码语言:javascript代码运行次数:0运行复制
@RestController
@RequestMapping("order/")
public class OrderController {

   @Autowired
   private OrderService orderService;

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        return orderService.queryOrderById(orderId);
    }
}
user-service
  • 文件结构
  • pom.xml
代码语言:javascript代码运行次数:0运行复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"
         xmlns:xsi=";
         xsi:schemaLocation=".0.0 .0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0</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>spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalame>app</finalame>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • application.yml
代码语言:javascript代码运行次数:0运行复制
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:06/cloud_user?useSSL=false
    username: root
    password: 12456
    driver-class-name: jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
  • UserApplication
代码语言:javascript代码运行次数:0运行复制
@MapperScan("cn.itcast.")
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(, args);
    }
}
  • UserMapper
代码语言:javascript代码运行次数:0运行复制
public interface UserMapper {
    
    @Select("select * from tb_user where id = #{id}")
    User findById(@Param("id") Long id);
}
  • User
代码语言:javascript代码运行次数:0运行复制
@Data
public class User {
    private Long id;
    private String username;
    private String address;
}
  • UserService
代码语言:javascript代码运行次数:0运行复制
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id) {
        return userMapper.findById(id);
    }
}
  • UserController
代码语言:javascript代码运行次数:0运行复制
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}
项目运行演示

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

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

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

查询的结果如图:

案例需求
简介

修改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对象,一起返回
注册RestTemplate

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

代码语言:javascript代码运行次数:0运行复制
import spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.annotation.Bean;
import org.springframework.RestTemplate;

@MapperScan("cn.")
@SpringBootApplication
public class OrderApplication {

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

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
实现远程调用

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

代码语言:javascript代码运行次数:0运行复制
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.远程查询user
        // 2.1 url地址
        String url = "http://localhost:8081/user/" + order.getUserId();
        // 2.2发起调用
        User user = restTemplate.getForObject(url, );
        // . 存入order
        order.setUser(user);
        // 4.返回
        return order;
    }
}
运行效果
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除微服务version服务接口数据库

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1144272.html

相关标签:无
上传时间: 2025-07-19 10:27:15
留言与评论(共有 14 条评论)
本站网友 五里一徘徊
19分钟前 发表
1
本站网友 易保全
10分钟前 发表
level
本站网友 鄂破
21分钟前 发表
root password
本站网友 医药新闻
13分钟前 发表
因此
本站网友 郑州易贷网
28分钟前 发表
要求在查询订单的同时
本站网友 物联网天线
1分钟前 发表
1); ISERT ITO `tb_order` VALUES (102
本站网友 锁阳
18分钟前 发表
UIQUE IDEX `username`(`username`) USIG BTREE ) EGIE = InnoDB AUTO_ICREMET = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of tb_user -- ---------------------------- ISERT ITO `tb_user` VALUES (1
本站网友 lvyou
7分钟前 发表
jdbc.Driver mybatis
本站网友 养老金并轨
18分钟前 发表
如图: 其中的user为null 在user-service中有一个根据id查询用户的接口: 查询的结果如图: 案例需求简介修改order-service中的根据id查询订单业务
本站网友 郑州装修招标
5分钟前 发表
5
本站网友 深圳新东方学校
7分钟前 发表
//localhost
本站网友 如何在网上买彩票
5分钟前 发表
schemaLocation=".0.0 .0.0.xsd"> <parent> <artifactId>cloud-demo</artifactId> <groupId>cn.itcast.demo</groupId> <version>1.0</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>spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> </dependencies> <build> <finalame>app</finalame> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>application.yml代码语言:javascript代码运行次数:0运行复制server
本站网友 成人天地
22分钟前 发表
ss