目录
- 项目前置知识
- 一、前后端分离开发,分为 内网部署 和 外网部署。
- 二、用户是通过使用 客户端 来完成各种的功能
- 三、网关的作用
- 四、Sentiel组件
- 五、Feign组件
- 六、OAuth2.0认证中心
- 七、SpringSecurity组件
- 八、关于数据存储的解决方案
- 九、定位bug
- 十、注册中心
- 十一、配置中心
- 十二、服务追踪
- 十三、运维
- 十四、参考资料
项目前置知识
- springboot
- Redis
- MySQL
一、前后端分离开发,分为 内网部署 和 外网部署。
- 外网也就是面向公众访问的,即前端项目,可以是手机APP or 电脑的web网站
- 内网部署的,是整个后台的服务集群。
二、用户是通过使用 客户端 来完成各种的功能
- 比如:登录、注册等,都要通过 客户端 来给后台的服务发送 请求,当然,请求 不是直接过来的。
- 首先,请求 由 客户端 发起,来到 nginx集群,nginx 把 请求 通过 API网关 转交给后台服务(即业务集群),API网关 会使用到 SpringCloud Gateway。那么网关会完成一个什么样的功能呢?
三、网关的作用
- 动态路由:网关 可以根据当前 请求,动态地路由到指定的服务,看当前 请求 是要调用商品服务呢?还是购物车服务?还是检索等等
等路由过来的时候,如果某一个服务众多,比如当前 请求 是来查询商品的,在这三个服务里面都有商品服务,这个时候 网关 还可以负载均衡地调用商品服务。当某个服务出现问题,也可以在 网关 这个阶段对服务进行统一的熔断、降级,那么熔断降级就使用阿里巴巴的sentinel组件。 - 认证授权:也就是 请求 过来,要先看一下是否合法,合法了再放行过去。
- 令牌限流:限制当前的瞬时流量,比如:一百万个 请求 都过来了,由于担心全部放过去,整个后台服务会被压垮,所以在 网关 处进行流量控制。可以先放行一万个过去,让后台服务能够很容易处理这些请求。
四、Sentiel组件
通过阿里巴巴提供的Sentiel来完成限流、熔断、降级。当请求通过网关,到达后台服务以后,后台服务就进行处理,这些后台服务是通过springboot来写的一个个微服务。
五、Feign组件
服务与服务之间也会互相调用,比如下订单的时候,就需要通过Feign去调用商品服务,来查询一个个商品信息。
六、OAuth2.0认证中心
有些请求可能要登录以后才能处理,有一个专门基于OAuth2.0的认证中心,除了有一般的登录,还有基于OAuth2.0的社交登录。
七、SpringSecurity组件
整个应用里面的安全和权限控制,都是用SpirngSecurity来进行控制的。
八、关于数据存储的解决方案
- 服务要使用一些数据,就要用到Redis缓存,可以是分片集群,也可以是哨兵集群
- 持久化存储数据是用MySQL集群,可以做成读写分离,也可以做分库分表
- 服务与服务之间,会使用消息队列来进行异步解耦,包括完成分布式事务的最终一致性。
- 使用RabbitMQ集群来做消息队列
- 有些服务需要进行全文检索去检索一些商品信息,就需要使用到ElasticSearch
- 有些服务在运行期间,可能需要存储一些图片、视频等,使用的是阿里云的对象存储服务OSS
九、定位bug
- 项目上线后,为了快速定位项目中一些问题,使用ELK来进行对日志进行相关处理,也就是使用LogStash来收集业务里面的各种日志,把它存储到ES中,然后再使用Kibana可视化界面从ES中检索出相关的日志信息帮我们快速定位线上问题的所在。
十、注册中心
- 发现问题:在分布式系统中,由于每一个服务都可能部署在很多台机器,而且服务跟服务之间要互相调用
- 分析问题:服务之间需要知道彼此的位置
- 解决问题:可以将所有的服务都注册到注册中心,然后别的服务再从注册中心中去来发现其它服务所在的位置,所以使用阿里巴巴的springcloud Nacos来作为配置中心,
十一、配置中心
- 发现问题:每一个服务的配置众多,一个一个服务改配置就太麻烦了,有没有什么一键修改的方法呢
- 分析问题:要实现一键修改的功能,可以采取集中管理配置,那么就需要一个配置中心,
- 解决问题:使用阿里巴巴的springcloud Nacos来作为配置中心,所有的服务都可以从配置中心中获取它的配置
十二、服务追踪
- 发现问题:服务在调用期间可能出现一个问题,比如:下订单服务,调用商品服务,商品服务再调用库存服务,可能某一个链路出现了问题,那该怎么办呢?
- 分析问题:那我们就得追踪整个服务调用链,看哪里出了问题,哪一块问题该怎么解决等
- 解决问题:我们可以使用服务追踪,服务追踪使用Springcloud提供的Sleuth + Zipkin,把每一个服务的信息,交给开源的Prometheus进行聚合分析,再由Grafana进行可视化展示,通过Prometheus提供的AlterManager来实时得到服务的告警信息,把这些告警信息以邮件或者手机短信的方式通知开发或者运维人员。
十三、运维
- 提供了持续集成,持续部署,也就是项目发布起来,由于微服务众多,每一个都打包,部署到服务器上太麻烦了,那有了持续集成
- 开发人员可以将修改后的代码提交给GItHub,然后运维人员,可以通过自动化工具Jenkins从GItHub中获取代码,打包成Docker镜像,最终使用k8s来集成整个Docker服务,将服务以Docker容器的形式来运行
十四、参考资料
- Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目