百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文
24岁架构师专讲:基于微服务架构的调用关系——贯穿案例

24岁架构师专讲:基于微服务架构的调用关系——贯穿案例

  • 网站名称:24岁架构师专讲:基于微服务架构的调用关系——贯穿案例
  • 网站分类:技术文章
  • 收录时间:2025-08-03 01:42
  • 网站地址:

进入网站

“24岁架构师专讲:基于微服务架构的调用关系——贯穿案例” 网站介绍

数据库

这里使用的数据库是MySQL 5.7,数据库包含3张表,分别是用户表、商品表和订单表。在分布式项目中,一般业务比较复杂,数据量也比较大,每个微服务都有自己的数据库,每个数据库中都有多张表。为了方便介绍,本书中的贯穿案例有3个微服务,3个微服务使用的都是同一个数据库,每个微服务分别对应一张表。数据库层使用的是Spring Data JPA框架。

用户表的代码如下所示。

CREATE TABLE 'tb_user'(

'id' INT (11) NOT NULL AUTO_INCREMENT,

'name' VARCHAR (40) DEFAULT NULL COMMENT '用户名',

'password' VARCHAR (40) DEFAULT NULL COMMENT '密码',

'age' INT (3) DEFAULT NULL COMMENT '年龄',

'balance' DECIMAL (10,2) DEFAULT NULL COMMENT '余额',

'address' VARCHAR (80) DEFAULT NULL COMMENT '地址',

PRIMARY KEY ('id')

) ENGINE = InnoDB DEFAULT CHARSET = utf8;

商品表的代码如下所示。

CREATE TABLE 'tb_product' (

'id' INT (11) NOT NULL AUTO_INCREMENT,

'product_name' VARCHAR (40) DEFAULT NULL COMMENT '名称',

'status' INT (2) DEFAULT NULL COMMENT '状态',

'price' DECIMAL (10,2) DEFAULT NULL COMMENT '单价',

'product_desc' VARCHAR (255) DEFAULT NULL COMMENT '描述',

'caption' VARCHAR (255) DEFAULT NULL COMMENT '标题',

'inventory' INT (11) DEFAULT NULL COMMENT '库存',

PRIMARY KEY ('id')

) ENGINE = InnoDB DEFAULT CHARSET = utf8;订单表的代码如下所示。

CREATE TABLE 'tb_order' (

'id' INT (11) NOT NULL AUTO_INCREMENT,

'user_id' INT (11) DEFAULT NULL COMMENT '用户id',

'product_id' INT (11) DEFAULT NULL COMMENT '商品id',

'number' INT (11) DEFAULT NULL COMMENT '数量',

'price' DECIMAL (10,2) DEFAULT NULL COMMENT '单价',

'amount' DECIMAL (10,2) DEFAULT NULL COMMENT '总额',

'product_name' VARCHAR (40) DEFAULT NULL COMMENT '商品名',

'user_name' VARCHAR (40) DEFAULT NULL COMMENT '用户名',

PRIMARY KEY ('id')

) ENGINE = InnoDB DEFAULT CHARSET = utf8;

创建工程

整个工程的结构如图3-1所示。先创建父工程shop_parent,然后创建子工程(用户微服务user_service、商品微服务goods_service和订单微服务order_service)。

创建父工程

使用IntelliJ IDEA创建父工程shop_parent,如图3-2所示。


创建父工程后,在其对应的pom.xml文件中导入Maven坐标,如下所示。

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.6.RELEASE</version>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEn

coding>

<project.reporting.outputEncoding>UTF-8</project.reporting.

outputEncoding>

<java.version>1.8</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-logging</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.4</version>

<scope>provided</scope>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>Greenwich.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency></dependencies>

</dependencyManagement>

<repositories>

<repository>

<id>spring-snapshots</id>

<name>Spring Snapshots</name>

<url>http://repo.spring.io/libs-snapshot-local</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

<repository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>http://repo.spring.io/libs-milestone-local</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

<repository>

<id>spring-releases</id>

