作为一个架构师,首先项目框架必须是要会搭建的。今天就来介绍线上的框架搭建,注意不是学习。
用到的技术
- maven构建
- 整合springboot+mybatis+redis+kafka
- 整合springcloud+nacos
搭建步骤
uc-parent工程
新建一个 uc-parent(uc可以是自己公司的简称) maven 聚合父工程,用来统一jar包版本管理。里面就一个pom文件:
pom.xml
注意修改下repository标签,改成自己的仓库地址
失效了的话可以联系我,工程结构图:
order 聚合工程
order就是业务名称,表示创建订单的微服务。然后在order工程上创建两个模块,分别是order-api (我们提供出去的api接口和pojo实体)和 order-service(api接口实现)。
整个工程结构图如下:
然后修改order聚合父工程的pom文件:
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<artifactId>uc-parent</artifactId>
<groupId>com.uc</groupId>
<version>0.0.6</version>
</parent>
<modules>
<module>order-api</module>
<!-- <module>order-service</module> -->
</modules>
</project>
order-api工程
order-api的pom文件:
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.uc</groupId>
<artifactId>order</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>order-api</artifactId>
<dependencies>
<!-- ribbon 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
</project>
假如我们数据库有一个t_order主表:
CREATE TABLE `t_order` (
`id` int(11) NOT NULL,
`order_price` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
于是我们构建pojo和api:
OrderBo内容:
package com.uc.order.api.pojo;
import java.io.Serializable;
import javax.persistence.Table;
@Table(name = "t_order")
public class OrderBo implements Serializable {
private static final long serialVersionUID = -8850743508383910882L;
private Integer id;
private Double orderPrice;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Double getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(Double orderPrice) {
this.orderPrice = orderPrice;
}
}
IOrderService 内容, 提供出去一个feign接口:
package com.uc.order.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import feign.Param;
@FeignClient(name = "order", decode404 = true)
public interface IOrderService {
@GetMapping("/order/query")
public void query(@Param("orderId") int orderId);
}
order-service工程
先看下结构图:
- conf包为mybatis和redis的配置。
- tools包的App为spring容器获取的工具,RedisHandler为redis工具。
- mq包为kafka的生产者和消费者。
- mapper包为myabtis的mapper
order-service工程源码:
然后就是我们的nacos配置,新建nacos配置yml文件,uc-order.yml:
内如如下:
默认使用配置
server:
port: 9000
tomcat:
max-threads: 200
min-spare-threads: 10
accept-count: 100
spring:
application:
name: order
datasource:
url: jdbc:mysql://xxx:63880/uc-firegroup?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: Dev
password: uc66666
driver-class-name: com.mysql.jdbc.Driver
#解决restful 404错误 spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
mvc:
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
redis:
cluster:
nodes: xxx.xxx.xxx.xxx:6379
#nodes: 172.19.93.107:30178
#nodes: 172.19.89.113:6391,172.19.89.113:6392,172.19.89.113:6393,172.19.89.113:6394,172.19.89.113:6395,172.19.89.113:6396
command-timeout: 15000
max-attempts: 5
max-redirects: 3
max-active: 16
max-wait: -1
max-idle: 8
min-idle: 0
test-on-borrow: true
kafka:
bootstrap-servers: bl-kafka-001:9092
producer:
# 发生错误后,消息重发的次数。
retries: 0
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 设置生产者内存缓冲区的大小。
buffer-memory: 33554432
# 键的序列化方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# 值的序列化方式
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
acks: 1
consumer:
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
auto-commit-interval: 1S
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
auto-offset-reset: latest
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
enable-auto-commit: false
# 键的反序列化方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 值的反序列化方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
# 在侦听器容器中运行的线程数。
concurrency: 5
#listner负责ack,每调用一次,就立即commit
ack-mode: manual_immediate
missing-topics-fatal: false
ribbon:
ReadTimeout: 5000
SocketTimeout: 5000
#请求连接的超时时间 add by six-vision
ConnectTimeout: 5000
#default为全局配置,如果要单独配置每个服务,改为服务名
feign:
client:
config:
default:
connectTimeout: 200000 #默认为10s
readTimeout: 60000 #默认为60s
sentinel:
enabled: true
注意修改上面 mysql,redis,kafka 地址为正确地址。
项目启动
启动order-service的MainApplication类:
启动前请加上nacos的环境变量NACOS_CONFIG_ADDR= http://xx.xx.xx.xx:8848
启动成功。