apache是干嘛用的,apache是干什么用的

  

  我们以前的服务——单一服务当我们开发一个新模块的时候,很多小伙伴会问为什么要构建微服务架构。一个项目从头到尾实现代码不是很方便吗?开发更快,部署更容易。如果使用微服务,涉及的技术会非常多,中间很容易出现各种不一致的问题。这种问题怎么回答?先来看看我们以前做B-S服务是怎么做的。   

  

     

  

  刚开始的时候,我们总是会得到一个tomcat(服务容器)mysql(数据库),然后直接把项目放入一个war包中,扔到tomcat下面直接开始部署,可以通过浏览器访问。甚至有些服务页面数据库都在一台机器上,直接连上互联网,为用户提供服务。当时,我们主要的主流技术(B-S)架构是这样的:   

  

  第一阶段:JSP(page)Java Struts 1 Hibernate Spring MySQL第二阶段:JSP(page)Java Struts 2 Hibernate Spring MySQL第二阶段:jsp (page) java springMVC mysql可能会随着用户的增加慢慢出现服务瓶颈,比如服务卡顿,页面返回慢。有一种多服务部署,使用nginx作为反向代理,就像下面这种情况:   

  

     

  

  之后发现数据存在瓶颈,做了主从架构,增加读取服务器数量。主数据库保证数据的一致性,从服务共享查询请求,所以主服务器会将数据同步到从服务器,实现数据的最终一致性。当然,这种架构仍然会遇到性能瓶颈,但可以暂时长期使用。慢慢有了缓存,如果有了缓存,静态文件会被分离出来,性能会进一步提升。一般项目已经到了这个阶段,足以满足大部分需求。   

  

     

  

  在上面的系统架构中,应用服务器只是被克隆然后单独部署,每个应用服务器上的代码是完全一样的。就像当初肆虐我们的病毒一样,病毒分化后,所有病毒细胞的功能都是一样的。从服务的角度来说,这种病毒虽然可以支撑一段时间的正常业务,但是服务的扩展性和容错性很差,增加一个小功能就容易出错。此外,从成本控制的角度来看,它消耗了大量的资源。此时可能出现的问题:   

  

  软件可用性风险增加。也许是一个bug让整个软件不可用。由于代码量大,逻辑复杂,代码的可维护性变差,只有少数老员工能完全理解。代码严重损坏。修改bug和添加新功能会比较困难,可能会影响全身。软件扩展变得困难,新功能需要考虑是否会影响原有功能。编译可能需要很长时间,这导致了发布。接下来,我们来看看微服务是如何改变现状的。不同应用服务器的职责开始发生变化,就像我们造血干细胞的出现,使得细胞分化成身体各个器官协同工作。   

  

  我们现在的服务——微服务。我感觉微服务不是一个架构,而是一个生态。应用程序相互独立,但又相互依赖。通过DDD模型设计一个地图,并把适当的代码放在适当的地方。实现微服务涉及的工具太多了。我会用春天生态来描述整个微服务生态架构,朋友们可以体验一下。我们来宏观图体验一下微服务是什么样的:   

  

     

  

  如上图,整个微服务的生态和周边大概是这样的。一开始也很难完美的设计架构。架构不是设计出来的,甚至是设计不出来的。它只能随着需求的变化而进化。整个结构工作更像是药剂师的对症治疗和处方。软件在很大程度上是一个服务行业,尽管它长期以来被错误地认为是一个制造业。我觉得这句话很准确的描述了软件行业。   

  

  微服务优势   

  

  应用小,编译部署快,维护性高,单个微服务修改容易,因为每个团队独立负责单个功能。新功能的交付速度更快,可以快速开发。交付可扩展性更高,可靠性更强,可以部署很多独立的服务。   

  

  整体复杂性变得更高。微服务多了,如何监控所有微服务,保证服务的稳定性和运维的复杂性。分布式数据一致性和分布式事务服务保证了如果一个服务出了问题,怎么可能不影响其他服务?微服务的这个生态涉及到很多周边技术和需要解决的问题。具体来说,下面我简单介绍一下整个微服务生态技术,但是注意,要么下面提到的技术都用在项目中,要么就是微服务,而微服务指的是微商,技术只是实现;所以,如果要设计整个微服务架构,必须对业务非常熟悉,根据业务拆分微服务,最后以技术实现达到最终目的。   

  

  微服务架构是适应业务快速变化和产品快速迭代、交付、反馈、修改的架构解决方案。   

  

  注册中心(Erurka)注册中心主要提供三个核心功能:   

  

  当一个注册服务提供商启动时,它将通过Eureka客户端向Eureka服务器注册信息,Eureka服务器将存储该服务的字母。   

息,Eureka Server 内部有二层缓存机制来维护整个注册表 2. 提供注册表 服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表 3. 同步状态 Eureka Client 通过注册、心跳机制和 Eureka Server 同步当前客户端的状态。

  

