纯服务框架
纯服务框架
本框架的初始理念
本框架为启路springCloud服务模板工程,三大项目类型之一,只有接口,没有页面.
内网工程,没有安全.
本项目为微服务的模板工程,在没有平台的情况下,只是对springCloud进行了集成,配置常见的参数,支持多版本的兼容.
使用feign的过程中,对常见的坑进行简单处理.主要解决问题:
- 可运行的程序框架+示例
- 服务暴露
- 服务声明
- 服务调用
- 验证
- 异常处理
- 日志追踪号传递
- 多版本兼容
- 简单监控,(外挂prometheus+grafana)
- 配置文件载入
- 附带简单运维
- springboot2.3版本以后,支持优雅停机(请使用run.sh启停服务),2.2以前版本,请使用actuator/shutdown停机,脚本不支持
- 支持Hicari/Druid数据源
发布包
大小:49M
- 去掉swagger,减少4M
- 使用druid,增加2M
没有再次对springCloud做瘦身.
版本
使用springCloud搭建,支持springboot,springCloud版本如下:
| springboot | springCloud | 说明 |
|---|---|---|
| 1.5.12 | Edgware.SR6 | 已测试 |
| 2.0.9.RELEASE | Finchley.SR4 | EnableFeignClients变更包名 |
| 2.1.8.RELEASE | Greenwich.SR6 | 已测试 |
| 2.2.13.RELEASE | Hoxton.SR4 | 已测试 |
| 2.2.13.RELEASE | Hoxton.SR11 | 已测试 |
| 2.3.12.RELEASE | Hoxton.SR11 | 已测试 |
| 2.4.13 | 2020.0.4 | 已测试,springCloud已经移除spring-cloud-starter-netflix-hystrix,需要手动添加版本号 |
| 2.5.8 | 2020.0.4 | 已测试 |
部署
将run.sh和jar包放到一个目录
启动服务
使用./run.sh start 启动服务
./run.sh start c 清空日志并启动
使用外部日志文件
修改run.sh,在SPRING_OPT变量中,输入"--logging.config=./logback.xml "
使用外部配置文件
修改run.sh, 在SPRING_OPT变量,输入"--spring.config.location=./application.yml"
停止服务
使用./run.sh stop 停止服务
IDE调试
- 先启动eureka-server
- 再启动sample-service-boot
提示
测试数据
新增 http://localhost:18080/service/senvonInfoPost/add
name=senvon
查询 http://localhost:18080/service/senvonInfoPost/showList
name=en
监控地址
http://localhost:18080/service/actuator/health
swagger
http://localhost:18080/service/swagger-ui.html#/
缺点
服务声明
按照我的本意,希望把接口单独独立成jar包,外部系统依赖的时候,就直接依赖jar包,配置扫描就可以了.
有以下2点限制没有实现
- feign的具体调用需要依赖
@RequestMapping注解,而@RequestMapping注解在springMVC包,依赖复杂 @FeignClient的注解,在openFeign或者netflix-feign里面,也是无法拆除
本框架的服务声明,使用接口模式,期望在最大程度上保留接口声明(一个重要原因,接口服务需要明确输入输出!!).
提示
正是因为上述原因,Feign接口的返回都是使用泛型,而不是使用Map
- 可以方便swagger查看接口
- 固定输出参数
目前的实现造成以下不是很好的实现,
- 每个接口都需要在项目内部重新使用feign扩展.详细请看代码中的
com.istock.sampleservice.api.SenvonInfoFeignClient类.因为feign的注解没有单独成jar包,也可以猜测spring官方认为feign的初衷就不希望使用jar包集成,我只是有点强迫症而已.
提示
框架无法解决的事情,具体项目可以搞.
常规的项目,如果认为在api包内依赖feign和springMVC,可以把core里面api的package声明去掉.
如果按照feign不希望jar包依赖的方式,可以去掉api子模块.
