1,Java微服务架构的项目组织形式

1.1,微服务项目的依赖关系

在微服务架构中,软件项目背拆分成多个自治的服务,服务之间通过网络协议进行调用,通常使用透明的RPC远程调用。

在Java领域,每个服务上线后,对外输出的接口为一个Jar包。在微服务领域,Jar包被分为一方库、二方库、三方库。

  • 一方库:本服务在JVM进程内依赖的Jar包。
  • 二方库:在服务外通过网络通信或者RPC调用的服务的Jar包。
  • 三方库:所依赖的其他公司或者组织提供的服务或者模块。

1.2,微服务项目的层级目录

Java微服务项目的层级结构一般为:服务导出层、接口层和逻辑实现层。

其中,每个层级的职责和最终的表现形式如下:

  • 服务导出层:最后会打包成一个War包,包含服务的实现Jar包,接口Jar包,以及Web项目导出RPC服务所需要的配置文件等。
  • 服务接口层:包含业务接口、依赖的DTO及需要的枚举类等,最后打包成Jar包,发布到Maven服务器上,也包含在服务导出层的War包中。
  • 服务实现层:包含业务逻辑实现类、依赖的第三方服务的包装类,以及下层数据库访问的DAO类等,最后打包成Jar包,包含在服务导出层的War包中。

Java平台下微服务实现层的架构:

本地服务通过DAO层与数据进行交互。这里使用数据库事务,保证了数据存取的强一致性,业务流程层通过组合本地服务和外部服务来完成业务逻辑的实现,由于远程服务的依赖,因此只能保证数据的最终一致性。

这里有一个反模式,切记永远不要在本地事务中调用远程服务,在这种场景下如果远程服务出现了问题,则会拖长事务,导致应用服务器占用太多的数据库连接,让服务器负载迅速攀升,在严重情况下会压垮数据库。虽然我们要竭力避免这种场景的发生,但是数据库也应该有负载熔断机制。

1.3,微服务项目的持续发布

微服务项目需要实现自动化的持续部署和持续集成的功能,包括:代码管理、自动编译、发布QA、自动化测试、性能测试、准生产部署和测试、生产环境发布等。

2,服务化管理和治理框架的技术选型

SOA服务化和微服务架构已经发展多年,市场上已经有很多成熟的商业和开源产品,我们没必要从头搭建一套服务化管理和治理平台,完全可以基于开源服务化框架进行定制化,以适应我的业务需要。

2.1,远程服务调用(RPC)

JDK RMI

自JDK1.4开始,JDK内置了远程服务调用技术栈,可以帮助开发者创建基于Java到Java的分布式调用架构,一个Java进程内的服务可以调用其他Java进程内的服务,使用JDK内置的序列化和反序列化协议。

RMI是JEE规范中EJB远程调用的基础,然而,JDK内置的RMI服务并没有得到广泛应用,几乎没有哪家公司采用这种方式来构建服务化平台。

原因:

  • RMI采用JDK自带的专用序列化协议,不能跨语言。
  • 使用了底层的网络协议,不如基于文本的HTTP可读,也不如HTTP被广泛认可。
  • 开源框架的飞速发展,严重削弱了JDK资深技术的流行程度。

Hessian&Burlap

Hessian&Burlap都是Caucho公司提供的开源的远程调用协议,基于HTTP传输,防火墙通常会设置在某个端口上以允许特定的HTTP通信。其中,Hession将对象序列化成与语言无关的二进制协议;而Burlap将对象序列化成语语言无关的XML数据,数据是可读的。两者都是与语言无关的,可以在多种语言的服务中互相调用。

Hessian及Burlap都适合传输较小的对象,对较大、复杂的对象,无论是在序列化方式上还是在传输通道上都没有RMI有优势。但是由于服务化架构中大量的服务调用都是大规模、高并发的短小请求,因此,Hessian和Burlap协议在服务化架构中得到了广泛应用。

Spring HTTP Invoker

Spring HTTP Invoker重用了JDK内置的对象序列化技术传输对象,这与RMI的原理一致,但是,它通过HTTP通道传输数据,在效率上应该略低于RMI,并且由于使用了JDK内置的序列化机制,因此也是不能跨语言的。

2.2,服务化

Dubbo

Dubbo是阿里巴巴开源的一个分布式服务框架,不但提供了高性能和透明化的RPC远程服务调用,还提供了基本的服务监控、服务治理和服务调度等能力。它默认支持多种序列化协议和通信编码协议,默认使用Dubbo协议传输Hessian序列化的数据。Dubbo使用ZooKeeper作为注册中心来注册和发现服务,并通过客户端负载均衡来路由请求,负载均衡算法包括:随机、轮询、最少活跃调用数、一致性哈希等。它基于Java语言,不能与其他语言的服务化平台互相调用。Dubbo服务框架在互联网企业得到了广泛应用,几乎每个中小型公司都开始使用Dubbo完成服务化的使命。