网关(Zuul)API网关是一个更为智能的应用服务器,它的存在就像是整个微服务架构系统的门面,所有的外部客户端访问都需要经过它来进行调度和过滤。除了需要实现请求路由,负载均衡及校验过滤等功能外还需要与服务治理框架的结合,请求转发时的熔断机制,服务的聚合等一系列高级功能。 主要核心功能:

  

服务路由转发鉴权校验过滤熔断限制保护配置中心(Config)Spring Config首推基于git的管理方式,提供了两个管理维度,一个是label(即branch),一个是profile。其实他的原理是基于git的变化来通知各个服务的有些不太灵活,以后文章中会采用nacos替换这个config功能,现在先了解一下他是干嘛的就可以了。 主要核心功能:

  

业务配置功能开关服务配置服务APM(Grafana)grafana 是一个开源的时序性统计和监控平台,支持例如 elasticsearch、graphite、influxdb 等众多的数据源,并以功能强大的界面编辑器著称。我们可以通过这个平台监控所有服务的负载,流量,使用率,机器硬件相关参数,以及可以配置相关参数通过http或者短信邮件报警提醒等。目前APM工具很多这个只是其中的一种,付费的平台也又很多像听云等平台。

  

异步队列(MQ)MQ大家都熟悉,现在主流的MQ有rabbitMQ,rocketMQ,kafka。三者的区别我会在以后的文章介绍对比,以及不同场景应该使用哪种MQ。以及在使用过程中的消息顺序性,幂等性保证等踩坑记录。 核心功能:削峰填谷

  

容错限流(Hystrix)它设计用来当分布式系统发生不可避免的异常的时候去隔离当前服务和远程服务、系统、三方包的联系,防止出现级联失败的情况,从而导致整个系统雪崩。 主要核心功能:

  

失败转移和优雅降级实时监控更改相关配置基于线程和信号量的断路器隔离负载均衡+服务调用(Ribbon、Feign)ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。ribbon主要功能是提供客户端的软件负载均衡算法。Ribbon就属于进程内负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。 主要核心功能:负载均衡

  

持续集成(Jenkins)在项目多的时候,重复操作极大的浪费时间。如果遇到同一时间不同项目组打包项目,打包和部署服务器就要排队使用,测试人员只能在等待中浪费时间。为了解决这些问题,选择寻找合适的持续集成方案。来自动化完成重复的步骤。jenkins还包含了很多插件,比如代码校验等等。是CI/CD的基本技术。 核心功能:

  

拉取代码打包构建将资源送往目标服务器分布式任务调度(Elastic-Job)它通过弹性调度、资源管控、以及作业治理的功能,打造一个分布式的任务调度总线。 核心功能:

  

弹性调度资源分配作业治理失效转移分布式缓存(Redis)这个。。。。还用介绍么。。。多说一句redis这个skiplist跳跃表值得研究一下,另外zset这个数据结构有大用。 核心功能:

  

内存数据库基于内存数据库的各种扩展功能分库分表(sharding jdbc)Sharding-JDBC他定位为轻量级Java框架,在Java的JDBC层提供额外的服务,以jar包形式提供服务,无需额外部署和依赖,可以理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。还有个付费的相似中间件那就是阿里的DRDS,有兴趣的伙伴可以了解一下DRDS。 核心功能:

  

数据分片读写分离透明的使用jdbc访问各个数据库代码托管(Gitlab)搞开发的相信都知道这个,相当于这个是github的兄弟。

  

日志收集(ELK)ELK=Elasticsearch+Logstash+Kibana

  

Elasticsearch:是一个基于Apache Lucene的分布式开源搜索引擎,使用Apache2.0开源协议发布(意味着可以免费下载、使用或者修改)。它在Lucene的实时搜索之外提供了可扩展性、可靠性和多租户功能。Elasticsearch的功能可以通过基于JSON的RESTfulAPI来使用 。

  

Logstash提供了输入插件来支持不同的数据源和平台,设计用来高效地处理日志、事件和非结构化数据源,然后通过输出插件如文件、标准输出。

  

Kibana是一个基于Apache2.0开源协议的开源数据可视化平台。它可以对存储于es的索引中的各种结构化和非结构化的数据进行可视化呈现

  

容器化(Docker+k8s)通过 Docker 技术,我们可以像管理我们的应用一样管理我们的基础设施(比如基础依赖等,这里的具体技术其实就是镜像)。通过 Docker 技术,我们可以精简我们的整个开发和交互流程。docker可以做到应用程序和底层基础设施分离,我们可以将这些依赖和应用程序都打包到镜像中,然后测试或者正式上线的时候只需要将整个镜像部署上去就可以了,不需要关心目标服务器上面的基础环境。k8s(Kubernetes )它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。通俗的讲就是管理docker的。

  


文章来源:https://juejin.cn/post/6921664289644216334

相关文章