目录
15.1.1 订单微服务功能设计
15.1.1.1 订单微服务功能逻辑架构
- Tips:微服务功能设计看需求、看业务设定、看个人喜好
15.1.1.2 结构图
15.1.1.3 sca-commerce-service-config 添加 OpenFegin 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
15.1.1.4 创建订单微服务
- sca-commerce-order-service
Maven 依赖
<?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>sca-commerce-service</artifactId>
<groupId>com.edcode.commerce</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-commerce-order-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 模块名及描述信息 -->
<name>sca-commerce-order-service</name>
<description>订单服务</description>
<dependencies>
<!-- spring cloud alibaba nacos discovery 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- zipkin = spring-cloud-starter-sleuth + spring-cloud-sleuth-zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.5.0.RELEASE</version>
</dependency>
<!-- Java Persistence API, ORM 规范 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
<scope>runtime</scope>
</dependency>
<!-- SpringCloud Stream + Kafka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
<dependency>
<groupId>com.edcode.commerce</groupId>
<artifactId>sca-commerce-service-config</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.edcode.commerce</groupId>
<artifactId>sca-commerce-service-sdk</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 集成 hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
-->
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
bootstrap.yml
server:
port: 8002
servlet:
context-path: /scacommerce-order-service
spring:
main:
allow-bean-definition-overriding: true # 允许同名的 bean 出现
application:
name: sca-commerce-order-service
cloud:
stream:
kafka:
binder:
brokers: ${
KAFKA_SERVER:127.0.0.1}:${
KAFKA_PORT:9092}
auto-create-topics: true
bindings:
logisticsOutput:
destination: e-commerce-topic # kafka topic
content-type: text/plain
# alibaba:
# seata:
# tx-service-group: sca-ecommerce # seata 全局事务分组
nacos:
# 服务注册发现
discovery:
enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
#server-addr: ${NACOS_ADDR:127.0.0.1}:8848
server-addr: ${
NACOS_ADDR_1:127.0.0.1}:8848,${
NACOS_ADDR_2:127.0.0.1}:8858,${
NACOS_ADDR_3:127.0.0.1}:8868 # Nacos 服务器地址
namespace: ${
NAMESPACE_ID:1adcfdd8-5763-4768-9a15-9c7157988950}
metadata:
management:
context-path: ${
server.servlet.context-path}/actuator
# 基于 openfeign 实现: 开启 ribbon 重试机制, 即获取服务失败是否从另外一个节点重试
loadbalancer:
retry:
enabled: true
kafka:
bootstrap-servers: ${
KAFKA_SERVER:127.0.0.1}:${
KAFKA_PORT:9092}
producer:
retries: 3
consumer:
auto-offset-reset: latest
sleuth:
sampler:
probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1
zipkin:
sender:
type: ${
ZIPKIN_KAFKA_SENDER:web} # 默认是 web
base-url: http://${
ZIPKIN_URL:127.0.0.1}:${
ZIPKIN_PORT:9411}/
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate.show_sql: true
hibernate.format_sql: true
open-in-view: false
datasource:
# 数据源
url: jdbc:mysql://${
MYSQL_HOST:127.0.0.1}:${
MYSQL_PORT:3306}/${
MYSQL_DATABASE:sca_commerce}?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false
username: ${
MYSQL_USERNAME:root}
password: ${
MYSQL_PASSWORD:123456}
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池
hikari:
maximum-pool-size: 8
minimum-idle: 4
idle-timeout: 30000
connection-timeout: 30000
max-lifetime: 45000
auto-commit: true
pool-name: ImoocEcommerceHikariCP
redis:
database: 0
host: ${
REDIS_HOST:localhost}
port: ${
REDIS_PORT:6379}
timeout: 5000
# feign 相关的配置
feign:
hystrix:
enabled: true # Hystrix 默认是关闭的
client:
config:
default: # 全局的
connectTimeout: 2000 # 默认的连接超时时间是 10s
readTimeout: 5000
# 暴露端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
OrderApplication
@EnableJpaAuditing // ORM 框架之后可以审核、创建/修改时间更新
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker // OpenFegin 开启 hystrix
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
15.2.1 数据表及ORM过程
15.2.1.1 创建 t_scacommerce_order 数据表
CREATE TABLE IF NOT EXISTS `sca_commerce`.`t_scacommerce_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户 id',
`address_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户地址记录 id',
`order_detail` text NOT NULL COMMENT '订单详情(json 存储, goodsId, count)',
`create_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='用户订单表';
15.2.1.2 订单表对应实体类
package com.edcode.commerce.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedV