1.4.1微服务项目的依赖关系
在微服务化结构中,软件项目被拆分成多个自制的服务,服务之间通过网络协议进行调用,通常使用RPC远程调用。
Java的的领域,每个服务上线后,对外输出的接口为JAR包,
微服务领域,JAR包被分为一方库,二方库,三方库。
一方库:本地服务在JVM进程内依赖的JAR包。
二方库:在服务外通过网络通信或者RPC调用的服务的JAR包。
三方库:所依赖的其他公司或者组织提供的服务或者模块。
1.4.2微服务项目的层级结构
服务导出层(战争):打包成一个战争包
web.xml文件中
春季环境
服务接口层(JAR)打包成罐包,并发布到的Maven的服务器上,也包含在服务导出层的战争包中。
业务接口
DTO
枚举类
服务实现层(JAR)打包成罐包,包含在服务导出层的战争包中。
业务实现类
外部服务包装类
DAO
1.4.3微服务项目持续发布
微服务项目需要实现自动化的持续部署和持续集成的功能,包括:代码管理,自动编译,发布QA,自动化测试,性能测试,准生产部署和测试,生产环境发布。
1.5服务化管理和治理框架的技术选型
1.5.1RPC
远程服务调用的技术栈。
1.JDK RMI
自JDK1.4开始,JDK内置了远程服务调用的技术栈,可以帮助开发者创建基于Java的的到的的Java的分布式调用架构,一个Java的的进程内的服务可以调用其他的Java的进程内的服务,使用JDK内置的序列化和反序列化协议。
RMI是JEE规范中EJB远程调用的基础,但是几乎没有公司采用这种方式构建服务化平台
原因:
RMI采用JDK自带专用序列化协议,不能跨语言。
使用了底层的网络协议,不如HTTP可读和HTTP的广泛认可和应用。
开源框架飞速发展
2.Hessian,粗麻布
的的Caucho公司提供的开源远程调用协议,基于HTTP传输,防火墙通常会设置在某个端口上以允许特定HTTP通信。
黑森州将对象序列化成语言无关的二进制协议;
麻布将对象序列化成语言无关的XML数据,数据是可读的。
两者都是语言无关的,可在多种语言的服务中相互调用。
黑森州,粗麻布适合传输小对象,对较大,复杂对象序列化方式和传输通道都没有RMI有优势。服务化架构大量的服务调用都是大规模,高并发的短小请求,因此黑森州和麻袋协议在服务化架构中得到了广泛应用。
3.Spring HTTP Invoker
Spring HTTP Invoker重用了JDK内置的对象序列化技术传输对象,与RMI原理一致,但它通过HTTP通道传输数据,效率上略低RMI,并且由于使用JDK内置序列化机制,所以也不能跨语言。
1.5.2服务化
SOA服务化时代的服务化框架和平台
1.Dubbo
阿里开源分布式服务框架,高性能,透明化RPC远程服务调用,基本的服务监控,服务治理和服务调度等能力。默认支持多种序列化协议和通信编码协议,默认使用达博协议传输的Hessian序列化的数据。
Dubbo使用ZooKeeper作为注册中心来注册和发现服务,通过客户端负载均衡来路由请求,负载均衡算法包括:随机,轮询,最少活跃调度数,一致性哈希等.基于java语言,不能与其他语言的服务化平台互相调用.
Dubbo的缺点
开发较早,近些年没有开发者维护和升级
早起留下的Bug没有修复,需要使用者自己发现和修复
Dubbo没有全面优化,服务量级到一定程度时,出现通知系统携带过多冗余信息极端情况下导致网络广播风暴.
一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播;由于网络拓扑的设计和连接问题,或其他原因导致广播在网段内大量复制,传播数据帧,导致网络性能下降,甚至网络瘫痪。这就是广播风暴
Dubbo服务框架是SOA服务化时代的产物,对微服务化提出的各种概念如熔断,限流,服务隔离等没有精细的设计和实现
Dubbo监控和服务治理模块比较简单,难以满足复杂业务的需求.
2.HSF
(High Speed Framework ,好舒服)淘宝内部大规模使用的一款高性能服务框架,为企业级互联网架构定制的分布式服务框架,HSF以高性能网络通信框架为基础,提供了诸如服务发布与注册,服务调用,服务路由,服务鉴权,服务限流,服务降级,服务调用链路跟踪等一系列久经考验的功能特性.
HSF也来自阿里,但不开源,据说性能比Dubbo高,业务耦合重,无法抽取并开源.
3.Thrift
Thrift是Facebook实现的一种高性能并且支持多语言的远程服务调用框架,由Apache开源.
采用中间的接口描述语言定义并创建服务,支持跨语言服务开发和调用,并且包含中间的接口描述语言与代码生成和转换工具,支持多种流行语言,传输数据时采用二进制序列化格式,相对于JDK本身的序列化,XML和JSON等,尺寸更小,在高并发,海量请求,跨语言环境下更有优势.因为跨语言高性能,颇受企业欢迎,建设跨语言服务平台,Thrift是首选.
4.AXIS
Axis是Apache Web Service项目中的子项目,最初起源IBM的"SOAP4J",属于最早的一批用于构造基于WebService应用的框架.
WebService使用SOAP协议,而SOAP通常使用HTTP传输XML格式数据,因此性能低下,而且SOAP协议复杂臃肿,所以没有企业采用这种框架服务化了.
5.Mule ESB
基于java语言的企业服务总线产品,他可以把多个复杂的异构系统通过总线模式集成在一起,并让他们之间互相通信,包括JMS,Web Service链接数据库的JDBC,http和历史遗留系统.
优点:现有的,不同技术栈的历史遗留系统与新增服务化系统通过总线进行串联和编排.
1.5.3微服务
介绍流行的Spring Cloud系列的微服务框架.
1.Spring Boot
使用Spring Boot可以很容易创建独立的,高品质的基于Spring的应用程序,基于SpringBoot创建的应用可以随时随地启动和运行,一般只需要较少的配置和搭建环境的工作量.
JEE时代,企业开发通用功能被提取到容器层实现,
而Spring Boot思路刚好相反,他将容器嵌入自启动的jar包中,在SpringBoot应用启动时,内部启动嵌入的容器,例如tomcat,Jetty,Netty等,然后通过内嵌的服务器将应用中提供的服务暴露.
架构如下:
应用(自启动jar包)
服务管理
服务配置
安全
日志
内嵌容器1
内嵌容器2
内嵌容器3
...
这种设计在微服务架构下的优点
可创建独立,自启动应用程序
不需要构建War包并发布到容器中,构建和维护War包,容器的配置和管理也是需要成本的.
通过Maven的定制化标签,可以快速创建Spring Boot的应用程序.
可以最大化地自动化配置Spring,而不需要人工配置各项参数.
提供产品化特点,如性能分析,健康检查,外部化配置
全程没有XML配置,也不需要代码生成.
Spring Boot是Spring Cloud构建微服务架构的重要基础.
2.Netflix
由Netflix公司开发并且合并到SpringCloud项目中,主要提供了服务发现,断路器,监控,智能路由,客户端负载均衡,易用的REST客户端等服务化必须的功能.
3.Spring Cloud Netflix
集成了Spring Boot对微服务敏捷启动和发布的功能,以及Netflix提供的微服务化管理和治理的能力,称为一个完美的微服务解决方案。在SpringCloudNetflix平台下,开发人员通过几个简单的注解配置即可完成一个大规模分布式系统的发布工作。
包括发现组件尤里卡,容错性组件豪猪,智能路由组件Zuul和客户端负载均衡组件丝带。
Spring Cloud Netflix交互流程如下
服务在尤里卡服务器实例上注册
Zuul作为一个特殊的服务在尤里卡上注册并发现服务
Zuul作为网关,将发现的服务导出给PC网站,APP和开放平台使用。
RestTemplace和FeignClient使用简单的服务调用的方法调用服务1,服务2等。
特点:
服务在尤里卡实例中注册,由春季管理的豆来发现和调用。
配置的方式可以启动嵌入式的尤里卡服务器。
假装客户端通过声明的方式即可导入服务代理。
Zuul使用丝带服务实现客户端的负载均衡。
通过声明方式即可插入猬客户端。
通过配置方式即可启动猬面板服务器。
在春天环境中可以直接配置Netflix公司的组件。
Zuul可以自动注册过滤器和路由器,形成一个反向代理服务器。
猬面板可以对服务的状态进行监控,并提供了容错机制。
Spring Cloud Netflix是当前最流行的微服务架构的落地和实现。
1.6一章小结
微服务是SOA服务化的拓展和延续。
将传统单体应用拆分成网络服务,实现模块化组件。
根据微服务架构的服务划分来分组职能团队,减少跨团队的沟通。
一个服务对应一个团队,团队成员负责开发,测试,运维和运营,开发后在团队内运维和运营,不需要交付给其他团队。
去中心化,去SOA服务化的中心服务治理和去企业服务总线。
微服务重视服务的合理拆分,分层和构造,可建设自动化持续发布平台,并进行敏捷开发和部署。
具备兼容性设计,容错性设计和服务的契约设计