然而,Dubbo也有如下缺点:

  • Dubbo开发的较早,近些年已经没有开发者维护和升级。
  • 早期留下的Bug一直没有得到修复,需要使用者自己发现和修复。
  • Dubbo没有经过全面优化,在服务量到达一定程度时,会出现通知系统携带过多的冗余信息,在极端情况下会导致网络广播风暴。
  • Dubbo服务框架是SOA服务化时代的产物,对微服务化提出的各种概念如熔断、限流、服务隔离等没有做精细的设计和实现。
  • Dubbo的监控和服务治理模块比较简单,难以满足复杂业务的需求。

HSF

HSF是淘宝内部大闺蜜们使用的一款高性能服务框架,也是一款为企业级互联网框架量身定制的分布式服务框架。HSF以高性能网络通信框架为基础,提供了诸如服务发布与注册、服务调用、服务路由、服务鉴权、服务限流、服务降级、服务调用和链路跟踪等一系列久经考验的功能特性。

HSF与Dubbo均来自阿里巴巴,但是并不开源,只在阿里巴巴内部使用,在外部很少有相关资料,HSF据说性能要比Dubbo高,但是业务系统耦合性重,无法抽取并开源。

Thrift

Thrift是FaceBook实现的一种高性能并且支持多语言的远程服务调用框架,由Apache开源。它采用中间接口描述语言定义并创建服务,支持跨语言服务开发和调用,并且包含中间的接口描述语言与代码生成和转换工具,支持包括C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk等在内的流行语言,传输数据时采用二进制序列化格式,相对于JDK本身的序列化、XML和JSON等,尺寸更小,在互联网高并发、海量请求和跨语言环境下更有优势。

AXIS

Axis是Apache Web Service项目中的子项目,最初起源于IBM的“SOAP4J”,应该属于最早一批用于构建基于Web Service应用的框架。

Web Service使用SOAP协议,而SOAP协议通常使用HTTP传输XML格式的数据,因为性能低下,而且SOAP协议有复杂和臃肿等缺点,所以现在几乎没有企业采用这种框架做服务了。

Mule ESB

Mule ESB是MuleSoft公司出品的基于Java语言的企业服务总线产品,它可以把多个复杂的异构系统通过总线模式集成在一起,并让它们之间可以相互通信,包括JMS、Web Service、连接数据库的JDBC、HTTP和历史遗留系统等。

它的优点是可以把现有的不同技术栈的历史遗留系统与新增的服务化系统通过总线进行串联和编排,来满足日新月异的业务功能需求。

2.3,微服务

SpringBoot

通过使用SpringBoot可以很容易地创建独立的、具有高品质的基于Spring的应用程序,基于SpringBoot创建的应用可以随时随地启动和运行,一般只需要较少的配置和搭建环境的工作量。

在JEE时代,企业级开发涉及的通用功能被提取到了容器层实现,例如:Tomcat Web容器负责管理服务的启动、停止、监控、配置和日志等,应用开发人员只要按照规范将应用打包成War,并发布到Tomcat Web容器中,就可以对外提供服务了,这一时代的应用包含在容器内的。

SpringBoot的思路正好相反,它将容器嵌入自启动的Jar包中,在SpringBoot应用启动时,内部启动嵌入的容器,例如:Tomcat、Jetty和Netty等,然后通过内嵌的服务将应用中提供的服务暴露。

SpringBoot这种设计在微服务架构下有如下明显的优点:

  • 可以创建独立、自启动的应用程序。
  • 不需要构建War包并发布到容器中,构建和维护War包、容器的配置和管理也是需要成本的。
  • 通过Maven的定制化标签,可以快速创建SpringBoot的应用程序。
  • 可以最大化地自动化配置Spring,而不需要人工配置各项参数。
  • 提供了产品化特点,例如:性能分析、健康检查和外部化配置。
  • 全程没有XML配置,也不需要代码生成。

Netflix

Netflix由Netflix公司开发且合并到SpringCloud项目中,主要提供了服务发现、断路器和监控、智能路由、客户端负载均衡、易用的REST客户端等服务化必需的功能。

其中Hystrix框架提供了微服务架构所需的容错机制的解决方案和设计模式。Hystrix大大简化了微服务下容错机制的实现,包括服务分组和隔离、熔断和防止级联失败、限流机制、失效转移机制和监控机制等。

SpringCloud Netflix

SpringCloud Netflix集成了SpringBoot对微服务敏捷启动和发布的功能,以及Netflix提供的微服务化管理和治理能力,成为一个完美的微服务解决方案。在SpringCloud Netflix平台下,开发人员通过几个简单的注解配置即可完成一个大规模分布式系统的发布工作。

SpringCloud Netflix 包括服务发现组件Eureka、容错性组件Hystrix、只能路由组件Zuul和客户端负载均衡组件Ribbon。

Netflix中的交互流程如下:

  • 服务在Eureka服务器实力上注册。
  • Zuul作为一个特殊的服务在Eureka上注册并发现服务。
  • Zuul作为网关,将发现的服务导出给PC网站、App和开放平台使用。
  • RestTemplace和FeignClient使用简单的服务调用的方法调用服务1、服务2等。