<name>Spring Releases</name>

<url>http://repo.spring.io/libs-release-local</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>spring-snapshots</id>

<name>Spring Snapshots</name>

<url>http://repo.spring.io/libs-snapshot-local</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

</pluginRepository>

<pluginRepository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>http://repo.spring.io/libs-milestone-local</url>

<snapshots>

<enabled>false</enabled>

</snapshots></pluginRepository>

</pluginRepositories>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

创建子工程——用户微服务

创建子工程

使用IntelliJ IDEA创建子工程——用户微服务,如图3-3所示。

创建子工程后,在其对应的pom.xml文件中导入Maven坐标,如下所示。

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.32</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

创建用户实体类

创建用户微服务相对应的用户实体类,加入JPA注解和Lombok注解,如下所示。

package cn.book.user.entity;

import lombok.Data;

import javax.persistence.*;

import java.math.BigDecimal;

/**

* 用户实体类

*/

@Data

@Entity

@Table(name="tb_user")

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

private String name;

private String password;

private Integer age;

private BigDecimal balance;

private String address;

}

创建Dao层接口

创建用户微服务相对应的Dao层接口,继承JPA的接口,自动实现基本的新增、删除、修改、查询(以下简称增删改查)功能,如下所示。

package cn.book.user.dao;

import cn.book.user.entity.User;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.jpa.repository.JpaSpecificationExec

utor;

public interface UseDao extends JpaRepository<User,Long>, JpaSpecif

icationExecutor<User> {

}

创建Service层接口

创建用户微服务相对应的Service层接口,如下所示。

package cn.book.user.service;

import cn.book.user.entity.User;

import java.util.List;

public interface UserService {

//根据id查询单个

User findById(Long id);

//查询全部

List findAll();

//新增

void save(User user);

//修改void update(User user);

//删除

void delete(Long id);

}

创建用户微服务相对应的Service层接口实现,并注入Dao层对象,如下所示。

package cn.book.user.service.impl;

import cn.book.user.dao.UserDao;

import cn.book.user.entity.User;

import cn.book.user.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class UserServiceImpl implements UserService {

@Autowired

private UserDao userDao;

@Override

public User findById(Long id) {

return userDao.findById(id).get();

}

@Override

public List findAll() {

return userDao.findAll();

}

@Override

public void save(User user) {

userDao.save(user);

}

@Override

public void update(User user) {

userDao.save(user);

}@Override

public void delete(Long id) {

userDao.deleteById(id);

}

}

创建Web层控制器

创建用户微服务相对应的Web层控制器,并注入Service层对象,如下所示。

package cn.book.user.controller;

import cn.book.user.entity.User;

import cn.book.user.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController

@RequestMapping("/user")

public class UserController {

@Autowired

private UserService userService;

@RequestMapping(value = "/{id}", method = RequestMethod.GET)

public User findById(@PathVariable Long id) {

return userService.findById(id);

}

@RequestMapping(value = "/findAll", method = RequestMethod.GET)

public List findAll() {

return userService.findAll();

}

@RequestMapping(value = "/save", method = RequestMethod.POST)

public String save(@RequestBody User user) {

userService.save(user);return "保存成功";

}

@RequestMapping(value = "/{id}", method = RequestMethod.PUT)

public String update(@RequestBody User user, @PathVariable Long

id) {

user.setId(id);

userService.update(user);

return "修改成功";

}

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)

public String deleteById(@PathVariable Long id) {

userService.delete(id);

return "删除成功";

}

}

创建启动类

创建用户微服务相对应的启动类User Application,如下所示。

package cn.book.user;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication

@EntityScan("cn.book.user.entity")

public class UserApplication {

public static void main(String[] args) {

SpringApplication.run(UserApplication.class, args);

}

}

创建配置文件

创建用户微服务相对应的YML配置文件,如下所示。

server:

port: 9001 #端口

spring:

application:

name: user_service #服务名称

datasource: #数据源

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://192.168.10.167:3306/shop?characterEncoding=ut

f8

username: root

