首先,我们这个项目是前后分离开发,分为内网部署和外网部署。外网,也就是面向公众访问的,我们来部署我们的前端项目,可以有手机app、电脑的web网站。而内网部署的是我们整个的服务集群。公众是通过我们的客户端来完成相应的功能,比如登录注册等都要通过客户端来给我们的服务发送请求,当然这个请求不是直接过来的。所以我们完整的请求流程应该是这个样子的,首先通过任意客户端来给我们发请求,请求先来到nginx集群,(这一块先不用管)nginx将请求转发给我们的后台服务,当然也不是直接转给我们的后台服务,nginx先将请求转给我们的api网关,网关使用spring cloud gateway ,可以根据当前请求动态的路由到某个服务,如果这个服务众多(集群),可以由网关负载均衡的调用。此外,若某个服务出现问题,可以由网关对服务进行统一的熔断降级。熔断降级使用sentinel组件。网关还有其他功能,比如认证授权,对合法的请求进行认证放行,以及令牌限流,限制瞬时流量。比如当前100万的请求过来了,全放过去了,会压垮服务,我们可以在当前网关处进行流量控制。这里的限流,也是sentinel组件。当我们的网关放行请求,到达服务以后,服务进行处理,服务是由spring boot编写的。服务与服务之间的相互调用采用feign,而且有些请求可能要登录以后才处理,这里用到了基于OAuth2的认证中心,除了有一般的登录,还有基于OAuth2的社交登录,整个应用里的安全及权限控制,使用spring security进行控制。这些服务需要保存一些数据,以及缓存等。缓存采用的是redis的集群,分片集群加上哨兵集群(shared+sentinel),持久化存储数据采用的是MySQL集群,可以做成读写分离,或者分库分表。服务和服务之间采用rabbitmq消息队列来异步解耦、完成分布式事务的最终一致性。有些服务比如,用到的全文检索,使用elastic search.有些服务需要存储一些图片和视频,使用的是阿里云的对象存储服务。这一块就是这个服务中关于数据存储的方案。整个服务上线后,想要快速定为出现的问题,采用elk对日志进行相关的处理,使用logstash来收集各种日志,把它存储在es中,然后使用kibana可视化界面从es中检索出相关的日志信息,帮我们快速定位问题的所在。
在分布式系统中,由于每一个服务都有可能部署在很多台机器上,而且服务和服务之间要相互的调用,就得知道彼此都在哪里,我们就推荐将所有的服务都注册到注册中心,然后其他服务可以从注册中心发现其他服务所在的位置。所以使用nacos作为服务的注册中心。同样的,服务众多,最后要实现改一处配置实现全部更改,也采用nacos,所有服务都可以从nacos获取它的动态配置。在服务调用其他服务时出现问题,我们可以采用服务追踪组件来追踪那一块链路出现问题,使用sleuth+zinkin,将服务的信息交给开源的prometheus进行聚合分析,再有grafa可视化展示,再由altermanager得到告警信息,通过手机邮件短信的方式通知开发运维人员。
此外还提供了持续集成持续部署功能。开发人员可以将修改后的代码提交到github,然后运维人员可以通过自动化工具jenkins,从github中获取代码,将它打包成docker镜像,使用k8s来集成整个服务,将服务以docker容器的方式运行。