1. 前言
接口主要给后台管理系统和商城前端页面提供数据。
项目使用SpringCloud
搭建,其中,
有整合:MyBatis-Plus、Redis、MongoDB、Flyway、Kafka、Swagger
有组件:Eureka、Hystrix、Turbine、Gateway、Sleuth
现在就先把这些技术整合在一起,并且让它们运行起来。
2. 源码
完整项目地址:https://github.com/intomylife/osc-api
v1.0 标签地址:https://github.com/intomylife/osc-api/releases/tag/v1.0
注:对于标签的说明「初学者商城」- 写在最前面 #5.1
3. 环境
- JDK 1.8.0 +
- Maven 3.0 +
- SpringBoot 2.0.3
- SpringCloud Finchley.RELEASE
- Redis 4.0.14
- MySQL 5.7
- MongoDB 4.0.12
- Kafka 2.2.0
- Zookeeper 3.4.14
4. 工具
- IntelliJ IDEA
- Navicat Premium
5. 目录结构
5.1 整体
整个接口源码下载下来后,有两个目录:osc-commons
和osc-service
osc-api-1.0/
├── osc-commons
├── osc-service
└── README.md
- osc-commons:公用工程
- osc-service:服务工程
5.2 公用工程
放一些公用的配置,常量以及工具类等文件
osc-commons/
├── mvnw
├── mvnw.cmd
├── osc-commons.iml
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── zwc
│ └── core
│ ├── config
│ │ ├── MyBatisPlusConfig.java
│ │ ├── RedisConfig.java
│ │ └── SwaggerConfig.java
│ ├── constants
│ │ ├── KafkaConstants.java
│ │ ├── MongoDBConstants.java
│ │ └── RedisConstants.java
│ └── utils
│ ├── MongoDBClient.java
│ └── RedisClient.java
└── resources
└── config
└── system.properties
- core - config 目录:初始化配置类
- constants 目录:各种常量类
- utils 目录:工具类
- resources - config:配置文件
5.3 服务工程
是一个父工程,里面有很多子工程
osc-service/
├── osc-base-service
│ ├── osc-base-service-api
│ └── osc-base-service-core
├── osc-gateway-service
│ └── src
├── osc-log-service
│ ├── osc-log-service-api
│ └── osc-log-service-core
├── osc-registry-service
│ └── src
├── osc-sleuth-service
│ └── src
└── osc-turbine-service
└── src
- osc-base-service:基础工程
- osc-gateway-service:网关
- osc-log-service:日志工程
- osc-registry-service:注册中心
- osc-sleuth-service:链路跟踪监控中心
- osc-turbine-service:断路器聚合监控中心
- 有业务逻辑的工程会细分为:
api
和core
,api
中主要存放扩展实体类和常量类,core
中主要存放处理逻辑的核心代码
5.3.1 注册中心
osc-registry-service
工程作为整个项目的注册中心部分,其他项目都要把自己注册进来。
注册中心端口一般为8761
。
加入spring-cloud-starter-netflix-eureka-server
依赖后,添加@EnableEurekaServer
注解就好,没有太多配置就完成构建了。
5.3.2 网关
osc-gateway-service
工程作为整个项目的网关入口,通过路由来匹配并调用不同的服务,还可以对请求进行限流及过滤操作。
网关端口我习惯设置为8000
。
首先加入spring-cloud-starter-gateway
依赖表示自己是网关,然后再加入spring-cloud-starter-netflix-eureka-client
依赖 + @EnableEurekaClient
注解把自己注册到注册中心;由于网关中的限流操作是结合 Redis 来完成的,所以要加入spring-boot-starter-data-redis-reactive
依赖;网关这里还做了熔断操作,当要调用的服务还未启动完成或者宕机时,会进行熔断防止用户看到系统异常,所以也要加入spring-cloud-starter-netflix-hystrix
依赖;最后,每次请求到网关后又被网关转发到哪些服务需要通过 Zipkin 记录下来,所以加入了spring-cloud-starter-zipkin
依赖。
想具体了解Gateway 组件
相关请前往:SpringCloud之服务网关Gateway
5.3.3 业务工程
osc-base-service
工程和osc-log-service
工程都是专门处理业务逻辑的工程。
首先,这两个工程都加入了只有处理业务的工程才需要的osc-commons
依赖;然后再加入spring-cloud-starter-netflix-eureka-client
依赖 + @EnableEurekaClient
注解把自己注册到注册中心;还加入了服务之间调用需要的spring-cloud-starter-openfeign
依赖;处理业务的工程当然也需要熔断,所以加入spring-cloud-starter-netflix-hystrix
依赖;最后,服务之间的调用链路同样要被 Zipkin 记录下来,所以也加入了spring-cloud-starter-zipkin
依赖。
在搭建基础架构中,一共就两个接口:
/aUseB
:主要测试服务间是否能互相调用/visit/toVisit
:主要测试 Redis、MySQL、Kafka、MongoDB、Turbine,Sleuth 是否都能正常工作
想具体了解服务调用
相关请前往:SpringCloud之服务注册与发现Eureka+客户端Feign
想具体了解整合 Redis
相关请前往:SpringBoot整合Redis
想具体了解整合 MySQL
相关请前往:SpringBoot整合MyBatis-Plus
想具体了解整合 Kafka
相关请前往:SpringBoot整合Kafka
想具体了解整合 MongoDB
相关请前往:SpringBoot整合MongoDB
还有两个重要的成员:
Flyway
:数据库版本管理工具Swagger
:Api 文档管理工具
想具体了解整合 Flyway
相关请前往:SpringBoot整合Flyway
想具体了解整合 Swagger
相关请前往:SpringBoot整合Swagger
5.3.4 断路器聚合监控中心
osc-turbine-service
工程会把指定工程的熔断监控全部收集在一起显示。
首先加入spring-cloud-netflix-turbine
依赖 + @EnableTurbine
注解表示自己是断路器聚合监控中心,然后再加入spring-cloud-starter-netflix-eureka-client
依赖 + @EnableEurekaClient
注解把自己注册到注册中心;哪些工程会被聚合在一起显示,在配置文件application.yml
中turbine.app-config
处指定。
想具体了解Turbine 组件
相关请前往:SpringCloud之监控数据聚合Turbine
5.3.5 链路跟踪监控中心
osc-sleuth-service
工程与注册中心类似,都是有需要就得把自己注册进来。
链路跟踪监控中心端口一般为9411
。
加入zipkin-server
依赖 + @EnableZipkinServer
注解表示自己是链路跟踪监控中心,然后再加入spring-cloud-starter-netflix-eureka-client
依赖 + @EnableEurekaClient注解把自己注册到注册中心;只有加入了spring-cloud-starter-zipkin
依赖的工程才会被监控到,如上面的网关和业务工程。
想具体了解Sleuth 组件
相关请前往:SpringCloud之链路跟踪Sleuth
6. 启动
注:最好不要下载最新的代码,为了保证效果一致,请下载v1.0
标签的代码
6.1 环境准备
注:搭建本地开发环境的博客后续会补上,这里先默认环境已经与上面#3
一致。(搭建本地开发环境的博客链接写在了文末处)
由于这个版本是基础架构(多环境是放到后续博客专门来写的),导致这个版本的Redis
和MongoDB
都配置了密码连接,主要是为了与这个版本对应的部署
一致
所以这里启动的话得稍微改动一下:
Redis:
- 如果你本地的 Redis 本来就是有密码启动的,那就到
redis.conf
配置文件中更改密码requirepass 123456789
,然后让 Redis 通过redis.conf
配置文件重新启动 - 如果你本地的 Redis 本来就是没有密码启动的,那就在代码中全局搜
password: 123456789
,更改为password:
MongoDB:
- 如果你本地的 MongoDB 开启了验证,那就到
mongodb.cfg
配置文件中更改authorization: disabled
,然后重新启动 MongoDB - 代码中不用改,因为 MongoDB 校验没有那么严格,只要 MongoDB 服务端不需要密码,那么连接时带不带密码都可以
6.2 启动项目
注:在Maven Projects
中添加osc-commons - pom.xml
和osc-service - pom.xml
6.2.1 OscRegistryServiceApplication
项目启动成功后访问http://localhost:8761/
即可看到注册中心主页面
6.2.2 OscGatewayServiceApplication
项目启动成功后刷新http://localhost:8761/
即可看到 GATEWAY-SERVICE 服务注册成功
6.2.3 OscBaseServiceCoreApplication && OscLogServiceCoreApplication
项目都启动成功后刷新http://localhost:8761/
即可看到 BASE-SERVICE 和 LOG-SERVICE 服务都注册成功
6.2.4 OscTurbineServiceApplication
项目启动成功后访问http://localhost:8762/hystrix
即可看到断路器聚合监控中心主页面,在最长的输入框中输入http://localhost:8762/turbine.stream
后,点击 Monitor Stream 按钮可以看到两个'Loading …’
,因为此时还未调用服务
刷新http://localhost:8761/
即可看到 TURBINE-SERVICE 服务注册成功
6.2.5 OscSleuthServiceApplication
项目启动成功后访问http://localhost:9411
即可看到链路跟踪监控中心主页面
刷新http://localhost:8761/
即可看到 SLEUTH-ZIPKIN-SERVICE 服务注册成功
7. 验证
7.1 业务接口
7.1.1 /aUseB
访问http://localhost:8000/baseService/aUseB
,正常的话会返回Hello!I'm b. port:8081
;如果返回的是I'm Spring Cloud Gateway fallback.
那么再刷新一次,这里是因为Hystrix
超时问题,后续博客中会优化
这里面做了哪些事情:
- 首先
8000
是访问的网关服务 - 再看网关工程的配置文件(osc-gateway-service - application.yml)中的
routes
部分,会拦截/baseService/**
开头的请求,并且StripPrefix=1
截取一位,最后请求被转发到base-service
服务 - 通过网关路由处理后的路径就变为了
http://localhost:8000/aUseB
,这时访问的地址就被转发到了基础工程的前端控制器(osc-base-service - osc-base-service-core - AUseBFeignController.java)中的aUseB()
方法 aUseB()
方法通过Feign
调用了日志工程的前端控制器(osc-log-service - osc-log-service-core - BSayHelloApi.java)中的b()
方法- 所以最后返回的内容是
Hello!I'm b. port:8081
7.1.2 /visit/toVisit
访问http://localhost:8000/baseService/visit/toVisit
,正常的话会返回success
这里面做了哪些事情:
- 经过上面同样的路由,请求被转发到
http://localhost:8000/visit/toVisit
,这时调用的是基础工程的前端控制器(osc-base-service - osc-base-service-core - VisitController.java)中的toVisit()
方法 - 此方法会分别插入一条数据到
MySQL
和Redis
中 - 并且还会发送一条消息
- 发送的消息会被日志工程的
Kafka 监听
到(osc-log-service - osc-log-service-core - KafkaConsumer.java) - 最后在
OscLogServiceCoreApplication
的控制台会打印类似于KafkaConsumer ---> receiveTopicMessage:{"createDatetime":1577771121680,"sessionId":"6E45447B2F2A0F62CBEF9EFBF6DF121D","updateDatetime":1577771121680}
这样的信息
7.1.3 限流
快速刷新(多次访问)http://localhost:8000/baseService/aUseB
,浏览器会显示HTTP ERROR 429
等信息
7.2 监控
7.2.1 turbine
回到http://localhost:8762/hystrix/monitor?stream=http://localhost:8762/turbine.stream
,发现两个’Loading …’
消失,显示的是每个接口的调用情况
7.2.2 sleuth
访问http://localhost:9411/zipkin
后,点击 Find Traces 蓝色按钮,会显示每个请求的请求时长等信息,点击其中一条,可以看到更详细的请求信息
访问http://localhost:9411/zipkin/dependency/
,可以看到请求依赖关系图
7.3 文档
7.3.1 Swagger
注:后续会把Swagger
聚合在一起显示
-
基础工程:
http://localhost:8080/swagger-ui.html
-
日志工程:
http://localhost:8081/swagger-ui.html
7.4 数据库
7.4.1 Flyway
使用Navicat
等图形化工具连接本地MySQL
,发现多了一个osc_db
库,目前里面只有两张表:
flyway_schema_history
是 Flyway 自动生成的,用来记录版本信息的表visit
是基础工程的配置文件(osc-base-service - osc-base-service-core - resources - db.zwc)中的.sql
脚本执行结果所产生的表,表里还有刚刚访问时插入的数据
8. 结语
整个项目能运行起来也算是成功的迈出了第一步。阿,快乐。
9. 相关文章
9.1 准备工作
9.2 搭建基础架构
9.3 搭建本地开发环境
希望能够帮助到你
over