微服务的实践正式开始
从今天开始,从零做一套简单的微服务程序,有时候光看一些文章,代码,不足以让我们印象深刻的记住这些知识,想要掌握这些知识,感觉最好的方式就是自己去实践加实现。
说微服务之前,还是在啰嗦两句。顺便自我总结一下,在之前做过的项目中,大多都是一些单体项目,也有一些是前后端分离的项目,都是部署在一台机器上,没有集群,若服务器故障,则整个项目就挂了,而随着项目功能越来越多,项目越来越庞大,每次更新发布,哪怕只修改了某一个逻辑的一小块功能点,那还是得发布更新整个项目。
微服务的出现,就很好的解决了上述问题,每个服务可以有多个实例,部署在不同的机器上,组成集群,只要有一台服务器还活着,服务就可以正常工作,保证项目的高可用。同时,由于一个大项目拆分成了多个小项目,若某一个项目修改,则只更新发布这一个服务即可,对其他服务不影响,减少出错的概率。
好了,话不多说,正式开始微服务之旅。
选用技术
.NET5 已经出来一段时间了,作为.NET的忠实粉丝,毫无疑问选.NET5,其他技术包括,WebApi + EFCore + Mysql + Vue + Ocelot + Consul +Polly + Identity Server4 + gRPC + Nginx + Docker + Apollo+Redis。由于这只是一个学习时的demo项目,所以不求业务多复杂,只求技术用的多。
项目架构图
这样看起来还是比较清晰的,小人就是客户端Vue,,网关连接着Consul做服务发现,然后请求通过网关在转发到各个服务,三个服务之间公用一个数据库,服务之间还有gPRC的调用。
这里有一点,身份认证我没有画线,一开始身份证认证是和网关在一起的,在网关层面做请求的筛选,比如验证用户Token是否有效,在网关层直接限制掉,这样可以减少各个服务的压力,看起来挺好,但是后来我发现,有些服务是不需要用户登录就可以访问的,比如商品列表,注册,所在网关层限制,一刀切就不好了,于是就把身份认证还是放到各个服务去做,若某些接口需要用户登录才能访问,就在方法上加上特性[Authorize]
。不需要用户登录就能访问的接口就不加。
接下来就该开始实操了,首先需要新建一堆项目,如下图所示。
其中Services
为服务文件夹,下面是所拆分的三个服务。ConsulBuilder
和 Infrastructure
为公共类库,方便其他项目进行引用,ApiGateway
为网关,添加了Ocelot
和Consul
,Identity Server
为身份认证服务。
所有的接口如下。
登录接口:Ids4授权中心
注册接口:https://localhost:44335/user/register
商品列表接口:https://localhost:44335/goods/getList
购买商品接口:https://localhost:44335/order/buy
订单列表接口:https://localhost:44335/order/getList
前端项目
前端用Vue-cli脚手架直接新建一个项目即可,不做过多说明,结构如下。
数据库设计
数据库采用Mysql 8.0.22。表设计如下。
goods(商品表)
order(订单表)
user (用户表)
目前只是把项目框架搭起来,接下来还有一系列的文章。
项目地址:https://gitee.com/limeng66/easy-shop