Netflix的特点:

  • 服务在Eureka实例中注册,由Spring管理的Bean来发现和调用。
  • 通过配置的方式可以启动嵌入式的Eureka服务器。
  • Feign客户端通过声明方式即可导入服务代理。
  • Zuul使用Ribbon服务实现客户端的负载均衡。
  • 通过声明的方式即可插入Hystrix的客户端。
  • 通过配置的方式即可启动Hystrix面板的服务器。
  • 在Spring环境中可以直接配置Netflix的组件。
  • Zuul可以自动注册过滤器和路由器,形成一个反向代理服务器。
  • Hystrix面板可以对服务的状态进行监控,并提出容错机制。

SpringCloud Netflix是当前最流行的微服务架构的落地和实现,发布的时间较晚,理念较新。

分布式:Java体系中的分布式相关推荐

  1. java分布式和集成式_【分布式java应用笔记】分布式与soa

    SCA 在xml中composite是SCA定义的最小部署单位.每个xml文件的根元素必须为composite,在composite下可以有多个component及service标签 Componen ...

  2. 非常不错的文章,囊括啦高性能、高可用的分布式架构体系所有名词

    在2B企业服务.云计算.移动互联网领域,专业的云平台服务里,分布式技术为支撑平台正常运作关键性技术.从商业利润和运维成本角度出发,千方百计榨干服务器的每一分性能很大程度上影响着网站的商业价值,因此对性 ...

  3. RCL0923分布式光伏群调群控终端装置-即光伏协议转换器(完成逆变器数据采集协议规约转换功能)+台区智能融合终端SCU实现分布式光伏群调群控-分布式光伏可观可测可控一键群调,一键群控方案介绍

    RCL0923分布式光伏群调群控装置-即光伏协议转换器(完成逆变器数据采集协议规约转换功能)+台区智能融合终端SCU实现分布式光伏群调群控-分布式光伏可观可测可控一键群调,一键群控方案介绍 一.分布式 ...

  4. Java企业级应用架构设计中的分布式结构

    Java企业级应用架构设计中的分布式结构 2010-12-24 13:54:12|  分类:默认分类 |  标签:|字号大中小 订阅 Java企业级应用架构设计是每个Java开发者不必学的知识,本文将 ...

  5. Spring Cloud中的分布式组件五花八门,我到底该怎么学?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/zwx900102/article/ details/121727985 分布式架构的演进 在软件行业,一个应用服务随着功能越来 ...

  6. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookee ...

  7. Java 多线程爬虫及分布式爬虫架构探索

    维护待采集的 URL 多线程爬虫程序就不能像单线程那样,每个线程独自维护这自己的待采集 URL,如果这样的话,那么每个线程采集的网页将是一样的,你这就不是多线程采集啦,你这是将一个页面采集的多次.基于 ...

  8. Java程序员总结分布式架构,你又了解多少呢?

    进入十二月,最火热的话题与期待的日子自然是双十二狂欢购物节了,作为程序员的你除了要清空自己的购物车之外,最关心的是不是双十二架构技术是如何承受亿级用户流量的冲击,又是如何在分布式架构中实现单点登陆,形 ...

  9. 分布式服务框架 Zookeeper — 管理分布式环境中的数据

    FROM: http://www.superwu.cn/2014/11/26/1461 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Z ...

最新文章

  1. python安装不上pyinstaller_记PyInstaller安装过程及问题解决
  2. cisco vrrp
  3. Java多线程之一:进程与线程
  4. 开机出现GRUB error22的解决办法
  5. boost--windows平台下针对VS的简单编译
  6. 使用新操作码在比特币现金上进行首次原子竞猜
  7. 使用ASP.Net Forms模式实现WebService身份验证 (转)
  8. linux信号处理编程实验报告,实验二进程通信-Linux实验报告
  9. Word 2007~2010手动双面打印设置
  10. 单片机音乐倒数计时器c语言,音乐倒数计时器单片机课程设计报告
  11. 第17期基于SSM爱家房屋租赁管理系统
  12. nali for win golang版, 显示ip 的小工具
  13. 中国实业能成为怎样的互联网公司
  14. java添加java_home环境变量_如何正确设置jdk环境变量JAVA_HOME?
  15. S3E:用于协作SLAM的大规模多模态数据集
  16. 语义计算、知识图谱与智能问答(医药常识问答实例)
  17. 一起走过的日子.大学本科和同学拍的DV,还有全家福~
  18. 【游戏客户端】如何实现环形进度条
  19. 关于德鲁伊数据源配置的记录
  20. APP的多语言设计我们可以做点什么?

热门文章

  1. 操作系统学习常见疑惑问与答
  2. 产品经理学习总结(3)——测试用例的需求评审
  3. Skype For Business Server 2015
  4. 《动物合唱团》观后有感
  5. u-boot简单学习笔记(三)——AR9331 uboot启动分析
  6. c语言习题---(switch语句)
  7. 用户注册填写手机号接收短信验证码怎么实现?
  8. 思维导图告诉你《微微一笑很倾城》为什么火?
  9. IPC与TCP/IP应用及比较
  10. Unity游戏优化指南大全(持续更新中!)