-
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进行访问。
更多相关网站
- 10个SQL优化技巧,性能提升300%(sql优化从哪几方面入手)
- 面试官问你 MySQL 的线上执行 DDL 该怎么做?...
- MySQL 8.0 的隐藏索引:索引管理的利器,还是性能陷阱?
- MySQL实战:Json字段类型详解(mysql中json类型)
- Spring事务失效的12种解决方案!15年踩坑经验浓缩成这份避雷指南
- 面试官:select语句和update语句分别是怎么执行的?
- 详细了解 InnoDB 内存结构及其原理
- 深度剖析 Spring Boot3 中事务失效的场景与解决方案
- java 使用Jdbc连接mysql数据库以及其存在的问题
- 百万订单背后的架构生死局:SpringCloud Alibaba拯救我们的微服务
- 面试官:20 亿手机号存储选 int 还是 string?varchar 还是 char?
- 面试官:MySQL的自增ID用完了,怎么办?
- 别再用雪花算法生成ID了!试试这个吧
- # mysql 中文乱码问题分析(#mysql5.0中文乱码)
- MySQL分页到了后面越来越慢,有什么好的解决办法?
- Spring Boot3 中实现树表结构数据查询及返回全解析
- SQL外连接优化:经过验证的性能提升
- zPaaS低代码平台使用介绍:第一个功能开发
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 二调符号库 (23)
- acmecadconverter_8.52绿色版 (25)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- usb2.0-serial驱动下载 (24)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- virtualdrivemaster (26)
- 数据结构c语言版严蔚敏pdf (25)
- 兔兔工程量计算软件下载 (27)
- 代码整洁之道 pdf (26)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- 方格子excel破解版补丁 (25)