password: root

jpa:

database: MySQL

show-sql: true

open-in-view: true

至此,用户微服务创建成功,可以运行User Application进行访问。

创建子工程——商品微服务

创建子工程

使用IntelliJ IDEA创建子工程——商品微服务,如图3-4所示。

创建子工程后,在其对应的pom.xml文件中导入Maven坐标,如下所示。

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.32</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

创建商品实体类

创建商品微服务相对应的商品实体类,加入JPA注解和Lombok注解,如下所示。

package cn.book.product.entity;

import lombok.Data;

import javax.persistence.*;

import java.math.BigDecimal;

/**

* 商品实体类

*/

@Data

@Entity

@Table(name = "tb_product")

public class Product {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

private String product_name;

private Integer status;

private BigDecimal price;

private String product_desc;

private String caption;

private Integer inventory;

}

创建Dao层接口

创建商品微服务相对应的Dao层接口,继承JPA的接口,自动实现基本的增删改查功能,如下所示。

package cn.book.product.dao;

import cn.book.product.entity.Product;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.jpa.repository.JpaSpecificationExec

utor;

public interface ProductDao extends JpaRepository<Product, Long>, J

paSpecificationExecutor<

Product> {

}

创建Service层接口

创建商品微服务相对应的Service层接口,如下所示。

package cn.book.product.service;

import cn.book.product.entity.Product;

import java.util.List;

public interface ProductService {

//根据id查询单个

Product findById(Long id);

//查询全部

List findAll();

//新增

void save(Product product);//修改

void update(Product product);

//删除

void delete(Long id);

}

创建商品微服务相对应的Service层接口实现,并注入Dao层对象,如

下所示。

package cn.book.product.service.impl;

import cn.book.product.dao.ProductDao;

import cn.book.product.entity.Product;

import cn.book.product.service.ProductService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public class ProductServiceImpl implements ProductService {

@Autowired

private ProductDao productDao;

@Override

public Product findById(Long id) {

return productDao.findById(id).get();

}

@Override

public List findAll() {

return productDao.findAll();

}

@Override

public void save(Product product) {

productDao.save(product);

}

@Override

public void update(Product product) {productDao.save(product);

}

@Override

public void delete(Long id) {

productDao.deleteById(id);

}

}

创建Web层控制器

创建商品微服务相对应的Web层控制器,并注入Service层对象,如下所示。

package cn.book.product.controller;

import cn.book.product.entity.Product;

import cn.book.product.service.ProductService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController

@RequestMapping("/product")

public class ProductController {

@Autowired

private ProductService productService;

@RequestMapping(value = "/{id}", method = RequestMethod.GET)

public Product findById(@PathVariable Long id) {

return productService.findById(id);

}

@RequestMapping(value = "/findAll", method = RequestMethod.GET)

public List findAll() {

return productService.findAll();

}

@RequestMapping(value = "/save", method = RequestMethod.POST)public String save(@RequestBody Product product) {

productService.save(product);

return "保存成功";

}

@RequestMapping(value = "/{id}", method = RequestMethod.PUT)

public String update(@RequestBody Product product,@PathVariable

Long id) {

product.setId(id);

productService.update(product);

return "修改成功";

}

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)

public String deleteById(@PathVariable Long id) {

productService.delete(id);

return "删除成功";

}

}

创建启动类

创建商品微服务相对应的启动类Product Application,如下所示。

package cn.book.product;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication

;

import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication

@EntityScan("cn.book.product.entity")

public class ProductApplication {

public static void main(String[] args) {

SpringApplication.run(ProductApplication.class, args);

}

}

创建配置文件

创建商品微服务相对应的YML配置文件,如下所示。

server:

port: 9002 #端口

spring:

application:

name: product_service #服务名称

datasource: #数据源

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://192.168.10.167:3306/shop?characterEncoding=ut

f8

username: root

password: root

jpa:

database: MySQL

show-sql: true

open-in-view: true

至此,商品微服务创建成功,可以运行Product Application进行访问。