精华内容
下载资源
问答
  • 微服可以为您提供电脑拨号故障处理、家庭网关无法上网故障处理和网速慢检测等常见的上网故障处理,同时对通过电脑进行的宽带连接拨号错误具有自动拦截告警并帮您处理故障的功
  • 微服架构

    千次阅读 2016-12-04 19:56:59
    微服架构

    首先我们看看为什么要考虑使用微服务。

      开发单体式应用

      假设你正准备开发一款与Uber和Hailo竞争的出租车调度软件,经过初步会议和需求分析,你可能会手动或者使用基于Rails、Spring Boot、Play或者Maven的生成器开始这个新项目,它的六边形架构是模块化的 ,架构图如下:

    1.png
      应用核心是业务逻辑,由定义服务、域对象和事件的模块完成。围绕着核心的是与外界打交道的适配器。适配器包括数据库访问组件、生产和处理消息的消息组件,以及提供API或者UI访问支持的web模块等。

      尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用。具体的格式依赖于应用语言和框架。例如,许多Java应用会被打包为WAR格式,部署在Tomcat或者Jetty上,而另外一些Java应用会被打包成自包含的JAR格式,同样,Rails和Node.js会被打包成层级目录。

      这种应用开发风格很常见,因为IDE和其它工具都擅长开发一个简单应用,这类应用也很易于调试,只需要简单运行此应用,用Selenium链接UI就可以完成端到端测试。单体式应用也易于部署,只需要把打包应用拷贝到服务器端,通过在负载均衡器后端运行多个拷贝就可以轻松实现应用扩展。在早期这类应用运行的很好。

      单体式应用的不足

      不幸的是,这种简单方法却有很大的局限性。一个简单的应用会随着时间推移逐渐变大。在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码。几年后,这个小而简单的应用会变成了一个巨大的怪物。这儿有一个例子,我最近和一个开发者讨论,他正在写一个工具,用来分析他们一个拥有数百万行代码的应用中JAR文件之间的依赖关系。我很确信这个代码正是很多开发者经过多年努力开发出来的一个怪物。

      一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦。敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它。因此,修正bug和正确的添加新功能变的非常困难,并且很耗时。另外,团队士气也会走下坡路。如果代码难于理解,就不可能被正确的修改。最终会走向巨大的、不可理解的泥潭。

      单体式应用也会降低开发速度。应用越大,启动时间会越长。比如,最近的一个调查表明,有时候应用的启动时间居然超过了12分钟。我还听说某些应用需要40分钟启动时间。如果开发者需要经常重启应用,那么大部分时间就要在等待中渡过,生产效率受到极大影响。

      另外,复杂而巨大的单体式应用也不利于持续性开发。今天,SaaS应用常态就是每天会改变很多次,而这对于单体式应用模式非常困难。另外,这种变化带来的影响并没有很好的被理解,所以不得不做很多手工测试。那么接下来,持续部署也会很艰难。

      单体式应用在不同模块发生资源冲突时,扩展将会非常困难。比如,一个模块完成一个CPU敏感逻辑,应该部署在AWS EC2 Compute Optimized instances,而另外一个内存数据库模块更合适于EC2 Memory-optimized instances。然而,由于这些模块部署在一起,因此不得不在硬件选择上做一个妥协。

      单体式应用另外一个问题是可靠性。因为所有模块都运行在一个进程中,任何一个模块中的一个bug,比如内存泄露,将会有可能弄垮整个进程。除此之外,因为所有应用实例都是唯一的,这个bug将会影响到整个应用的可靠性。

      最后,单体式应用使得采用新架构和语言非常困难。比如,设想你有两百万行采用XYZ框架写的代码。如果想改成ABC框架,无论是时间还是成本都是非常昂贵的,即使ABC框架更好。因此,这是一个无法逾越的鸿沟。你不得不在最初选择面前低头。

      总结一下:一开始你有一个很成功的关键业务应用,后来就变成了一个巨大的,无法理解的怪物。因为采用过时的,效率低的技术,使得雇佣有潜力的开发者很困难。应用无法扩展,可靠性很低,最终,敏捷性开发和部署变的无法完成。

      那么如何应对呢?

      微处理架构——处理复杂事物

      许多公司,比如Amazon、eBay和NetFlix,通过采用微处理结构模式解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。

      一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务还会发布API给其它微服务和应用客户端使用。其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器。

      比如,一个前面描述系统可能的分解如下:

    2.png
      每一个应用功能区都使用微服务完成,另外,Web应用会被拆分成一系列简单的Web应用(比如一个对乘客,一个对出租车驾驶员)。这样的拆分对于不同用户、设备和特殊应用场景部署都更容易。

      每一个后台服务开放一个REST API,许多服务本身也采用了其它服务提供的API。比如,驾驶员管理使用了告知驾驶员一个潜在需求的通知服务。UI服务激活其它服务来更新Web页面。所有服务都是采用异步的,基于消息的通讯。微服务内部机制将会在后续系列中讨论。

      一些REST API也对乘客和驾驶员采用的移动应用开放。这些应用并不直接访问后台服务,而是通过API Gateway来传递中间消息。API Gateway负责负载均衡、缓存、访问控制、API 计费监控等等任务,可以通过NGINX方便实现,后续文章将会介绍到API Gateway。

    3.png
      ·微服务架构模式在上图中对应于代表可扩展Scale Cube的Y轴,这是一个在《The Art of Scalability》书中描述过的三维扩展模型。另外两个可扩展轴,X轴由负载均衡器后端运行的多个应用副本组成,Z轴是将需求路由到相关服务。

      应用基本可以用以上三个维度来表示,Y轴代表将应用分解为微服务。运行时,X轴代表运行多个隐藏在负载均衡器之后的实例,提供吞吐能力。一些应用可能还是用Z轴将服务分区。下面的图演示行程管理服务如何部署在运行于AWS EC2上的Docker上。

    4.png
      运行时,行程管理服务由多个服务实例构成。每一个服务实例都是一个Docker容器。为了保证高可用,这些容器一般都运行在多个云VM上。服务实例前是一层诸如NGINX的负载均衡器,他们负责在各个实例间分发请求。负载均衡器也同时处理其它请求,例如缓存、权限控制、API统计和监控。

      这种微服务架构模式深刻影响了应用和数据库之间的关系,不像传统多个服务共享一个数据库,微服务架构每个服务都有自己的数据库。另外,这种思路也影响到了企业级数据模式。同时,这种模式意味着多份数据,但是,如果你想获得微服务带来的好处,每个服务独有一个数据库是必须的,因为这种架构需要这种松耦合。下面的图演示示例应用数据库架构。

    5.png
      每种服务都有自己的数据库,另外,每种服务可以用更适合自己的数据库类型,也被称作多语言一致性架构。比如,驾驶员管理(发现哪个驾驶员更靠近乘客),必须使用支持地理信息查询的数据库。

      表面上看来,微服务架构模式有点像SOA,他们都由多个服务构成。但是,可以从另外一个角度看此问题,微服务架构模式是一个不包含Web服务(WS-)和ESB服务的SOA。微服务应用乐于采用简单轻量级协议,比如REST,而不是WS-,在微服务内部避免使用ESB以及ESB类似功能。微服务架构模式也拒绝使用canonical schema等SOA概念。

      微服务架构的好处

      微服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题。在功能不变的情况下,应用被分解为多个可管理的分支或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。微服务架构模式给采用单体式编码方式很难实现的功能提供了模块化的解决方案,由此,单个服务很容易开发、理解和维护。

      第二,这种架构使得每个服务都可以有专门开发团队来开发。开发者可以自由选择开发技术,提供API服务。当然,许多公司试图避免混乱,只提供某些技术选择。然后,这种自由意味着开发者不需要被迫使用某项目开始时采用的过时技术,他们可以选择现在的技术。甚至于,因为服务都是相对简单,即使用现在技术重写以前代码也不是很困难的事情。

      第三,微服务架构模式是每个微服务独立的部署。开发者不再需要协调其它服务部署对本服务的影响。这种改变可以加快部署速度。UI团队可以采用AB测试,快速的部署变化。微服务架构模式使得持续化部署成为可能。

      最后,微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足需求的规模。甚至于,你可以使用更适合于服务资源需求的硬件。比如,你可以在EC2 Compute Optimized instances上部署CPU敏感的服务,而在EC2 memory-optimized instances上部署内存数据库。

      微服务架构的不足

      Fred Brooks在30年前写道,“there are no silver bullets”,像任何其它科技一样,微服务架构也有不足。其中一个跟他的名字类似,『微服务』强调了服务大小,实际上,有一些开发者鼓吹建立稍微大一些的,10-100 LOC服务组。尽管小服务更乐于被采用,但是不要忘了这只是终端的选择而不是最终的目的。微服务的目的是有效的拆分应用,实现敏捷开发和部署。

      另外一个主要的不足是,微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在RPC或者消息传递之间选择并完成进程间通讯机制。更甚于,他们必须写代码来处理消息传递中速度过慢或者不可用等局部失效问题。当然这并不是什么难事,但相对于单体式应用中通过语言层级的方法或者进程调用,微服务下这种技术显得更复杂一些。

      另外一个关于微服务的挑战来自于分区的数据库架构。商业交易中同时给多个业务分主体更新消息很普遍。这种交易对于单体式应用来说很容易,因为只有一个数据库。在微服务架构应用中,需要更新不同服务所使用的不同的数据库。使用分布式交易并不一定是好的选择,不仅仅是因为CAP理论,还因为今天高扩展性的NoSQL数据库和消息传递中间件并不支持这一需求。最终你不得不使用一个最终一致性的方法,从而对开发者提出了更高的要求和挑战。

      测试一个基于微服务架构的应用也是很复杂的任务。比如,采用流行的Spring Boot架构,对一个单体式web应用,测试它的REST API,是很容易的事情。反过来,同样的服务测试需要启动和它有关的所有服务(至少需要这些服务的stubs)。再重申一次,不能低估了采用微服务架构带来的复杂性。

      另外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。比如,假设你在完成一个案例,需要修改服务A、B、C,而A依赖B,B依赖C。在单体式应用中,你只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务C,然后是B,最后才是A,幸运的是,许多改变一般只影响一个服务,而需要协调多服务的改变很少。

      部署一个微服务应用也很复杂,一个分布式应用只需要简单在复杂均衡器后面部署各自的服务器就好了。每个应用实例是需要配置诸如数据库和消息中间件等基础服务。相对比,一个微服务应用一般由大批服务构成。例如,根据Adrian Cockcroft,Hailo有160个不同服务构成,NetFlix有大约600个服务。每个服务都有多个实例。这就造成许多需要配置、部署、扩展和监控的部分,除此之外,你还需要完成一个服务发现机制(后续文章中发表),以用来发现与它通讯服务的地址(包括服务器地址和端口)。传统的解决问题办法不能用于解决这么复杂的问题。接续而来,成功部署一个微服务应用需要开发者有足够的控制部署方法,并高度自动化。

      一种自动化方法是使用PaaS服务,例如Cloud Foundry。PaaS给开发者提供一个部署和管理微服务的简单方法,它把所有这些问题都打包内置解决了。同时,配置PaaS的系统和网络专家可以采用最佳实践和策略来简化这些问题。另外一个自动部署微服务应用的方法是开发对于你来说最基础的PaaS系统。一个典型的开始点是使用一个集群化方案,比如配合Docker使用Mesos或者Kubernetes。后面的系列我们会看看如何基于软件部署方法例如NGINX,可以方便的在微服务层面提供缓存、权限控制、API统计和监控。

      总结

      构建复杂的应用真的是非常困难。单体式的架构更适合轻量级的简单应用。如果你用它来开发复杂应用,那真的会很糟糕。微服务架构模式可以用来构建复杂应用,当然,这种架构模型也有自己的缺点和挑战。

      在后续的博客中,我会深入探索微服务架构模式,并讨论诸如服务发现、服务部署选择和如何分解一个分布式应用为多个服务的策略。

      待续。。。

    展开全文
  • 微服微服微服务.rar

    2021-01-24 21:54:59
    springcloud微服务航班查询系统
  • Spring Cloud微服实战pdf

    2019-01-23 14:43:54
    Spring Cloud微服实战pdf
  • 微服部分大体框架

    2018-10-26 11:08:37
    微服+前后端分离编程实用框架,可减少在搭建环境时用的时间。
  • 微服私访UI素材

    2017-08-27 19:11:08
    微服私访App所有UI,包含尺寸标注
  • 基于Dubbox的微服实战

    2020-07-10 16:46:33
    基于Dubbox的微服实战,Dubbox和Zookerper在项目中结合SSM完成的一套实战项目,是一个学习Dubbox的视频资料
  • 微服架构必备书籍

    2018-05-15 20:38:42
    此书讲解了当前比较流行的微服架构 其中包括spring boot ,spring cloud , dubbo等知识,并且有详细的项目讲解
  • 微服架构务之旅

    2017-07-18 16:58:03
    微服架构务之旅
  • 微服物概述

    2019-09-23 22:45:33
    1.微服物框架概述 微服物是当前软件开发领域的热点,什么是微服物框架呢?与传统的单体应用有什么区别呢?解决了哪些问题?又带来哪些问题呢? 1.2.单体应用存在的问题 复杂度高。单个项目模块众多,代码质量...

    1.微服物框架概述

    微服物是当前软件开发领域的热点,什么是微服物框架呢?与传统的单体应用有什么区别呢?解决了哪些问题?又带来哪些问题呢?

    1.2.单体应用存在的问题

    • 复杂度高。单个项目模块众多,代码质量参差不齐,每次对代码的改动都要做整体测试。
    • 技术债务。随着时间推移,需求变更和人员更迭会逐渐形成应用程序的技术债务,并越积越多。
    • 可靠性差。单个功能出现问题会影响整个应用系统。
    • 扩展有限。单体作为一个整体应用,无法根据业务模块进行伸缩。
    • 技术老旧。引入新技术困难。
    • 部署频率低。单体应用中每次功能变更或BUG修复都会导致重新部署整个应用。

    1.3.什么是微服物?

    是一种架构风格,是一种将单一应用程序开发为一组小型服务的方法,具备以下特征:

    a、每个微服务可独立运行在自己的进程里。

     b、单个微服务启动较快:单个微服务代码量较少,所以启动会比较快。

     c、局部修改容易部署:一般来说对某个微服务进行修改,只需要重新部署这个服务即可。

     d、技术栈不受限:在为服务架构中,可以结合项目业务及团队的特点,合理的选择技术栈。例如部分业务用关系型数据库,部分业务用NoSQL,部分用Java开发,部分用N​odeJS开发。

     e、按需伸缩:可根据需求实现细粒度的扩展。例如,系统中某个微服务遇到了瓶颈,可结合这个微服务的业务特点增加内存、CPU或增加集群节点等。

    总结:每一个单个微服物,具备一个单体应用的所有特性,就是一个单独的单体应用。

    1.4 微服务面临的挑战

     a、运维要求较高:更多的服务意味着更多的运维投入。

     b、分布式固有的复杂性:使用为服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。

      c、接口调整成本高:微服务之间通过接口进行通信。如果修改某个一个微服务的API,可能所有使用了该进口的微服务都需要做调整。

     d、重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候可能各个服务都会开发这一功能。

    1.5 微服务设计原则

       和数据库设计中的N范式一样,微服务也有一定的设计原则:

       a、单一职责原则:一个单元(类、方法或这服务等)只应该关注整个系统功能中单独、有界限的一部分。单一职责原则可以帮助我们更优雅的开发、更敏捷的交付。

       b、服务自治原则:每个微服务应具备独立的业务能力、依赖与运行环境。在微服务架构中,服务是独立的业务单元,应该与其他服务高度解耦。每个微服务从开发、测试、构建、部​署,都应该独立运行。

       c、轻量级通信机制:应具备体量较轻,跨语言、跨平台。重用的协议有REST、AMQP、STOMP、MQTT等。

       d、微服务力度:这块是个难点,也是争论的焦点。应当使用合理的粒度划分微服务,而不是一味的把服务做小。代码量的多少不能作为微服务划分的依据。 在设计阶段就应该确定其边界,微服务之间应保持相对独立并保持松耦合。

     

       e、微服务演进:微服务的演进是一个循序渐进的过程,会根据业务的变化进行重构,甚至重新划分,从而让架构更加合理。

    展开全文
  • duboo + zookeeper 微服架构demo例子,spring springmvc mybatis shiro 全部用到,完全可以用于开发的一个微服架构例子,值得学习。
  • 基于Dubbox的微服实战学习3——使用Dubbox+SpringBoot实现微服架构0.问题1.依赖环境介绍2.运行原理介绍3.环境搭建补充4.基础服务模块介绍5.提供者服务实现6.消费者服务实现7.抢购网设计介绍0.问题1.压缩包中的jar包...
    基于Dubbox的微服实战学习3——使用Dubbox+SpringBoot实现微服架构
    0.问题
    1.依赖环境介绍
    2.运行原理介绍
    3.环境搭建补充
    4.基础服务模块介绍
    5.提供者服务实现
    6.消费者服务实现

    7.抢购网设计介绍



    0.问题

    问题1.压缩包中的jar包,在部分公网环境下,无法使用maven以来直接获取

    压缩包中的jar包,在部分公网环境下,无法使用maven以来直接获取。如出现此种情况,使用者可以将相关jar包,使用nexus直接上传至私服。还有一种解决方法。

    jar包位置是:E:\spring-boot-starter-dubbo-1.0.0.jar

    E:\>mvn install:install-file -Dfile=.\spring-boot-starter-dubbo-1.0.0.jar -Dgrou
    pId=com.alibaba.hl -DartifactId=spring-boot-starter-dubbo -Dversion=1.0.0 -Dpack
    ageing=jar
    E:\
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-install-plugin:2.4:install-file (default-cli) @ standalone-pom
    ---
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.952 s
    [INFO] Finished at: 2018-06-08T15:22:33+08:00
    [INFO] Final Memory: 8M/113M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4
    :install-file (default-cli) on project standalone-pom: The artifact information
    is incomplete or not valid:
    [ERROR]   [0]  'packaging' is missing.
    [ERROR]
    [ERROR] -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
    ch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please rea
    d the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionE
    xception
    E:\>mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=
    .\spring-boot-starter-dubbo-1.0.0.jar -DgroupId=com.alibaba.hl -DartifactId=spri
    ng-boot-starter-dubbo -Dversion=1.0.0 -Dpackageing=jar
    E:\
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-install-plugin:2.5.2:install-file (default-cli) @ standalone-po
    m ---
    [INFO] Installing E:\spring-boot-starter-dubbo-1.0.0.jar to E:\local\repo\com\al
    ibaba\hl\spring-boot-starter-dubbo\1.0.0\spring-boot-starter-dubbo-1.0.0.jar
    [INFO] Installing C:\Users\ADMINI~1\AppData\Local\Temp\mvninstall328720955820700
    6406.pom to E:\local\repo\com\alibaba\hl\spring-boot-starter-dubbo\1.0.0\spring-
    boot-starter-dubbo-1.0.0.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.602 s
    [INFO] Finished at: 2018-06-08T15:26:15+08:00
    [INFO] Final Memory: 7M/114M
    [INFO] ------------------------------------------------------------------------
    
    E:\>

    第一条命令不能执行,执行第二条命令。

    错误解决方法http://maven.apache.org/plugins/maven-install-plugin/examples/custom-pom-installation.html


    2.“java.lang.IllegalStateException: Zookeeper is not connected yet!”

    运行shop-user-provider报错“java.lang.IllegalStateException: Zookeeper is not connected yet!

    环境描述:

    我把一个台式机当服务器。台式机是连接的有线。ip地址是192.168.32.135。
    台式机上安装了虚拟机,是网桥模式,ip地址是192.168.32.134。虚拟机就是安装的大数据的dockerfile-master.
    我用笔记本可以连接192.168.32.134。浏览器输入mq.local.com,da.local.com,都可以访问。数据库访问134,也可以。redis也可以方法134。

    但是我运行shop-user-provider报错“java.lang.IllegalStateException: Zookeeper is not connected yet!”

    项目shop-user-provider的application.properties

    spring.datasource.url=jdbc:mysql://192.168.32.134:3306/qg_user_db?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    mybatis.mapper-locations=classpath:mapper/*Mapper.xml
    spring.dubbo.appname=spring-boot-starter-dubbo-user-provider
    #spring.dubbo.registry=zookeeper://192.168.32.134:2181
    spring.dubbo.registry=zookeeper://192.168.32.134:2181
    spring.dubbo.protocol=dubbo
    spring.dubbo.port=20802
    server.port=8092
    
    #Redis数据库索引(默认为0)
    spring.redis.database=0
    #Redis服务器地址
    spring.redis.host=192.168.32.134
    #Redis服务器连接端口
    spring.redis.port=6379
    #Redis服务器连接密码(默认为空)
    spring.redis.user=root
    spring.redis.password=123456
    #连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=8
    #连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    #连接池中的最大空闲连接
    spring.redis.pool.max-idle=8
    #连接池中的最小空闲连接
    spring.redis.pool.min-idle=0
    #连接超时时间(毫秒)
    spring.redis.timeout=3000

    项目shop-user-consumer的applicaiton.properties

    spring.datasource.url=jdbc:mysql://192.168.32.134:3306/qg_user_db?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    mybatis.mapper-locations=classpath:mapper/*Mapper.xml
    #dubbo
    spring.dubbo.appname=spring-boot-starter-dubbo-user-consumer
    spring.dubbo.registry=zookeeper://192.168.32.134:2181
    #spring.dubbo.registry=zookeeper://192.168.10.5:2181
    spring.dubbo.protocol=dubbo
    spring.dubbo.port=20807
    server.port=8082
    
    
    #Redis数据库索引(默认为0)
    spring.redis.database=0
    #Redis服务器地址
    spring.redis.host=192.168.32.134
    #Redis服务器连接端口
    spring.redis.port=6379
    #Redis服务器连接密码(默认为空)
    spring.redis.user=root
    spring.redis.password=123456
    #连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=8
    #连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    #连接池中的最大空闲连接
    spring.redis.pool.max-idle=8
    #连接池中的最小空闲连接
    spring.redis.pool.min-idle=0
    #连接超时时间(毫秒)
    spring.redis.timeout=3000

    原因:zookeeper的地址没有映射出去。端口2181确定有没有映射出去。

    在shipyard可视化工具里面


    解决方法:

    run.sh zookeeper可以重新运行一遍。

    root@ubuntu:/home/docker/tools/dokerfiles-master/env10.1# ./run.sh zookeeper
    env10_5_Zookeeper01
    env10_5_Zookeeper01
    acdd5ed7e25a7a799c1c863acd880b060d9623b57761733ced60d733d37c784c

    3.服务注册不到dubbo中。

    问题描述:解决了问题2,项目运行不报错了。但是在浏览器输入da.local.com。发现服务没有刚才运行的几个项目。

    原因:确定dubbo 里有指定zookeeper地址吗

    解决方法:

    dubbo的dubbo.properties原来是

    [root@966f2b7ce1b0 WEB-INF]# cat dubbo.properties
    dubbo.registry.address=zookeeper://192.168.10.5:2181
    #dubbo.registry.username=root
    #dubbo.registry.password=root
    dubbo.registry.protocol=zookeeper
    dubbo.admin.root.password=root

    改一下dubbo.register.address=zookeeper:192.168.32.134:2181

    改地址应该填写:zookeeper容器所在宿主机的IP还有你映射出来的端口

    改完后,需要重启tomcat


    1.依赖环境介绍

    Dubbo
    http://dubbo.io/
    Dubbox
    https://github.com/dangdangdotcom/dubbox


    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成,
    Dubbox是当当网对Dubbo的升级和改良
    依赖环境:
    JDK,WEB容器(Tomcat),Zookeeper环境,Maven环境。


    2.运行原理介绍

    Provider:暴露服务的服务提供方
    Consumer:调用远程服务的服务消费方
    Registry:提供注册与调用服务的注册中心
    Monitor:统计服务的调用次数和调用时间的监控中心
    Container:服务运行容器



    3.环境搭建补充

    Zookeeper
     安装,启动
     注意:把conf/zoo_sample.cfg改成zoo.cfg
    Dubbox
     安装
     编译 mvn install -Dmaven.test.skip=true
     修改dubbo.properties配置文件,指向zookeeper地址
     启动


    4.基础服务模块介绍

    Dubbox实现提供者服务
    Dubbox实现消费者服务
    cn.bdqn.vo.TokenVO :用户凭据


    5.提供者服务实现



    zookeeper://192.168.10.5:2181
    da.local.com: http://192.168.10.203:8080
    mq.local.com: http://192.168.10.6:8161




    spring.datasource.url=jdbc:mysql://192.168.32.251:3306/qg_user_db?useUnicode=true
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    mybatis.mapper-location=classpath:mapper/*Mapper.xml


    spring.dubbo.appname=spring-boot-starter-dubbo-user-consumer


    #zookeeper的地址
    spring.dubbo.registry=zookeeper://192.168.9.150:2181
    spring.dubbo.protocol=dubbo
    spring.dubbo.port=20807
    server.port=8082


    spring.redis.database=0
    #redis服务器地址
    spring.redis.host=192.168.9.150
    spring.redis.port=6379
    spring.redis.user=root
    spring.redis.password=123456
    spring.redis.pool.max-active=8
    spring.redis.pool.max-wait=-1
    展开全文
  • 微服架构务之旅(spring cloud)
  • 微服架构简介

    2019-05-30 11:52:31
    微服架构简介 2018年10月23日 10:12:07 joely1 阅读数:683 什么是微服务? 专业解释: 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个...

    微服架构简介
    2018年10月23日 10:12:07 joely1 阅读数:683
    什么是微服务?

    专业解释:

    微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

    微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。、

    通俗解释:

    a 、一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可)

    b、独立的进程(java的tomcat,nodejs等)

    c、轻量级的通信(不是soap,是http协议)

    d、基于业务能力(类似用户服务,商品服务等等)

    e、独立部署(迭代速度快)

    f、无集中式管理(无须统一技术栈,可以根据不同的服务或者团队进行灵活选择)

    微服的利与弊:

    利:强模块边界 。(模块化的演化过程:类–>组件/类库(sdk)–>服务(service),方式越来越灵活)。可独立部署。技术多样性

    弊:分布式复杂性。最终一致性。(各个服务的团队,数据也是分散式治理,会出现不一致的问题)运维复杂性。测试复杂性。

    企业什么时候引入微服?

    从生产力和系统复杂性以及各方面综合考虑,一开始,系统复杂度不高,又在商业模式验证过程中,业务简单,用单体服务效率最高。随着公司生产力提高,业务越来越复杂,这时候可以考虑微服来提升效率。但这个转化点是需要架构师进行各方面的权衡,就个人经验来说,团队上百人,采用微服就很有必要了。

    常用的微服架构

    Spring Boot、Spring Cloud、Dubbo

    什么是Spring Boot
    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架(不知道这样比喻是否合适)。

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。Spring Boot的核心思想就是约定大于配置,多数Spring Boot应用只需要很少的Spring配置。采用Spring Boot可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。

    Spring Cloud都做了哪些事
    Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

    以下为Spring Cloud的核心功能:

    分布式/版本化配置
    服务注册和发现
    路由
    服务和服务之间的调用
    负载均衡
    断路器
    分布式消息传递
    我们再来看一张图:

    在这里插入图片描述

    通过这张图,我们来了解一下各组件配置使用运行流程:

    1、请求统一通过API网关(Zuul)来访问内部服务.
    2、网关接收到请求后,从注册中心(Eureka)获取可用服务
    3、由Ribbon进行均衡负载后,分发到后端具体实例
    4、微服务之间通过Feign进行通信处理业务
    5、Hystrix负责处理服务超时熔断
    6、Turbine监控服务间的调用和熔断相关指标

    Spring Cloud体系介绍
    上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架!

    Spring Cloud 工具框架

    1、Spring Cloud Config 配置中心,利用git集中管理程序的配置。
    2、Spring Cloud Netflix 集成众多Netflix的开源软件
    3、Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化
    4、Spring Cloud for Cloud Foundry 利用Pivotal Cloudfoundry集成你的应用程序
    5、Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。
    6、Spring Cloud Cluster 基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举和平民状态模式的抽象和实现。
    7、Spring Cloud Consul 基于Hashicorp Consul实现的服务发现和配置管理。
    8、Spring Cloud Security 在Zuul代理中为OAuth2 rest客户端和认证头转发提供负载均衡
    9、Spring Cloud Sleuth SpringCloud应用的分布式追踪系统,和Zipkin,HTrace,ELK兼容。
    10、Spring Cloud Data Flow 一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。
    11、Spring Cloud Stream 基于Redis,Rabbit,Kafka实现的消息微服务,简单声明模型用以在Spring Cloud应用中收发消息。
    12、Spring Cloud Stream App Starters 基于Spring Boot为外部系统提供spring的集成
    13、Spring Cloud Task 短生命周期的微服务,为SpringBooot应用简单声明添加功能和非功能特性。
    14、Spring Cloud Task App Starters
    15、Spring Cloud Zookeeper 服务发现和配置管理基于Apache Zookeeper。
    16、Spring Cloud for Amazon Web Services 快速和亚马逊网络服务集成。
    17、Spring Cloud Connectors 便于PaaS应用在各种平台上连接到后端像数据库和消息经纪服务。
    18、Spring Cloud Starters (项目已经终止并且在Angel.SR2后的版本和其他项目合并)
    19、Spring Cloud CLI 插件用Groovy快速的创建Spring Cloud组件应用。

    架构演化的步骤
    在确定使用Spring Boot/Cloud这套技术栈进行微服务改造之前,先梳理平台的服务,对不同的服务进行分类,以确认演化的节奏。
    先让团队熟悉Spring Boot技术,并且优先在基础服务上进行技术改造,推动改动后的项目投产上线
    当团队熟悉Spring Boot之后,再推进使用Spring Cloud对原有的项目进行改造。
    在进行微服务改造过程中,优先应用于新业务系统,前期可以只是少量的项目进行了微服务化改造,随着大家对技术的熟悉度增加,可以加快加大微服务改造的范围
    传统项目和微服务项目共存是一个很常见的情况,除非公司业务有大的变化,不建议直接迁移核心项目。
    10个常用各spring cloud组建介绍(来源:https://www.jianshu.com/p/7468643ead77)

    spring cloud config

    远程配置服务。
    远程配置是每个都必不可少的中间件,远程配置的特点一般需要:多节点主备、配置化、动态修改、配置本地化缓存、动态修改的实时推送等。
    config允许配置文件放在git上或者svn上,和spring boot的集成非常容易,但是缺点就是修改了git上的配置以后,只能一个一个的请求每个service的接口,让他们去更新配置,没有修改配置的推送消息。而且,如果要根据配置文件的修改,做一些重新初始化操作的话(如线程池的容量变化等),会需要一些work around的方法,所以建议如果有其他方案,不建议选择spring cloud config。
    spring cloud bus

    事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化。经常与Spring Cloud Config联合使用。
    spring cloud config本身不能向注册过来的服务提供实时更新的推送。比如我们配置放在了git上,那么当修改github上配置内容的时候,最多可以配置webhook到一台config-server上,但是config-server自己不会将配置更新实时推送到各个服务上。
    bus的作用就是将大家链接在一条总线上,这条线上的所有server共享状态,当webhook到bus上的某一台server的时候,其他server也会收到相同的hook状态。
    但是bus的使用需要依赖于MQ,bus直接继承了RabbitMq & kafka,只需要在spring中直接配置地址即可,但是对于其他类型的MQ,就需要一些手动配置。
    最大的问题还是,如果仅仅因为spring cloud bus而让自己的系统引入MQ,显然会有些得不偿失。我理解系统应该在满足现有业务需求的基础上,越简单越好,依赖越少链路越短,越能减少出问题的风险。
    eureka

    spring cloud的服务发现组件。这个组件讲起来需要大篇幅,最好和consul一起讲。
    eureka负责服务注册和服务发现,为了高可用,一般需要多个eureka server相互注册,组成集群。Eureka Server的同步遵循着一个非常简单的原则:只要有一条边将节点连接,就可以进行信息传播与同步。
    eureka内部对于注册的service主要通过心跳来监控service是否已经挂掉,默认心跳时间是15s。这就意味着,当一个服务提供方挂掉以后,服务订阅者最长可能30s以后才发现。
    service启动连上eureka之后,会同步一份服务列表到本地缓存,服务注册有更新时,eureka会推送到每个service。
    eureka也会有一些策略防止由于某个服务所在网络的不稳定导致的所有服务心跳停止的雪崩现象。
    eureka自带web页面,在页面上能看到所有的服务注册情况 和 eureka集群状态。
    eureka支持服务自己主动下掉自己,请求service的下列地址,可以让服务从eureka上下掉自己,同时service进程也会自己停掉自己。
    curl -H ‘Accept:application/json’ -X POST localhost:${management.port}/shutdown
    consul

    也是一个服务发现工具,而且自带key-value存储服务、健康检查 和 web页面。
    听起来好像比eureka高大上一些,里面使用了gossip协议和Raft协议,但是他的缺点就是比eureka难维护。
    服务注册是微服务架构的关键节点。所以我们现阶段选择的是eureka,然后远程配置使用的是spring cloud config。如果要上容器和编排的话,会再看具体情况做选择。
    但是,后来发现其实consul提供了官方的docker镜像,直接使用docker-consul集群用户服务发现的话,运维成本会直线下降,后面会考虑把eureka + spring cloud config 换成consul。
    ribbon:

    客户端负载均衡组件。
    服务发现以后,每个service在本地知道自己要调用的服务有多少台机器,机器的ip是什么,端口号是多少,那这个service在本地需要有一个负载均衡策略,为每一次请求选择一台目标机器进行调用,而ribbon做的就是负载均衡策略的选择。
    ribbon提供了多种负载均衡策略,包括BestAvailableRule、AvailabilityFilteringRule、WeightedResponseTimeRule、RetryRule、RoundRobinRule、RandomRule、ZoneAvoidanceRule等,没记错的话,默认是ZoneAvoidanceRule。当然,也可以自定义自己的负载均衡策略,比如被调用服务需要灰度发布或者A/B测试的话,就可以在ribbon这一层做自定义。
    feign

    声明式、模板化的HTTP客户端。
    微服务之间的调用本质还是http请求,如果对于每个请求都需要写请求代码,增加请求参数,同时对请求结果做处理,就会存在大量重复工作,而feign非常优雅的帮助我们解决了这个问题,只需要定义一个interface,fegin就知道http请求的时候参数应该如何设置。
    同时,feign也集成了ribbon,只要在微服务中依赖了ribbon,feign默认会使用ribbon定义的负载均衡策略。
    最重要的是,feign并不是仅仅只能使用在有eureka或者ribbon的微服务系统中,任何系统中,只要涉及到http调用第三方服务,都可以使用feign,帮我们解决http请求的代码重复编写。
    hystrix

    断路器,类似于物理电路图中的断路器。
    正常情况下,当整个服务环境中,某一个服务提供方由于网络原因、数据库原因或者性能原因等,造成响应很慢的话,调用方就有可能短时间内累计大量的请求线程,最终造成调用方down,甚至整个系统崩溃。而加入hystrix之后,如果hystrix发现某个服务的某台机器调用非常缓慢或者多次调用失败,就会短时间内把这条路断掉,所有的请求都不会再发到这台机器上。
    如果某个服务所有的机器都挂了,hystrix会迅速失败,马上返回,保证被调用方不会有大量的线程堆积。
    Feign默认集成了hystrix。
    上面有提到,使用eureka时,当一个服务提供方挂掉以后,服务订阅者最长可能30s以后才知道,那这30s就会出现大量的调用失败。如果在系统里面集成了hystrix,就会马上把挂掉的这台服务提供方断路掉,让请求不再转发到这台机器上,大量减少调用失败。
    hystrix执行断路操作以后,并不表示这条路就永远断了,而是会一定时间间隔内缓慢尝试去请求这条路,如果能请求成功,断路就会恢复。
    有一点需要注意的是hystrix在做断路时,默认所有的调用请求都会放在一个的线程池中进行,线程池的作用很明显,有隔离性。比如gateway,集成了5个子业务系统,可能其中一个系统的调用量非常大,而另外四个系统的调用很小,如果没有线程池的话,显然第一个系统的大量调用会影响到后面四个系统的调用性能。hystrix的线程池和java标准线程池一样,可以配置一些参数:coreSize、maximumSize、maxQueueSize、queueSizeRejectionThreshold、allowMaximumSizeToDivergeFromCoreSize、keepAliveTimeMinutes等,如果某一个子系统的调用量突然激增,超过了线程池的容量,也会迅速失败,直接返回,起到降级和保护系统本身的作用。当然hystrix也支持非线程池的方式,在本地请求线程中做调用,即semaphore模式,官方不建议,除非系统qps真的很大。
    zuul

    是一个网关组件。提供动态路由,监控,弹性,安全等边缘服务的框架。
    zuul主需要简单配置一下properties文件,不需要写具体的代码就可以实现将请求转发到相应的服务上去。
    还可以定制化一些filter做验证、隔离、限流、文件处理等切面,对于网关来说,使用zuul能减少大量的代码。
    不过我没有使用过,不太了解,现在我们的网关主要还是基于feignClient、ribbon、hystrix来实现的。zuul默认也集成了这些组件。有兴趣可以研究研究。
    turbine

    是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况.
    在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。
    turbine提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示.
    Spring Cloud Starters

    spring boot热插拔、提供默认配置、开箱即用的依赖。
    starter 是spring boot框架非常基础的部分。可以自定义starter。
    从上面可看出spring cloud bus、consul和zuul的问题还是比较多的。

    总结:eureka发展到2.x后停止这个版本维护了。下个版本是否还继续维护还不太清楚。

          spring cloud采用的是其于HTTP 的 REST方式。 严格来说,这两种方式各有优劣。虽然从一定程度度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依堂一纸契约,不存在代码级的强依赖,这在强调快速微服务环境下,显得更加合适。这也是dubbo和spring cloud最本质的区别
    
    展开全文
  • 微服 v6.1.1512.1718.zip

    2019-07-15 05:38:04
    微服可以为您提供电脑拨号故障处理、家庭网关无法上网故障处理和网速慢检测等常见的上网故障处理,同时对通过电脑进行的宽带连接拨号错误具有自动拦截告警并帮您处理故障的功能;同时您还能通过该软件快速、便捷的...
  • 微服架构的论述

    2017-11-09 16:48:00
    搭建微服架构 什么是微服架构 简单的说就是将一个整体的应用按照一定的规则拆分成一个个独立的应用,这些独立的应用后面又组合成了一个整体的应用。比如说一个博客系统,我可能包含了发表文章,用户登录,用户...
  • 基于Spring Cloud搭建微服应用;尊敬的各位领导好 众所周知IT领域是一个快速发展与更替的行业随着市场的需求与竞争许多新的技术应运而生满足了对不同业务不同需求的支撑而对于公司而言找到一套适合自身业务支撑的需求...
  • 关于微服的一些资料

    2017-04-04 13:33:34
    微服事务处理 http://eventuate.io/ 微服架构 http://microservices.io
  • 微服的日志归集处理

    2018-09-21 13:26:10
     由于自己的项目不是采用Spring Cloud架构写的,而是用Maven POM的形式来构建自己项目的微服架构。通过把一个微服,用Docker进行独立部署。测试过程中,发送一个问题,就是一个用户请求过来,无法快速定位,用户是...
  • 微服部分小结

    2018-10-27 08:48:34
    微服部分小结 改项目: 1.将项目改为SpringBoot+MyBatis框架,前后端分离项目; 2.将java部分后台代码分为三部分,分别为: 公用部分(common);(此部分建普通maven项目即可) common-util 常用工具类 common...
  • spring微服务实�_务实

    2020-09-22 00:59:10
    spring微服务实�There are many books, articles and presentations that have influenced the way I approach the web today. Its always been one of my favorite parts of this community: a willingness and ...
  • dubbox 微服环境 一。

    2018-12-24 09:36:22
    dubbox 微服环境1.0 概述  传统架构(b/s): 就是单体架构。一个TOMCAT部署。  微服务架构 (b/s) : 将控制器。service 等分布式开发, 隔离部署。通过通信中间件来完成多个服务器之间的通信。  当前主流微服务...
  • Spring Cloud微服架构之断路器
  • 用Go语言构建微服(包含DDD):开篇欢迎开始Go语言+微服的学习为何是Go语言本系列博客的覆盖范围免费的Go语言学习资源更新频度技术的成长在于日积月累 欢迎开始Go语言+微服的学习 你好! 如果你正在浏览这篇文章,...
  • 当然主流的语言JAVA,.NET的敏捷开发工具比较多的,建议用JAVA的,这是出于市场上的技术人员出发,JAVA的技术人员在国内比.net要更多,更容易招聘,我现在推荐一款JSaas敏捷开发平台工具体(包括微服服架构平台),...
  • Spring Cloud微服架构之消费者调用服务
  • Spring Cloud微服架构之分布式配置中心
  • 1. 什么是事务 由一组操作构成的可靠、 独立的工作单元。 事务具有以下特点: Atomicity(原子性) ...而在微服或者SOA的场景下,我们的本地事物就不作用了。对于分布式系统 Google 提出 CAP定理...
  • 微服架构为什么需要注册中心,它解决了什么问题? 为什么要用? 管理服务以及服务之间的依赖关系。 eureka:微服服务注册与发现,负载均衡,故障转移的能力。 类似服务:zookeeper+dubbo 高可用的eureka 3种角色: ...
  • 微服事务处理方案(分布式事务处理方案) 1. 什么是事务 由一组操作构成的可靠、 独立的工作单元。 事务具有以下特点: •Atomicity(原子性) •Consistency(一致性) •Isolation(隔离性) •Durability(持久性) 2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,644
精华内容 657
关键字:

微服