# alibaba **Repository Path**: xbtq77/alibaba ## Basic Information - **Project Name**: alibaba - **Description**: 搭建一个alibaba 基础微服务架构 - **Primary Language**: Unknown - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 3 - **Created**: 2020-08-16 - **Last Updated**: 2023-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # alibaba spring cloud alibaba 微服务架构 **一、技术介绍** 该项目是基于spring cloud alibaba 技术搭建的 一套功能强大,最好用的微服务架构,该架构提供了,nacos1.3 作为服务注册中心,服务间调用 feign, 使用sentinel 架构进行服务降级,限流,容灾, skywalking 进行链路跟踪,融合了 alibaba seata1.3 demo分布式事务测试案例,提供了 reids(缓存,分布式锁),curator(zookeeper的封装工具类,封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier), es(提供基础单索引查询)mybatis-plus(整合了sql注入,多租户,分页,代码生成),hutool(最好的工具类),通过运用这些技术以及参考开源的gvp项目,搭建的一套最好用的基础微服务架构 **二、工程介绍** ![![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/090458_3c4715df_1450095.png "屏幕截图.png")] **1:sca-common-es** 基于开源项目Elasticsearch-ESClientRHL(EsClientRHL是一个可基于springboot的elasticsearch RestHighLevelClient客户端调用封装工具,主要提供了es索引结构工具、es索引数据增删改工具、es查询工具、es数据分析工具) 封装的es工具类 **2:sca-common-curator** 基于zookeeper 的封装工具类 curator介绍(Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等) **3:sca-common-mybatis-plus** mybatis-plus 应该是目前最好用的mybatis插件,该工具类基于mybatis-plus 实现的分页,多租户,自动填充,担保查询分装等功能 **4:sca-common-redis** 提供了redis 基本操作的封装,分布式锁,整合mybatis二级缓存,spring cache 缓存 ,布隆过滤器,等操作 **5: sca-common-utils** 基于hutool 提供工具类支持,以及自定义的工具类 **6:sca-common-webmvc** 该类是自己针对 mvc 层做的一些封装处理,参数返回结果自动封装状态码,全局异常处理,资源方向拦截处理 **7:sca-server-gateway** 基于spring cloud gateway 实现的网关层。 **8:sca-server-system** 架构的一个测试服务,里面有史上最好用的代码生成工具。 **9:nacos1.0** 里面有nacos1.3 版本注册服务中心 **10: sentinel** 里面是一个sentinel1.3 服务端的服务监控的jar包 **11: skywalking** 是一个链路跟踪的服务端1.3版本 **12: seata** 是阿里的一个分布式事务解决方案 的服务端 **13:seata-client** 是阿里提供的spring cloud 的分布式事务 tcc案列demo 三、服务启用测试教程 当代码从gittee 克隆下来后 ,顺序的启用一般最先启动nacos 就可以了,并无明显的先后顺序,如果该项目下面 有sql 语句,需要先在数据库配置好,部分配置每个人的环境不同 ,需要做修改,这里作者不会详细介绍。 作者下面以最合理的方式启动所有程序 1: 先启动sentinel ,无论是nacos 还是作者本身写的测试服务,都是集成了sentinel 会像sentinel 服务端发送信息。所以最先启动sentinel ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/203531_41d8521e_1450095.png "屏幕截图.png") 如图所示,通过idea 的terminal 进入改jar包的位置 执行命令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar 就可以启动了我们通过界面查看我们的sentinel服务端 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0829/110600_07bbd540_1450095.png "屏幕截图.png") 2:启动nacos 服务端 同样也是nacos 的启动目录,直接调用windows脚本就可以启动成功nacos了 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/125332_d1a03962_1450095.png "屏幕截图.png") 启动后我们在界面上访问如图 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/203803_7ccbad53_1450095.png "屏幕截图.png") 3:接下来我们启动 链路跟踪系统skywalking 启动类似上面很简单的操作,进入到相应目录,执行windows 脚本即可 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/204317_4efa6d5f_1450095.png "屏幕截图.png") 我们便可以在界面上看到效果了 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/204623_e1ee540e_1450095.png "屏幕截图.png") 4: 上面是作者启动一些服务中间件, 下面作者将启动自己的测试服务,sca-server-system ,该服务整合了sentinel ,会将服务服务注册到nacos 同时作者在上面提到这是一套功能非常强大,超级好用的微服务架构,那么在接下来我将详细介绍他的强大在哪里,网关服务sca-server-gateway 整合了链路跟踪,spring boot 项目的启动作者将不再介绍截图 **四:特色工能介绍** 这也是上面作者提到过的该架构功能强大,那么强大在哪里呢? 那就是他的特色功能 1、模板代码生成,与架构相配套的模板代码生成,简介的代码,实现了单表任何操作, controller 模板代码案列 ``` package com.sca.server.system.auth.controller; import com.sca.common.exception.BusinessRuntimeException; import BaseQueryVo; import PageEntity; import com.sca.server.system.auth.entity.Menu; import com.sca.server.system.auth.service.IMenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; /** *

* 菜单管理 前端控制器 *

