依赖consul实现一套简易的微服务,目前只适配了jfinal,理论上可以支持其他任意框架,默认采用单参数形式提供服务和调用接口 ,通信方式为http+json,代码简单易懂,通过这个代码可以了解微服务的基本原理,暂时不能用于生产环境
- 类似spring cloud和dubbo,微服务基本套路,rpc通信方式为http+json,如果不想要这种客户端负载均衡策略方式,也可以用fabio,或者nginx+三方插件这种方式从consul拉取服务,配置路由策略,来实现服务器端的负均衡和跨语言支持
- 注册中心(目前调用接口前实时查询consul agent获取健康的服务,后续需要做缓存,定时刷入调用端缓存)
- 客户端负载均衡 (目前只实现了一致性hash,基本生产环境的唯一选择,其他可以自己扩展)
- 客户端动态代理实现远程服务调用(类似fegin和dubbo的方式)
- 健康检查(利用consul的功能封装)
- 配置中心(利用consul的功能封装)
- 客户端和服务器端双重参数验证(利用jsr303规范,注解)
- 通信协议目前默认方式为http+json(http客户端和json序列化性能需要更换其他高性能库来实现)
- context机制来传递全局变量,为后续调用链,日志,用户身份鉴权等场景打基础传递
- 异常处理和熔断处理(利用resilience4j来实现)
- 灵活的框架参数配置
- api gateway开发中(准备基于原生的servlet3实现,暂时不考虑netty实现,支持动态路由刷新)
- 灵活的api label配置,可以在调用时指定标签,调用对应标签的api,用于实现现网,沙箱,跨机房等服务分组的需求
- api doc生成(因为采用单参数接口的形式,通过反射获取对象属性和jsr303的标签,作为原数据,可以生成md文档, 或者暴露元数据以供生成各种格式的文档的)
- 调用链日志(google drapper论文中的原来,和spring cloud)
- 监控(准备接入promethues)
- 单测补齐,各种场景的充分测试和性能压测
- 部分代码实现优化
- 原生servlet的支持
- 内嵌容器
....
public class DemoConfig extends DragonLiConfig { ... } //定义BlogService.java @Rpc("jfinalDemo") public interface BlogService { BlogPara json(BlogPara blogPara); } //BlogPara.java @Data public class BlogPara implements JsonBeanValidate { private String code; @Range(min=1,message="4001") private int id; @Length(min = 1,max = 10,message="4002") private String title; @NotBlank(message="4003") private String content; } //调用方式 @Inject private BlogService blogService; public void test(){ BlogPara jsonBean = getJsonBean(BlogPara.class); BlogPara resp = blogService.json(blogPara); renderJson(resp); } public class BlogController extends JsonController { @Before(BlogPara.class) public void json() { BlogPara jsonBean = getJsonBean(BlogPara.class); jsonBean.setCode("200"); renderJson(jsonBean); } }- curl http://localhost:8080/blog/test -d '{"id":10,"title":"title","content":"content"}'
- {"code":"200","id":10,"title":"title","content":"content"}
apigateway 默认8080端口 consumer 默认8082端口 producer 默认8081端口
1 curl --location --request POST 'http://localhost:8080/consumer/blog/testRpc'
--header 'x-uid: 111'
--header 'Content-Type: application/json'
--data-raw '{ "id":1, "title":"title", "content":"content" }'
2 result: {"code":"0","id":0,"title":null,"content":null}