从0开始搭建⼀个微服务后端系统-基础⼊门篇
前⾔
今天开始,我和⼤家⼀起,从0开始,基于Spring Cloud Alibaba,搭建⼀套基本的微服务架构的项⽬。
主要⽤到下⾯的知识内容
JDK8/IDEA/Maven
Spring/SpringBoot/Spring Cloud Alibaba
Dubbo/openfeign:服务间调⽤
这⾥之所以引⼊了两种调⽤⽅式,是为了⽅便根据接⼝的实际情况,选择合适的调⽤⽅式
Seata:分布式事务
MySQL
Redis
RabbitMQ/RocketMQ
RBAC:这⾥,我不打算使⽤常见的 Spring Security/Spring Security OAuth2.0/Shiro等常见的认证授权技术,我打算⾃⼰⼿动撸⼀套简易的认证授权体系出来
之所以这么⼲,我还是考虑到⼀个定制化和灵活性的问题,在真正的⼤企业中,其认证授权体系是⾮常个性化的,如果⽤了某项技术,往往会制约这种个性化的实现。好吧,我这⾥主要想吐槽的就是 Spring Security太复杂了,做⼀个简单的功能,要理解的概念太多了。既然RBAC理论和OAuth2.0协议本⾝已经⾮常成熟了,我们根据⾃⼰的需要,⼿撸⼀个也不是什么⼤问题
理论:微服务与Spring Cloud
什么是微服务
⾸先,微服务本⾝,是⼀种软件设计,软件架构的思想,并不是具体的某⼀种技术。可千万别把微服务和Spring Cloud给划上等号。
单体应⽤
我们先来说说传统的单体应⽤,也就是在⼀个项⽬中,把所有的代码都写在⼀个应⽤中。
这么做其实在后续功能不断迭代之后,在软件管理和设计上,是会带来种种问题的。
1、应⽤整体挂机的概率增强
我们写代码的时候要有⼀个底线思维,就是要把情况往糟糕的情况下去考虑,然后给出解决⽅案。
只有这样严格要求⾃⼰,我们的代码才会更加健壮。
但即使是这样,只要是⼈,就会犯错,并且,⼀个项⽬中的代码,迭代⼏轮之后,不知道经了多少⼈的⼿。
保不齐就有个⼩伙伴埋了个雷,⼀旦这个雷爆发,那么我们整个系统也就挂了。
2、技术受限制
当我们在已有的应⽤中添加功能代码的时候,是需要受当前应⽤的限制的。
⽐如说,我举个极端的例⼦,这个项⽬⽐较⽼了,使⽤的是Spring2.5,⽽现在我们做开发⼀般⾄少都⽤JDK8.
那么很不幸,Spring2.5和JDK8是不兼容的。于是我们就没法使⽤JDK1.8提供的各种实⽤的特性。
3、部署复杂
这个部署复杂,是针对代码量急剧增加之后来说的。
随着代码量越来越庞⼤,不管是启动还是测试,上线部署,都将变得越来越慢。
有时候明明改的是⼀个很⼩的功能,但是没办法,我们就是需要整个项⽬都部署⼀遍
分布式
与单体应⽤相对的,就是分布式系统。
所谓分布式,就是说我们把⼀个项⽬,按照⼀定的划分原则,将各个功能的实现拆开来,部署的时候分开部署。
应⽤之间通过约定的⽅式调⽤。⼀般是http协议或者rpc协议(如 gRPC、thrift、Dubbo等)。
当我们按照功能拆开后进⾏部署和开发,带来的好处是很明显的,⾄少把上⾯讲的,单体应⽤的⼏个缺点,是都给解决掉了。
但是同时,也引⼊了新的问题
1、事务怎么办,在单体应⽤中,⼀个进程中操作⼀个数据库,回滚是⾮常⽅便的,直接使⽤数据库的特性就可以实现回滚
2、基础功能重复开发怎么办?即如何复⽤?各个模块中有些功能可能是公⽤的,⼀旦拆开后,怎么复⽤这些代码?
3、测试困难,原先只要启动⼀个应⽤就够了,现在如果⼀个功能的测试,依赖于多个模块,那么相关模块就都要运⾏起来
但是,后端开发进⼊现在这个阶段,我们对⼤数据量⾼并发的要求,相对于分布式系统的⼀点点缺点,其带来的好处是不⾔⽽喻的。
所以,现在基本上⼀家企业如果已经过了市场验证阶段,没理由继续使⽤单体应⽤,肯定都是要改造成分布式系统的。
微服务
那么什么是微服务呢?
微服务肯定是分布式的。那么微服务和分布式系统⼜有什么区别呢?
以我⾃⼰不成熟的看法来说的话,所谓微服务,除了解决分布式系统领域的问题之外,其特点,重在⼀个微。
怎么样的⼀个服务,可以称之为微服务呢?这个才是难点。⼀个系统中,我们怎么拆分,不管是从业务的⾓度还是技术的⾓度,各个应⽤单元之间如何协作,这个才是微服务设计中最最复杂的部分,技术上的难点,其实互联⽹上的⼤⼚,基本上都已经有解决⽅案了。
微服务设计6⼤原则
微服务和单体应⽤的选择
既然微服务有这么多优点,单体应⽤有那么多缺点,我们在实际项⽬中到底选择使⽤哪种开发模式呢?
这个其实和公司当前的实际情况是挂钩的,我们做开发的,⼀定要理清楚⼀点,技术,是为业务服务的,或者说是为了需求服务的。
千万不要为了技术⽽技术。如果⼀家公司,刚起步,⼈⼿不⾜、业务量也不⼤、技术实⼒也不够雄厚,这个时候贸贸然跟风上微服务,这不就是⾃⼰给⾃⼰事⼉做吗?
当公司业务上来了,团队规模也起来了,⼈员配备⾜够覆盖微服务本⾝的规模,能够驾驭了,这个时候,才能够切实感受到微服务对整个系统带来的好处。
Spring Cloud和微服务是什么关系
Spring Cloud,就是针对微服务的⼀套实现。
⽐较著名的所有 Spring Cloud Netflix和Spring Cloud Alibaba
⼩结
以上讲的都是⼀些概念性质的东西,具体怎么开发已经详细的理论,我会在后续实战部分,逐个进⾏讲解。
理论:微服务软件架构设计
我们先来对这⼀整个微服务体系,进⾏整体设计。
第⼀张图,是我在⽹上的⼀个关于微服务架构的社交
第⼆张图,我重新精简了⼀下,基本上就划分为⽹关、认证中⼼、其他业务模块这⼏种类型。
实战:搭建项⽬⾻架
chan
chan-dep:全局版本依赖管理
chan-common:通⽤⼯具类
chan-auth:认证授权模块
chan-user:⽤户管理模块
chan-log:⽇志模块
chan-gateway:⽹关
…:其他业务模块
我们创建了⼀个项⽬来进⾏依赖管理,其他⼤多数pom关系不⼤,
不过,对于Spring Cloud、Spring Cloud Alibaba、SpringBoot,这三者之间的版本,是有关联的。Spring Cloud Alibaba的版本与Spring Boot⼀致
Spring Cloud的版本与Spring Boot ⼀致
Spring Cloud Alibaba及其组件(Dubbo、Seata、Sentinel、Nacos),他们之间的版本也是有关联的。我们在配置这⼏个组件的版本的时候,最好先去⽹上查⼀下,他们是怎么搭配的。
⼀般这种配置,除⾮是⼤版本的更新,否则⼀旦配置好后,就不要去修改了,避免引起不必要⿇烦
理论:注册中⼼之Nacos
多个服务之间在相互调⽤的时候,是需要建⽴连接的。
那么他们怎么知道对⽅部署时的ip和port是多少呢?
代码中写死?
重启怎么办?
扩容怎么办?
这个时候,就要⽤到注册中⼼。
在微服务中,注册中⼼是个什么概念
注册中⼼主要是⽤来服务注册和发现的
实战:服务间简单调⽤
Nacos环境搭建
git clone gitee/test-qqqq/nacos-docker.git
我这⾥就直接把nacos-docker clone到chan项⽬了,但是,我把nacos-docker加⼊了git忽略列表,不提交。
之所以将nacos-docker放到chan中,只是为了将所有与项⽬有关的物料,都放在此。
微服务注册中心有哪些cd nacos-docker
# 启动单机版,⽤于开发测试⾜矣,⽣产上如果是部署在阿⾥云环境,可以购买服务,也不需要⾃⼰构建
docker-compose -f example/standalone-mysql-5.7.yaml up -d
# 停⽌
docker-compose -f example/standalone-mysql-5.7.yaml down
不过,这个standalone-mysql-5.7.yaml,⾥⾯的镜像速度超有点慢,我把他们都上传到⾃⼰的镜像仓库了,然后修改yaml⽂件如下

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。