* * @author zw * @since 2020-03-05 */ @Api(description = "菜单管理 接口") @RestController @RequestMapping("/auth/menu") public class MenuController { @Autowired private IMenuService menuService; @PostMapping("page") @ApiOperation("获取数据列表") public PageEntity findListByPage(@RequestBody BaseQueryVo queryVo){ return menuService.page(queryVo); } @ApiOperation("根据ID查找数据") @GetMapping("/{id}") public Menu find(@PathVariable("id") String id){ Menu menu = menuService.selectById(id); if(menu==null){ throw new BusinessRuntimeException("查询不到此id的数据"); } return menu; } @ApiOperation("添加数据") @PostMapping public Menu addItem(@RequestBody Menu menu){ boolean isOk = menuService.insert(menu); if(isOk){ return menu; } throw new BusinessRuntimeException("新增失败!"); } @ApiOperation("更新数据") @PutMapping public Menu updateItem(@RequestBody Menu menu){ boolean isOk = menuService.updateById(menu); if(isOk){ return menu; } throw new BusinessRuntimeException("更新失败!"); } @ApiOperation("删除数据") @DeleteMapping("{id}") public void deleteItem(@PathVariable("id") String id){ boolean isOk = menuService.deleteById(id); if(!isOk){ throw new BusinessRuntimeException("数据删除失败"); } } } ``` 从dao层到controller层,代码都生成,但实际只有controller 有一些代码,(有兴趣的可以看下其它生成的代码,这里作者就不都列出来了)不知道细心的你发现作者生成的模板代码和大家的模板有什么区别没?如果没有请看作者一一解释 1: 强大的分页查询功能 该分页能实现单表任一条件查询,后台的小朋友 你还在为各种查询写各种各种的查询消耗自己的时间吗?下面作者将演示 一个 按照名称模糊查询,id降序排序,某字段不为空,查询指定字段的分页查询,任何条件都是克选择的,分页条件不传,查询所有。 查询条件 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/213200_72d69c52_1450095.png "屏幕截图.png") 查询结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/213300_23eb3050_1450095.png "屏幕截图.png") 哈哈如果你有了這麽强大的查询功能,是不是很爽,支持的查询如下,看到字段还不能理解,就好好读读作者底层封装的源码看如何实现的 ``` { "andCondition": {}, "fields": [ "string" ], "gtCondition": {}, "inCondition": {}, "likeCondition": {}, "ltCondition": {}, "notNullFields": [ "string" ], "nullFields": [ "string" ], "orderByCondition": {}, "otherCondition": {}, "pageObj": { "current": 0, "size": 0 } } ``` 2:接下来将介绍它的第二个特色,异常处理,细心的大家有没有发现我 throw 出来的异常是不是和你们的相比缺了什么,try-cache代码 原理很简单,RuntimeException 运行时异常直接抛出不需要try-catch代码,瞬间有没有感觉自己的代码清爽了很多。不知道大家有没有发现这个细节上的问题。 3:第三个特色:自动封装, 回到上面的一,大家有没有发现作者的分页查询,是直接返回了分页对象,可是 前台返回的结果 却在分页结果的基础上封装了一层状态,不知道撸代码的你是不是在controller 里面写了一堆 return AjaxJson.ok(data); 这样的代码,封装返回结果,在作者看来实在太恶心了,哈哈! 4:特色功能四,该代码默认支持数据隔离,该功能通过网关模拟(实战中,租户信息是与登录用户绑定在一起的,根据业务确定租户id是什么),网关整合了链路跟踪, ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/215604_ed17c1a8_1450095.png "屏幕截图.png") 返回結果为空的原因是因为租户3在数据库没有数据,我们来看下我们执行的sql SELECT id AS id, parent_id AS parentId, `name`, url, perms, `type`, icon, order_num AS orderNum, `method`, create_time AS createTime, creator FROM sys_menu WHERE tenant_id ='3' 是不是很强大,自动带上了租户信息进行查询。如果某一张表不想要带租户信息查询,只需要在配置文件配置排除就可以了 既然测试了网关,我们顺便看下我们的链路跟踪效果怎么样,直接截图,不废话 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/220443_7211af8d_1450095.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/220507_27dfdbbc_1450095.png "屏幕截图.png") 5:特色功能五比较简单,自动填充功能,我们保存一条数据,会自动填充一些信息,向作者的数据库设计一般会冗余创建人,修改人,时间,租户信息等,那么在保存一条数据时,会自动填充这些,利用mybatis-plus 的自动填充实现的,由于比较简单,作者就不演示了。 6:特色功能六 软删除,这个功能也很简单,了解mybatis-plus 的都应该清楚,不演示。 介绍到这该架构就差不多结束了,哈哈这是一个基础架构,如果你熟悉这些技术,那么你将在半天时间内,搭建一套强大的微服务架构。 五:分布式事物seata 这里作者只演示基本操作,文末作者将提供一些参考文档供大家学习 1:启动 seata服务端 ,很简单,和上面的其它服务一样 ,如下图 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/221614_8aa1ba26_1450095.png "屏幕截图.png") 启动成功后会在nacos 看到该服务 2:启动相关spring boot 客户端服务,依次启动即可 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/221744_2268471d_1450095.png "屏幕截图.png") 3: 该服务seata-business8008 提供了两个接口 一个会发生事物回滚,一个正常,作者就不掩饰了 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0828/222110_56409ea0_1450095.png "屏幕截图.png") **七:未来规范** : 该架构还有很多细节上的代码不够优化,计划在不久抽时间优化掉,集成更多的基础组件(列如fastDFS),正如spring boot 所描叙的插拔性,你需要的基础组件我能立马提供,只需要配置我的工具类jar包即可 **八:参考文档** 作者介绍了这么多,不知道你一路下来有没有感觉在听天说,不急,看看下面的博客也许很多就清晰了很多 curator 文档 [输入链接说明](http://www.throwable.club/2018/12/16/zookeeper-curator-usage/#Zookeeper%E5%AE%A2%E6%88%B7%E7%AB%AFCurator%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3) seata 案列文章 https://developer.aliyun.com/article/768872 作者博客: 虽然写的不咋地,现在也很少写了。还是贴到最后 https://blog.csdn.net/u012316953 如果大家感觉这个架构还有那么一点特色,fork下,哈哈,欢迎大家给优化的建议,