电商商城定制开发微服务SpringBoot+Neo4j搭建企业级分布式应用拓扑图

文章目录


电商商城定制开发上一篇文章中我们介绍了,电商商城定制开发但是只介绍了使用Cypher语言在Neo4j电商商城定制开发的浏览器中执行增删查改的操作,电商商城定制开发现在我们想要基于SpringBoot电商商城定制开发来实现代码层面的增删查改。

一、环境搭建

最便捷的方式就是访问start.spring.io,新建一个项目,选择的依赖有:

  • spring-boot-starter-data-neo4j
  • spring-boot-starter-web
  • lombok

然后JDK需要选择11版本,因为我们当前使用的版本是4.4.7,可以在Neo4j的浏览器中左下角“About Neo4j”中看到使用的版本号,其对应需要支持的JDK版本可以在中查到:

1. JDK 11Neo4j 4.0 is the first major release that requires JDK 11. Custom extensions and procedures can be compiled now for JDK 11, for example, -target 11. It is generally recommended to use the latest available JDK 11 to access all available fixes and performance improvements.
  • 1
  • 2

如果本地Neo4j是通过Docker镜像安装的,我们可以进入镜像内部,使用命令查看Neo4j运行的Java版本信息:

# java -versionopenjdk version "11.0.15" 2022-04-19OpenJDK Runtime Environment 18.9 (build 11.0.15+10)OpenJDK 64-Bit Server VM 18.9 (build 11.0.15+10, mixed mode, sharing)
  • 1
  • 2
  • 3
  • 4

如果不是通过Docker镜像安装的,那么本地就需要自行安装JDK11了,同样的,在运行如上我们下载的SpringBoot工程时,同样需要选择项目基于的JDK版本为11,然后才能正常运行。

二、Neo4jRepository介绍

Neo4jRepository是SpringData为我们提供的用来操作Neo4j数据库的接口,我们先来看看它的继承关系:

Neo4jRepository的继承关系

可以看到,通用的增删查改功能基本都有了,如果我们的数据库操作也是些简单的操作,那基本就不用再添加方法了,直接使用Neo4jRepository提供的方法即可。当然也支持我们自定义方法进行操作,这个下面再信息讲述。

三、代码演示

这里的代码示例,只是展示系统节点的增加、相互之间关系的创建,其它增删查改操作,可以自行摸索学习。

@Slf4j@RestControllerpublic class SystemController {    @Autowired    private SystemService systemService;        public static final String SUCCESS_RESULT = "success";    @GetMapping("/getAllSystemNode")    public List<SystemEntity> getAllSystemNode(){        return systemService.getAllSystemNode();    }    @GetMapping("/findSystemById/{id}")    public SystemEntity findSystemById(@PathVariable("id") Long id){        SystemEntity result = systemService.findSystemById(id);        log.info("{}", result);        return result;    }    @PostMapping("/addSystemNode")    public String addSystemNode(@RequestBody SystemEntity systemEntity){        systemService.addSystemNode(systemEntity);        return SUCCESS_RESULT;    }    @GetMapping("addInvokeRelation/{from}/{to}")    public String addInvokeRelation(@PathVariable("from") Long from, @PathVariable("to") Long to){        systemService.addInvokeRelation(from, to);        return SUCCESS_RESULT;    }    @GetMapping("addConsumeRelation/{from}/{to}")    public String addConsumeRelation(@PathVariable("from") Long from, @PathVariable("to") Long to){        systemService.addConsumeRelation(from, to);        return SUCCESS_RESULT;    }    @GetMapping("addProduceRelation/{from}/{to}")    public String addProduceRelation(@PathVariable("from") Long from, @PathVariable("to") Long to){        systemService.addProduceRelation(from, to);        return SUCCESS_RESULT;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
@Slf4j@Servicepublic class SystemService {    @Resource    private SystemRepository systemRepository;    public List<SystemEntity> getAllSystemNode(){        List<SystemEntity> systemEntityList = systemRepository.findAll();        log.info("查询所有的节点为:{}", systemEntityList);        return systemEntityList;    }    public void addSystemNode(SystemEntity systemEntity){        SystemEntity result = systemRepository.save(systemEntity);        log.info("添加节点后的返回结果为:{}", result);    }    public void addInvokeRelation(Long from, Long to){        systemRepository.addInvokeRelation(from, to);    }    public void addConsumeRelation(Long from, Long to){        systemRepository.addConsumeRelation(from, to);    }    public void addProduceRelation(Long from, Long to){        systemRepository.addProduceRelation(from, to);    }    public SystemEntity findSystemById(Long id){        return systemRepository.findSystemById(id);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
/** * Neo4jRepository<T, ID> * T表示节点类,ID表示主键类型 */public interface SystemRepository extends Neo4jRepository<SystemEntity, Long> {    @Query("MATCH (a),(b) WHERE id(a)=$from and id(b)=$to MERGE (a)-[:invoke]->(b)")    void addInvokeRelation(@Param("from") Long from, @Param("to") Long to);    @Query("MATCH (a),(b) WHERE id(a)=$from and id(b)=$to MERGE (a)-[:consume]->(b)")    void addConsumeRelation(@Param("from") Long from, @Param("to") Long to);    @Query("MATCH (a),(b) WHERE id(a)=$from and id(b)=$to MERGE (a)-[:produce]->(b)")    void addProduceRelation(@Param("from") Long from, @Param("to") Long to);    /**     * 使用节点id时只能用id(n)这种写法,其它属性可以用n.name这样的写法     * @param id     * @return     */    @Query("MATCH (n) where id(n)=$id RETURN n")    SystemEntity findSystemById(@Param("id") Long id);    //等价写法@Query("MATCH (n:SystemEntity {leader: $leader}) RETURN n")    @Query("MATCH (n) where n.leader=$leader RETURN n")    SystemEntity findSystemByLeader(@Param("leader") String leader);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

然后,运行如上SpringBoot项目后,我们按照上一篇文章中的示例,依次增加系统节点和关系之后,可以得到图如下:

实现的系统架构可视化图

该例子和上一篇例子稍微有些不同,此处所有系统节点的类型都设置为了System,所以同一类型的节点颜色都是相同的。

四、待解决问题

可能是由于自己Cypher语言不熟悉,很多CRUD语句用的还不顺畅,比如为什么用到id时,不能使用n.id的写法,还有SystemRepository中调用关系的类型如何参数化,这样就不用为每一种调用关系创建方法了,如果有知道的朋友可以告知下

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发