J2EE三层 Web层, 业务逻辑层, 数据存取层。对应职能团队分为UI交互研发团推,后端服务研发团队,DBA团队。
应用服务器提供对象关系映射服务,数据持久服务,事物服务,安全服务和消息服务等。
SOA特点:
1. 良好的对外接口,通过网络协议对外提供服务。服务之间松耦合。
2. 单个服务发生改变,不影响整个流程。只要接口不变,对外是透明的。
3. 通信格式XML,后来被JSON取代。
4. 服务的可重用性。
5. SOA可以最大化使用内部和外部的公共服务。
SOA实现方式:Web Service和 ESB。
ESB:
1. 监控和控制服务之间的消息路由。
2. 控制可插拔的服务化。
3. 解析服务之间通信的内容和格式。
4. 统一编排信息处理流程。
5. 冗余备份。
Web Service的问题
1. 依赖中心化的服务发现机制。
2. SOAP使用XML冗余大。
3. 服务化管理和治理设施不完善。
微服务,分为多个独立开发,可配置,可运行可维护的自服务,使用RESTful的API通信。
微服务真正目的是通过水平扩展解决传统单体应用业务增长遇到的问题,拆分后人员和项目责任单一,低耦合,高内聚。
1. 职责单一的功能放在一个独立的服务。
2. 每个服务运行在单独的进程中
3. 每个服务有多个实例运行。运行在容器化的平台,可以平滑伸缩。
4. 每个服务有自己的数据存储。独立的数据,缓存,消息队列等。
5. 每个服务有独立的运营平台。每个服务高度自治,内部变化对外透明。
6. 每个服务可以根据性能独立地水平伸缩。
单体应用的特点:
1. 所有模块混合运行在同一个JVM进程中。
2. 可以对多个模块的整体水平扩展,无法对某个模块水平扩展。
3. 某个模块发生变化,所有模块需要编译打包上线。
4. 模块简单依赖不清晰,相互耦合。
微服务架构和SOA一脉相承,也略有不同。
1. 目的不同。SOA强调异构服务之间协作和集成。微服务目的是拆分,实现敏捷开发部署。
2. 部署方式不同。拆分成多个小服务,使用敏捷扩容,Docker实现自动化容器管理。SOA服务将多个服务打包在一起,部署在一个服务器上。
3. 服务粒度不同。微服务拆分粒度更细,职责单一。通过服务组合实现业务流程。SOA对粒度没有要求,通常是粗粒度的。
微服务核心要点:
1. 职能团队的划分
2. 微服务的去中心化治理
3. 微服务的交互模式。读者容错模式(接口改变的容错),消费者驱动契约模式,去数据共享模式(不允许共享数据来集成多个服务)。
4. 微服务的分解和组合模式。拆分达到高内聚低耦合。灵活组装来满足各种业务需求。组合方式有:服务代理模式(典型的案例:平滑的系统迁移),服务聚合模式,服务串联模式,服务分支模式,服务异步消息模式,服务共享数据模式(反模式,用于单元化架构和遗留的整体服务)
5. 微服务的容错模式。 舱壁隔离模式(微服务容器分组和线程池隔离),熔断模式,限流模式(计数器,令牌桶,信号量),失效转移模式(快速失败,切换到备份,重试)
6. 微服务的粒度。微服务初衷职责单一拆到不可再拆。原则是可以合理排版底层的自服务来获得相应的组合服务,同时考虑团队人员分配。
共享数据集成的缺点:
1. 服务之间除了接口契约,还有数据存储契约。
2. 上游数据格式变化,导致下游出问题。
3. 多个服务共享一个资源,资源的运维和职责不清。
4. 多机房部署,考虑到路由,跨机房调用,难以实现服务自治。
Spring Cloud Netflix 包括服务发现组件Eureka,容错性组件Hystrix,智能路由组件Zuul和客户端负载均衡组件Ribbon
1. 服务在Eureka实例中注册,有Spring管理发现和调用
2. 通过配置启动Eureka服务器
3. Feign客户端通过声明的方式即可导入服务代理
4. Zuul使用Ribbon服务实现客户端的负载均衡
5. 通过声明的方式即可插入Hystrix的客户端。
6. 通过配置的方式可以启动Hystrix面板服务器。
7. Spring下可以直接配置Netflix组件。
8. Zuul可以自动注册过滤器和路由器,形成一个反响代理服务器。
9. Hystrix面板可以对服务的状态监控,并提供容错机制。