最近基于jfinal徒手撸个微服务框架的代码,用于实践和学习,生产环境勿用.目前还在开发中,这里提供下代码和思路供大家参考https://github.com/springCat/dragonli
基本思路:
1 对jfinal没有侵入型,保持jfinal的原汁原味,减少学习成本
2 代码极简易懂,没有黑魔法和复杂的过度设计
3 注册中心依赖consul
4 通信方式为http+json
5 没有其他强依赖
6 从单体切换到微服务的代价尽量少
(1)produce端,利用jsr303做参数校验,用法和jfinal官方保持一致
@Data
public class BlogPara implements JsonBeanValidate<BlogPara> {
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;
@Override
public Class<BlogPara> reqType() {
return BlogPara.class;
}
}
public class BlogController extends JsonController {
@Before(BlogPara.class)
public void json() {
BlogPara jsonBean = getJsonBean(BlogPara.class);
jsonBean.setCode("200");
renderJson(jsonBean);
}
}
(2)consumer消费者端,扫描rpc注解的类,基于动态代理生成接口的实现类,把对本地方法的调用转化为远程的http调用,利用jfinal的inject注入
//调用方式
@Inject
private BlogService blogService;
public void test(){
BlogPara blogPara = new BlogPara();
blogPara.setId(1);
blogPara.setContent("content");
blogPara.setTitle("title");
BlogPara resp = blogService.json(blogPara);
renderJson(resp);
}
@Rpc("jfinalDemo") public interface BlogService { BlogPara json(BlogPara blogPara); }
(3)负载均衡策略为基于用户身份id的一致性hash
(4)熔断和限流准备基于resilience4j,目前未实现.
(5)健康检查和配置中心都基于consul
(6)api gateway待实现( 利用nginx第三方插件,从consul拉取注册的服务或者自己实现)
(7)至于其他的后续可以慢慢堆上去,也比较简单
基本各个部件可以自定义和魔改