精华内容
下载资源
问答
  • 微服务中 每个微服务之间各有依赖 怎么保证微服务按顺序启动不报异常...
  • java 微服务

    2017-11-09 09:01:19
    java 微服务,springboot。java 微服务,springboot。
  • java微服务源码霍伊姆 “ Java微服务动手入门”课程的源代码
  • JAVA微服务架构

    2019-05-08 10:33:15
    JAVA微服务架构
  • Java微服务.pdf

    2020-09-08 11:25:15
    Java微服务+.txt 文件里有下载地址 Java微服务+.txt 文件里有下载地址 Java微服务+.txt 文件里有下载地址
  • Java微服务

    2020-05-14 08:45:03
    Java微服务 Spring Boot 旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用微服务功能,可以和spring cloud联合部署。 Spring Cloud 微服务工具包,为开发者提供了...
  • Java微服务-源码

    2021-02-22 08:44:36
    Java微服务
  • Java微服务下的分布式事务介绍及其解决方案

    万次阅读 多人点赞 2019-03-22 15:48:46
    1.由于最近在学习springcloud的项目,现在互联网下,分布式,微服务横行,难免会遇到分布式下的事务问题,这是一个难点,也是面试经常问的,别面试官一看你简历,都是微服务项目,问你了解啥是分布式事务不,你来句...

    1.前言

    1.由于最近在学习springcloud的项目,现在互联网下,分布式,微服务横行,难免会遇到分布式下的事务问题,这是一个难点,也是面试经常问的,别面试官一看你简历,都是微服务项目,问你了解啥是分布式事务不,你来句没有,这就很尴尬了,当然微服务下可能没有分布式事务,但是很多场景是需要分布式事务的,下面我就来介绍下什么是分布式事务,和分布式事务的解决方案

    2 问题描述

    在介绍分布式事务下,下面我们先来了解一个常见应用场景,这个场景(类似慕课网购买付费课程)也是我后面要讲的分布式事务的解决方案的案例

    2 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而学生选课信息在学习中心数据库,由学习服务去维护学习中心数据库的信息。下图是系统结构图:
    在这里插入图片描述
    ​ 如何实现两个分布式服务(订单服务、学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求,这里的关键是如何保证两个分布式服务的事务的一致性。

    ​ 尝试解决上边的需求,在订单服务中远程调用选课接口,伪代码如下:

    在这里插入图片描述
    下面我们分析下这种解决方案的问题

    1.更新支付表状态为本地数据库操作。
    2.远程调用选课接口为网络远程调用请求
    3.为保存事务上边两步操作由spring控制事务,当遇到Exception异常则回滚本地数据库操作。
    问题如下:
    1、如果更新支付表失败则抛出异常,不再执行远程调用,此设想没有问题。
    2、如果更新支付表成功,网络远程调用超时会拉长本地数据库事务时间,影响数据库性能。(远程调用非常耗时的哦)
    3、如果更新支付表成功,远程调用添加选课成功(选课数据库commit成功),最后更新支付表commit失败,此时出现操作不一致。
    上面的问题就涉及到了分布式事务的控制

    3.什么是分布式事务

    什么是分布式系统

    部署在不同结点上的系统通过网络交互来完成协同工作的系统
    比如:充值加积分的业务,用户在充值系统向自己的账户充钱,在积分系统中自己积分相应的增加。充值系统和积分系统是两个不同的系统,一次充值加积分的业务就需要这两个系统协同工作来完成。

    什么是事务

    事务是指由一组操作组成的一个工作单元,这个工作单元具有原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
    原子性:执行单元中的操作要么全部执行成功,要么全部失败。如果有一部分成功一部分失败那么成功的操作要全部回滚到执行前的状态。
    一致性:执行一次事务会使用数据从一个正确的状态转换到另一个正确的状态,执行前后数据都是完整的。 隔离性:在该事务执行的过程中,任何数据的改变只存在于该事务之中,对外界没有影响,事务与事务之间是完全的隔离的。只有事务提交后其它事务才可以查询到最新的数据。
    持久性:事务完成后对数据的改变会永久性的存储起来,即使发生断电宕机数据依然在。

    什么是本地事务

    本地事务就是用关系数据库来控制事务,关系数据库通常都具有ACID特性,传统的单体应用通常会将数据全部存储在一个数据库中,会借助关系数据库来完成事务控制。

    什么是分布式事务

    在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。这里强调的是多个系统通过网络协同完成一个事务的过程,并不强调多个系统访问了不同的数据库,即使多个系统访问的是同一个数据库也是分布式事务,如下图:在这里插入图片描述
    ​ 另外一种分布式事务的表现是,一个应用程序使用了多个数据源连接了不同的数据库,当一次事务需要操作多个数据源,此时也属于分布式事务,当系统作了数据库拆分后会出现此种情况在这里插入图片描述
    上面两种分布式事务表现形式第一种用的最多

    4.分布式事务的应用场景

    在这里插入图片描述

    CAP理论

    如何进行分布式事务控制?CAP理论是分布式事务处理的理论基础,了解了CAP理论有助于我们研究分布式事务的处理方案。
    CAP理论是:分布式系统在设计时只能在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)中满足两种,无法兼顾三种。
    通过下图来理解CAP理论
    在这里插入图片描述
    一致性(Consistency):服务A、B、C三个结点都存储了用户数据, 三个结点的数据需要保持同一时刻数据一致性。
    可用性(Availability):服务A、B、C三个结点,其中一个结点宕机不影响整个集群对外提供服务,如果只有服务A结点,当服务A宕机整个系统将无法提供服务,增加服务B、C是为了保证系统的可用性。
    分区容忍性(Partition Tolerance):分区容忍性就是允许系统通过网络协同工作,分区容忍性要解决由于网络分区导致数据的不完整及无法访问等问题。
    分布式系统不可避免的出现了多个系统通过网络协同工作的场景,结点之间难免会出现网络中断、网延延迟等现象,这种现象一旦出现就导致数据被分散在不同的结点上,这就是网络分区

    5.分布式系统能否兼顾C、A、P?

    在保证分区容忍性的前提下一致性和可用性无法兼顾,如果要提高系统的可用性就要增加多个结点,如果要保证数据的一致性就要实现每个结点的数据一致,结点越多可用性越好,但是数据一致性越差。所以,在进行分布式系统设计时,同时满足“一致性”、“可用性”和“分区容忍性”三者是几乎不可能的

    CAP有哪些组合方式?

    1、CA:放弃分区容忍性,加强一致性和可用性,关系数据库按照CA进行设计。
    2、AP:放弃一致性,加强可用性和分区容忍性,追求最终一致性,很多NoSQL数据库按照AP进行设计。
    说明:这里放弃一致性是指放弃强一致性,强一致性就是写入成功立刻要查询出最新数据。追求最终一致性是指允许暂时的数据不一致,只要最终在用户接受的时间内数据 一致即可
    3、CP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。
    ​ 说明:由于网络问题的存在CP系统可能会出现待等待超时,如果没有处理超时问题则整理系统会出现阻塞
    总结:​ 在分布式系统设计中AP的应用较多,即保证分区容忍性和可用性,牺牲数据的强一致性(写操作后立刻读取到最新数据),保证数据最终一致性。比如:订单退款,今日退款成功,明日账户到账,只要在预定的用户可以接受的时间内退款事务走完即可。

    6.分布式事务的解决方案(介绍其中三种)

    两阶段提交协议(2PC)

    为解决分布式系统的数据一致性问题出现了两阶段提交协议(2 Phase Commitment Protocol),两阶段提交由协调者和参与者组成,共经过两个阶段和三个操作,部分关系数据库如Oracle、MySQL支持两阶段提交协议,本节讲解关系数据库两阶段提交协议。
    参考:2PC:https://en.wikipedia.org/wiki/Two-phase_commit_protocol

    在这里插入图片描述

    1)第一阶段:准备阶段(prepare)
    协调者通知参与者准备提交订单,参与者开始投票。
    参与者完成准备工作向协调者回应Yes。
    2)第二阶段:提交(commit)/回滚(rollback)阶段
    协调者根据参与者的投票结果发起最终的提交指令。
    如果有参与者没有准备好则发起回滚指令。
    一个下单减库存的例子:
    在这里插入图片描述1、应用程序连接两个数据源。
    2、应用程序通过事务协调器向两个库发起prepare,两个数据库收到消息分别执行本地事务(记录日志),但不提交,如果执行成功则回复yes,否则回复no。
    3、事务协调器收到回复,只要有一方回复no则分别向参与者发起回滚事务,参与者开始回滚事务。
    4、事务协调器收到回复,全部回复yes,此时向参与者发起提交事务。如果参与者有一方提交事务失败则由事务协调器发起回滚事务。
    2PC的优点:实现强一致性,部分关系数据库支持(Oracle、MySQL等)。
    缺点:整个事务的执行需要由协调者在多个节点之间去协调,增加了事务的执行时间,性能低下。
    解决方案有:springboot+Atomikos or Bitronix

    事务补偿(TCC)

    TCC事务补偿是基于2PC实现的业务层事务控制方案,它是Try、Confirm和Cancel三个单词的首字母,含义如下:
    1、Try 检查及预留业务资源完成提交事务前的检查,并预留好资源。
    2、Confirm 确定执行业务操作
    对try阶段预留的资源正式执行。
    3、Cancel 取消执行业务操作
    对try阶段预留的资源释放。
    下边用一个下单减库存的业务为例来说明
    在这里插入图片描述
    1、Try
    下单业务由订单服务和库存服务协同完成,在try阶段订单服务和库存服务完成检查和预留资源。
    订单服务检查当前是否满足提交订单的条件(比如:当前存在未完成订单的不允许提交新订单)。
    库存服务检查当前是否有充足的库存,并锁定资源。
    2、Confirm
    订单服务和库存服务成功完成Try后开始正式执行资源操作。
    订单服务向订单写一条订单信息。
    库存服务减去库存。
    3、Cancel
    如果订单服务和库存服务有一方出现失败则全部取消操作。
    订单服务需要删除新增的订单信息。
    库存服务将减去的库存再还原。
    优点:最终保证数据的一致性,在业务层实现事务控制,灵活性好。
    缺点:开发成本高,每个事务操作每个参与者都需要实现try/confirm/cancel三个接口。
    注意:TCC的try/confirm/cancel接口都要实现幂等性,在为在try、confirm、cancel失败后要不断重试。

    什么是幂等性?

    幂等性是指同一个操作无论请求多少次,其结果都相同。
    幂等操作实现方式有:
    1、操作之前在业务方法进行判断如果执行过了就不再执行。
    2、缓存所有请求和处理的结果,已经处理的请求则直接返回结果。
    3、在数据库表中加一个状态字段(未处理,已处理),数据操作时判断未处理时再处理。

    消息队列实现最终一致(本文打算介绍这种方案解决)

    本方案是将分布式事务拆分成多个本地事务来完成,并且由消息队列异步协调完成,如下图:
    下边以下单减少库存为例来说明:
    在这里插入图片描述1订单服务和库存服务完成检查和预留资源。
    2、订单服务在本地事务中完成添加订单表记录和添加“减少库存任务消息”。
    3、由定时任务根据消息表的记录发送给MQ通知库存服务执行减库存操作。
    4、库存服务执行减少库存,并且记录执行消息状态(为避免重复执行消息,在执行减库存之前查询是否执行过此消息)。
    5、库存服务向MQ发送完成减少库存的消息。
    6、订单服务接收到完成库存减少的消息后删除原来添加的“减少库存任务消息”。
    实现最终事务一致要求:预留资源成功理论上要求正式执行成功,如果执行失败会进行重试,要求业务执行方法实现幂等。
    优点 :
    由MQ按异步的方式协调完成事务,性能较高。
    不用实现try/confirm/cancel接口,开发成本比TCC低。
    缺点:
    此方式基于关系数据库本地事务来实现,会出现频繁读写数据库记录,浪费数据库资源,另外对于高并发操作不是最佳方案。

    总结:本文只是介绍了分布式事务的一些特性和解决方案,将会在另一篇文章上详细介绍消息队列实现最终一致性的分布式解决方案,需要了解:rabbitmq,SpringTask,springcloud

    分布式解决方案的第二篇文章地址如下,这篇文章就来介绍具体的解决方案,案例驱动

    展开全文
  • Java微服务实战

    2019-10-09 08:47:50
    Java微服务实战-pdf 最近在看java微服务找到了这本pdf版的,分享一下 本书分为三部分:基础框架篇(1~6章)、服务框架篇(7~10章)、监控部署篇(11~13章),由浅入深来讲解微服务的相关技术。基础框架篇从微服务...

    Java微服务实战-pdf


    最近在看java微服务找到了这本pdf版的,分享一下


    本书分为三部分:基础框架篇(1~6章)、服务框架篇(7~10章)、监控部署篇(11~13章),由浅入深来讲解微服务的相关技术。基础框架篇从微服务架构的基本概念与技术选型出发,详细的介绍了微服务基础框架SpringBoot、自动化API文档生成工具Swagger、动态数据源和缓存系统,并深入的分析了SpringBoot启动过程的核心源码,这一部分是整本书的基础;服务框架篇详细的介绍了服务注册与发现框架Consul、热配置管理框架Archaius、服务降级容错框架Hystrix,以及服务通信框架OkHttp、AsyncHttpClient和Retrofit,这一部分是整本书的核心;监控部署篇详细的介绍了ELK日志系统的实现、Zipkin全链路追踪系统的实现,最后介绍了持续集成与持续部署系统的实现,这一部分是开发运维的部分。

     

    链接: https://pan.baidu.com/s/1vdmZne5vi9Aeaozk6-XDjw 提取码: pbua 

    展开全文
  • Java微服务最佳实践,IBM出的,介绍java微服务的知识。
  • java微服务源码
  • 从2017年底Java开发领域使用最广的RPC框架Dubbo 开启重新更新维护之路开始,阿里巴巴为打造Dubbo微服务生态持续开源了Sentinel...Java社区持续活跃起来,也为Java微服务开发注入了新的活力。关于Nacos名字:前四个字母
  • java微服务面试资料

    2020-06-29 13:46:39
    java微服务面试资料,关于springboot、springcloud、dubbo spring,帮助大家在面试过程中碰到的一些问题,进行了整理
  • java微服务和源码.zip

    2017-07-02 20:56:51
    java微服务和源码.zip
  • 关于微服务的几个视频教程,无加密!!!ZooKeeper分布式专题与Dubbo微服务入门Docker+Kubernetes(k8s)微服务容器化实践Java深入微服务原理
  • Java微服务.part1

    2017-03-16 15:28:18
    Java微服务》帮助你用Java构建供企业使用的微服务架构,内容包括微服务核心概念和框架、大型软件项目的高层次设计、开发环境设置和前期配置、对微服务架构持续集成的部署、实现微服务的安全性、有效地执行测试、...
  • java微服务源码
  • java微服务源码java-springboot-microservices Java Spring Boot微服务Udemy和Skillshare课程的源代码 从最受好评的Udemy课程开始学习Java Spring Boot微服务。 超过10,000名学生入学! 完整的终身访问权限和结业...
  • java微服务源码
  • Java微服务架构

    千人学习 2018-04-09 09:20:18
    本课程从单体应用模型的问题为切入点,以理论配合实战的方式带领大家了解微服务架构的魅力。通过本课程您可以掌握从基本的Linux服务器架设到容器化引擎的自动化部署以及以Spring Boot为核心开发框架的全栈式分布式...
  • Java 微服务框架选型

    千次阅读 2019-04-24 11:54:23
    Java 微服务框架选型(Dubbo 和 Spring Cloud?) 微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务...

    Java 微服务框架选型(Dubbo 和 Spring Cloud?)

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

    以往我们开发应用程序都是单体型(可以看作是一个怪兽?),虽然开发和部署比较方便,但后期随着业务的不断增加,开发迭代和性能瓶颈等问题,将会困扰开发团队,微服务就是解决此问题的有效手段,市面上有很多的微服务框架,比如最著名的两个 Dubbo 和 Spring Cloud,我们该如何选择呢?

    公司近期打算向 Java 微服务技术转型(一步一步实现,会考虑兼容 .NET/.NET Core),以下是我整理的相关内容,如果你有更好的建议和意见,欢迎探讨~~~

    关于 RPC/gRPC/HTTP/REST

    因为服务调用方式是 Dubbo 和 Spring Cloud 重要不同点,了解 RPC/gRPC/HTTP/REST 相关概念,有助于对比 Dubbo 和 Spring Cloud。

    RPC 是远端过程调用,其调用协议通常包含传输协议和编码协议

    HTTP 严格来说跟 RPC 不是一个层级的概念,HTTP 本身也可以作为 RPC 的传输层协议

    传输协议包含: 如著名的 gRPC 使用的 HTTP 2.0 协议,也有如 Dubbo 一类的自定义报文的 TCP 协议。编码协议包含: 如基于文本编码的 XML Json,也有二进制编码的 ProtoBuf Binpack 等。

    所谓的效率优势是针对 HTTP 1.1 协议来讲的,HTTP 2.0 协议已经优化编码效率问题,像 gRPC 这种 RPC 库使用的就是 HTTP 2.0 协议。

    在跨语言调用的时候,REST 风格直接把 HTTP 作为应用协议(直接和服务打交道),不同语言之间调用比较方便。

    RPC 可以把 HTTP 作为一种传输协议(比如 gRPC 使用 HTTP 2.0 协议传输),本身还会封装一层 RPC 框架的应用层协议,不同语言之间调用需要依赖 RPC 协议(需要跨语言 RPC 库实现,比如 Thrift)。

    问题:为什么 Dubbo 比 Spring Cloud 性能要高一些?

    回答:因为 Dubbo 采用单一长连接和 NIO 异步通讯(保持连接/轮询处理),使用自定义报文的 TCP 协议,并且序列化使用定制 Hessian2 框架,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况,但不适用于传输大数据的服务调用。而 Spring Cloud 直接使用 HTTP 协议(但也不是强绑定,也可以使用 RPC 库,或者采用 HTTP 2.0 + 长链接方式(Fegin 可以灵活设置))。

    另外,Martin Fowler 的 MicroServices 一文,其定义的服务间通信是 HTTP 协议的 REST API

    Dubbo 是什么?

    https://github.com/apache/incubator-dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。简单的说,Dubbo 就是个服务框架,说白了就是个远程服务调用的分布式框架

    Dubbo 框架

    模块注解:

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

    流程详解:

    • 0 服务容器负责启动,加载,运行服务提供者(Standalone 容器)。
    • 1 服务提供者在启动时,向注册中心注册自己提供的服务(Zookeeper/Redis)。
    • 2 服务消费者在启动时,向注册中心订阅自己所需的服务。
    • 3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    • 4 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    • 5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心(根据数据可以动态调整权重)。

    Dubbo 集群容错

    面对服务消费方,当业务逻辑中需要调用一个服务时,真正调用的其实是 Dubbo 创建的一个 Proxy,该 Proxy 会把调用转化成调用指定的 Invoker(Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个(通过 LoadBalance),Invoker 封装了 Provider 地址及 Service 接口信息)。而在这一系列的委托调用的过程里就完成了服务治理的逻辑,最终完成调用。

    Dubbo 特点

    • 远程通讯: 提供对多种基于长连接的 NIO 框架抽象封装(非阻塞 I/O 的通信方式,Mina/Netty/Grizzly),包括多种线程模型,序列化(Hessian2/ProtoBuf),以及“请求-响应”模式的信息交换方式。
    • 集群容错: 提供基于接口方法的透明远程过程调用(RPC),包括多协议支持(自定义 RPC 协议),以及软负载均衡(Random/RoundRobin),失败容错(Failover/Failback),地址路由,动态配置等集群支持。
    • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    Dubbo 发展历程

    • 2008 年,阿里巴巴开始内部使用 Dubbo。
    • 2009 年初,发布 1.0 版本。
    • 2010 年初,发布 2.0 版本。
    • 2011 年 10 月,阿里巴巴宣布开源,版本为 2.0.7。
    • 2012 年 3 月,发布 2.1.0 版本。
    • 2013 年 3 月,发布 2.4.10 版本。
    • 2014 年 10 月,发布 2.3.11 版本,之后版本停滞。
    • 2017 年 9 月,阿里巴巴重启维护,重点升级所依赖 JDK 及组件版本,发布 2.5.4/5 版本。
    • 2017 年 10 月,发布 2.5.6 版本。
    • 2017 年 11 月,发布 2.5.7 版本,后期集成 Spring Boot。
    • 2014 年 10 月,当当网 Fork 了 Dubbo 版本,命名为 Dubbox-2.8.0,并支持 HTTP REST 协议。

    Dubbo 负责人说明(重启维护是接受的采访):

    阿里内部使用 HSF,原因业务属性规模有关。
    这里就不得不提到目前的一些文章在谈到微服务的时候总是拿 Spring Cloud 和 Dubbo 来对比,需要强调的是 Dubbo 未来的定位并不是要成为一个微服务的全面解决方案,而是专注在 RPC 领域,成为微服务生态体系中的一个重要组件。至于大家关注的微服务化衍生出的服务治理需求,我们会在 Dubbo 积极适配开源解决方案,甚至启动独立的开源项目予以支持。
    受众主要来自国内各友商以及个人开发者,希望将来能够将用户拓展到全球,代表国人在 RPC 领域与 gRPC(基于 HTTP 2.0)、Finagle 等竞争。

    Spring Cloud 是什么?

    https://github.com/spring-cloud

    Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

    Spring Boot 是 Spring 的一套快速配置脚手架,使用默认大于配置的理念,用于快速开发单个微服务。

    重点:

    • 基于 Spring Boot
    • 云服务、分布式框架集合(众多)

    核心功能:

    • 分布式/版本化配置
    • 服务注册和发现
    • 路由
    • 服务和服务之间的调用
    • 负载均衡
    • 断路器
    • 分布式消息传递

    Spring Cloud 完整技术

    Spring Cloud 组件架构

    流程:

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

    Spring Cloud工具框架

    • Spring Cloud Config 配置中心,利用 Git 集中管理程序的配置。
    • Spring Cloud Netflix 集成众多Netflix的开源软件。
    • Spring Cloud Netflix Eureka 服务中心(类似于管家的概念,需要什么直接从这里取,就可以了),一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
    • Spring Cloud Netflix Hystrix 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
    • Spring Cloud Netflix Zuul 网关,是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Web 网站后端所有请求的前门。
    • Spring Cloud Netflix Archaius 配置管理 API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
    • Spring Cloud Netflix Ribbon 负载均衡
    • Spring Cloud Netflix Fegin REST客户端
    • Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化。
    • Spring Cloud for Cloud Foundry 利用 Pivotal Cloudfoundry 集成你的应用程序。
    • Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。
    • Spring Cloud Cluster 集群工具,基于 Zookeeper, Redis, Hazelcast, Consul 实现的领导选举和平民状态模式的抽象和实现。
    • Spring Cloud Consul 基于 Hashicorp Consul 实现的服务发现和配置管理。
    • Spring Cloud Security 安全控制,在 Zuul 代理中为 OAuth2 REST 客户端和认证头转发提供负载均衡。
    • Spring Cloud Sleuth 分布式链路监控,SpringCloud 应用的分布式追踪系统,和 Zipkin,HTrace,ELK 兼容。
    • Spring Cloud Data Flow 一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。
    • Spring Cloud Stream 消息组件,基于 Redis,Rabbit,Kafka 实现的消息微服务,简单声明模型用以在 Spring Cloud 应用中收发消息。
    • Spring Cloud Stream App Starters 基于 Spring Boot 为外部系统提供 Spring 的集成。
    • Spring Cloud Task 短生命周期的微服务,为 Spring Booot 应用简单声明添加功能和非功能特性。
    • Spring Cloud Task App Starters。
    • Spring Cloud Zookeeper 服务发现和配置管理基于 Apache Zookeeper。
    • Spring Cloud for Amazon Web Services 快速和亚马逊网络服务集成。
    • Spring Cloud Connectors 便于PaaS应用在各种平台上连接到后端像数据库和消息经纪服务。
    • Spring Cloud Starters (项目已经终止并且在 Angel.SR2 后的版本和其他项目合并)
    • Spring Cloud CLI 命令行工具,插件用 Groovy 快速的创建 Spring Cloud 组件应用。

    Dubbo 一些优点

    • Dubbo 支持 RPC 调用,服务之间的调用性能会很好。
    • 支持多种序列化协议,如 Hessian、HTTP、WebService。
    • Dobbo Admin后台管理功能强大,提供了路由规则、动态配置、访问控制、权重调节、均衡负载等功能。
    • 在国内影响力比较大,中文社区文档较为全面
    • 阿里最近重启维护

    Dubbo 一些问题

    • Registry 严重依赖第三方组件(zookeeper 或者 redis),当这些组件出现问题时,服务调用很快就会中断。
    • Dubbo 只支持 RPC 调用。使得服务提供方(抽象接口)与调用方在代码上产生了强依赖,服务提供者需要不断将包含抽象接口的 jar 包打包出来供消费者使用。一旦打包出现问题,就会导致服务调用出错,并且以后发布部署会成很大问题(太强的依赖关系)。
    • 另外,以后要兼容 .NET Core 服务,Dubbo RPC 本身不支持跨语言(可以用跨语言 RPC 框架解决,比如 Thrift、gRPC(重复封装了),或者自己再包一层 REST 服务,提供跨平台的服务调用实现,但相对麻烦很多)
    • Dubbo 只是实现了服务治理,其他微服务框架并未包含,如果需要使用,需要结合第三方框架实现(比如分布式配置用淘宝的 Diamond、服务跟踪用京东的 Hydra,但使用相对麻烦些),开发成本较高,且风险较大。
    • 社区更新不及时(虽然最近在疯狂更新),但也难免阿里以后又不更新了,就尴尬了。
    • 主要是国内公司使用,但阿里内部使用 HSF,相对于 Spring Cloud,企业应用会差一些。

    Spring Cloud 的一些优点

    • 有强大的 Spring 社区、Netflix 等公司支持,并且开源社区贡献非常活跃
    • 标准化的将微服务的成熟产品和框架结合一起,Spring Cloud 提供整套的微服务解决方案,开发成本较低,且风险较小
    • 基于 Spring Boot,具有简单配置、快速开发、轻松部署、方便测试的特点。
    • 支持 REST 服务调用,相比于 RPC,更加轻量化和灵活(服务之间只依赖一纸契约,不存在代码级别的强依赖),有利于跨语言服务的实现,以及服务的发布部署。另外,结合 Swagger,也使得服务的文档一体化
    • 提供了 Docker 及 Kubernetes 微服务编排支持。
    • 国内外企业应用非常多,经受了大公司的应用考验(比如 Netfilx 公司),以及强大的开源社区支持。

    Spring Cloud 的一些问题

    • 支持 REST 服务调用,可能因为接口定义过轻,导致定义文档与实际实现不一致导致服务集成时的问题(可以使用统一文档和版本管理解决,比如 Swagger)。
    • 另外,REST 服务调用性能会比 RPC 低一些(但也不是强绑定)
    • Spring Cloud 整合了大量组件,相关文档比较复杂,需要针对性的进行阅读。

    服务调用方式的不同

    Spring Cloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生 RPC 带来的问题。而且 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。

    Dubbo 和 Spring Cloud 对比

    Dubbo 专注 RPC 和服务治理,Spring Cloud 则是一个微服务架构生态。

    ZooKeeper 和 Eureka 的区别

    鉴于服务发现对服务化架构的重要性,Dubbo 实践通常以 ZooKeeper 为注册中心(Dubbo 原生支持的 Redis 方案需要服务器时间同步,且性能消耗过大)。针对分布式领域著名的 CAP 理论(C——数据一致性,A——服务可用性,P——服务对网络分区故障的容错性),Zookeeper 保证的是 CP ,但对于服务发现而言,可用性比数据一致性更加重要,AP 胜过 CP,而 Eureka 设计则遵循 AP 原则
    Spring Cloud 支持 Consul(CA)和 Zookeeper,但不推荐使用。

    网易考拉选型参考

    当前开源上可选用的微服务框架主要有 Dubbo、Spring Cloud 等,鉴于 Dubbo 完备的功能和文档且在国内被众多大型互联网公司选用,考拉自然也选择了 Dubbo 作为服务化的基础框架。其实相比于 Dubbo,Spring Cloud 可以说是一个更完备的微服务解决方案,它从功能性上是 Dubbo 的一个超集,个人认为从选型上对于一些中小型企业 Spring Cloud 可能是一个更好的选择。提起 Spring Cloud,一些开发的第一印象是 HTTP + JSON 的 REST 通信,性能上难堪重用,其实这也是一种误读。微服务选型要评估以下几点:内部是否存在异构系统集成的问题;备选框架功能特性是否满足需求;HTTP 协议的通信对于应用的负载量会否真正成为瓶颈点(Spring Cloud 也并不是和 HTTP + JSON 强制绑定的,如有必要 Thrift、ProtoBuf 等高效的 RPC、序列化协议同样可以作为替代方案);社区活跃度、团队技术储备等。作为已经没有团队持续维护的开源项目,选择 Dubbo 框架内部就必须要组建一个维护团队,先不论你要准备要集成多少功能做多少改造,作为一个支撑所有工程正常运转的基础组件,问题的及时响应与解答、重大缺陷的及时修复能力就已足够重要。

    Dubbo 和 Spring Cloud 比喻

    使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。

    .NET Core的兼容方案

    若使用 Spring Cloud,.NET Core 兼容 Spring Cloud 比较好实现,因为基于 REST 服务调用,可以自行实现其服务(Eureka 提供 REST API 进行服务注册),也已有成熟的开源框架如 Steeltoe

    官方介绍:

    Steeltoe is an open source project that enables .NET developers to implement industry standard best practices when building resilient microservices for the cloud. The Steeltoe client libraries enable .NET Core and .NET Framework apps to easily leverage Netflix Eureka, Hystrix, Spring Cloud Config Server, and Cloud Foundry services.

    关于 Service Mesh

    2017 年底,非侵入式的 Service Mesh 技术从萌芽到走向了成熟。

    Service Mesh 又译作“服务网格”,作为服务间通信的基础设施层

    如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。

    • Linkerdhttps://github.com/linkerd/linkerd):第一代 Service Mesh,2016 年 1 月 15 日首发布,业界第一个 Service Mesh 项目,由 Buoyant 创业小公司开发(前 Twitter 工程师),2017 年 7 月 11 日,宣布和 Istio 集成,成为 Istio 的数据面板。
    • Envoyhttps://github.com/envoyproxy/envoy):第一代 Service Mesh,2016 年 9 月 13 日首发布,由 Matt Klein 个人开发(Lyft 工程师),之后默默发展,版本较稳定。
    • Istiohttps://github.com/istio/istio):第二代 Service Mesh,2017 年 5 月 24 日首发布,由 Google、IBM 和 Lyft 联合开发,只支持 Kubernetes 平台,2017 年 11 月 30 日发布 0.3 版本,开始支持非 Kubernetes 平台,之后稳定的开发和发布。
    • Conduithttps://github.com/runconduit/conduit):第二代 Service Mesh,2017 年 12 月 5 日首发布,由 Buoyant 公司开发(借鉴 Istio 整体架构,部分进行了优化),对抗 Istio 压力山大,也期待 Buoyant 公司的毅力。
    • nginMeshhttps://github.com/nginmesh/nginmesh):2017 年 9 月首发布,由 Nginx 开发,定位是作为 Istio 的服务代理,也就是替代 Envoy,思路跟 Linkerd 之前和 Istio 集成很相似,极度低调,GitHub 上的 star 也只有不到 100。
    • Konghttps://github.com/Kong/kong):比 nginMesh 更加低调,默默发展中。

    总结

    关于 Dubbo 和 Spring Cloud 的相关概念和对比,上面已经叙述的很清楚了,我个人比较倾向于 Spring Cloud,原因就是真正的微服务框架、提供整套的组件支持、使用简单方便、强大的社区支持等等,另外,因为考虑到 .NET/.NET Core 的兼容处理,RPC 并不能很好的实现跨语言(需要借助跨语言库,比如 gRPC、Thrift,但因为 Dubbo 本身就是“gRPC”,在 Dubbo 之上再包一层 gRPC,有点重复封装了),而 HTTP REST 本身就是支持跨语言实现,所以,Spring Cloud 这一点还是非常好的(Dubbox 也支持,但性能相比要差一些)。

    但凡事无绝对,每件事物有好的地方也有不好的地方,总的来说,Dubbo 和 Spring Cloud 的主要不同体现在两个方面:服务调用方式不同专注点不同(生态不同)

    最后,关于 Service Mesh,因为是很新的概念(去年年底才火起来),相关的框架并未真正用于生产环境,所以这边就不考虑了,但以后可能会发展的非常好。

    参考资料:

    展开全文
  • Java微服务框架一览

    千次阅读 2017-12-08 10:16:53
    Java微服务框架一览

    原文Java Microservices: Code Examples, Tutorials, and More 
    作者:Angela Stringfellow 
    翻译:雁惊寒

    译者注:本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架。以下是译文。

    微服务在开发领域的应用越来越广泛,因为开发人员致力于创建更大、更复杂的应用程序,而这些应用程序作为微小服务的组合能够更好地得以开发和管理。这些微小的服务可以组合在一起工作,并实现更大、应用更广泛的功能。现在出现了很多的工具来满足使用逐段法而不是一次性地设计和构建应用程序的所有需求。今天,我们来看一下什么是微服务、使用微服务的好处,以及几个代码示例。

    微服务是什么?

    微服务是一种面向服务的架构风格(Java开发人员最重要的技能之一),其中,应用程序被构建为多个不同的小型服务的集合而不是单个应用程序。与单个程序不同的是,微服务让你可以同时运行多个独立的应用程序,而这些独立的应用程序可以使用不同的编码或编程语言来创建。庞大而又复杂的应用程序可以由多个可自行执行的简单而又独立的程序所组成。这些较小的程序组合在一起,可以提供庞大的单程序所具备的所有功能。

    微服务捕获了你的业务场景,回答了“你想要试着解决什么问题”这个问题。微服务的开发团队的成员数量比较少,而且可以用任何语言、任何框架进行开发。每个相关的程序都是独立地版本化、执行和扩展。这些微服务可以与其他微服务进行交互,并且具有唯一的URL或名字,同时,即使遇到故障,也能始终保持可用性和一致性。

    微服务能带来哪些好处?

    使用微服务能带来多个好处,其中有一个好处是,由于这些较小的应用程序无需使用相同的编程语言,因此,开发人员可以使用他们最熟悉的语言。这有助于开发人员用更低的成本和更少的错误来开发程序。灵活性和低成本这两个特点也表现在可以将这些较小的程序重用在其他项目中,从而使其更有效率。

    几个Java微服务框架的例子

    这里有几个可用于Java开发的微服务框架:

    • Spring Boot:这可能是最好的Java微服务框架了,它适用于控制反转、面向切面编程等等。
    • Jersey:这个开源框架支持Java的JAX-RS API,使用起来非常容易。
    • Swagger:在为你提供开发门户网页的同时,能帮助你生成API文档,以允许用户测试你的API。

    你也可以考虑使用其他一些框架,包括:Dropwizard、Ninja Web框架、Play框架、RestExpress、Restlet、Restx和Spark Framework。

    如何使用DropWizard来创建微服务

    DropWizard将成熟稳定的Java库集成在一个轻量级的包中,你可以在自己的应用程序中使用这个包。它使用了Jetty for HTTP、Jersey for REST和Jackson for JSON,以及Metrics、Guava、Logback、Hibernate Validator、Apache HttpClient、Liquibase、Mustache、Joda Time和Freemarker。

    你可以使用Maven来设置Dropwizard应用程序。怎么做呢?

    在你的POM文件中,添加一个dropwizard.version属性,值为DropWizard的最新版本。

    <properties>
        <dropwizard.version>LATEST VERSION</dropwizard.version>
    </properties>
    <!--Then list the dropwizard-core library:-->
    <dependencies>
        <dependency>
            <groupId>io.dropwizard</groupId>
            <artifactId>dropwizard-core</artifactId>
            <version>${version}</version>
        </dependency>
    </dependencies>

    这将为你设置一个Maven项目。在这里,你可以创建配置类、应用程序类、表现类,资源类或一个健康检查,还可以构建Fat JARS,然后运行应用程序。

    此链接中可以查看Dropwizard用户手册,这个链接是GitHub库。

    示例代码:

    package com.example.helloworld;
    import com.yammer.dropwizard.config.Configuration;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import org.hibernate.validator.constraints.NotEmpty;
    public class HelloWorldConfiguration extends Configuration {
        @NotEmpty
        @JsonProperty
        private String template;
        @NotEmpty
        @JsonProperty
        private String defaultName = "Stranger";
        public String getTemplate() {
            return template;
        }
        public String getDefaultName() {
            return defaultName;
        }
    }

    Spring Boot微服务

    Spring Boot让你可以通过嵌入式服务器将它提供的Java应用程序与你自己的应用程序一起使用。它使用了Tomcat,因此你不必使用其他的Java EE容器。Spring Boot的教程示例可以访问这里

    你可以在这里找到所有的Spring Boot工程,你会发现Spring Boot拥有你的应用程序所需的所有基础架构。无论你是在编写安全类、配置类或是大数据类的应用程序,总能找到对应的Spring Boot工程。

    Spring Boot的工程包括: 
    - Spring IO Platform:用于版本化应用程序的企业级分发。 
    - Spring Framework:用于事务管理、依赖注入、数据访问、消息传递和Web应用程序。 
    - Spring Cloud:用于分布式系统,用于构建或部署你的微服务。 
    - Spring Data:用于与数据访问相关的微服务,不管是映射还是归约,关系型还是非关系型。 
    - Spring Batch:用于高级别的批量操作。 
    - Spring Security:用于授权和认证支持。 
    - Spring REST文档:用于RESTful服务文档化。 
    - Spring Social:用于连接社交媒体API。 
    - Spring Mobile:适用于移动网络应用。

    示例代码:

    import org.springframework.boot.*;
    import org.springframework.boot.autoconfigure.*;
    import org.springframework.stereotype.*;
    import org.springframework.web.bind.annotation.*;
    @RestController
    @EnableAutoConfiguration
    public class Example {
        @RequestMapping("/")
        String home() {
            return "Hello World!";
        }
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Example.class, args);
        }
    }

    Jersey

    Jersey RESTful框架是开源的,它基于JAX-RS规范。Jersey应用程序可以扩展现有的JAX-RS实现,并通过添加功能和实用工具,使得RESTful服务更为简单,客户端开发变得更加轻松。

    Jersey最好的一点是,它的文档很详细,有很多例子。它的速度很快,路由也非常简单。

    关于如何开始使用Jersey的文档在这里,而更多的文档可以在这里找到。

    你可以尝试运行下面的示例代码:

    package org.glassfish.jersey.examples.helloworld;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    @Path("helloworld")
    public class HelloWorldResource {
        public static final String CLICHED_MESSAGE = "Hello World!";
        @GET
        @Produces("text/plain")
        public String getHello() {
            return CLICHED_MESSAGE;
        }
    }

    Jersey可以很容易地与其他库一起使用,如Netty或Grizzly,它支持异步连接。它不需要servlet容器。然而,它确实很粗鲁地依赖注入实现。

    Play框架

    Play框架可以让你很方便地使用Scala和Java来构建、创建和部署Web应用程序。对于需要并行处理远程调用的RESTful应用程序来说,Play框架是理想的选择。它是模块化的,支持异步。Play框架的社区也是所有微服务框架中最大的社区之一。

    你可以尝试运行下面的示例代码:

    package controllers;
    import play.mvc.*;
    public class Application extends Controller {
        public static void index() {
            render();
        }
        public static void sayHello(String myName) {
            render(myName);
        }
    }

    Restlet

    Restlet可以帮助开发人员创建遵循RESTful架构模式的快速而又可扩展的Web API。它具有不错的路由和过滤功能,可用于Java SE/EE、OSGi、Google AppEngine(Google Compute的一部分)、Android和其他主要的平台。

    由于它的社区是封闭的,因此Restlet的学习曲线比较陡峭,但是你可以从StackOverflow上获得帮助。

    示例代码:

    package firstSteps;
    import org.restlet.resource.Get;
    import org.restlet.resource.ServerResource;
    /** 
     * Resource which has only one representation. 
     */
    public class HelloWorldResource extends ServerResource {
        @Get
        public String represent() {
            return "hello, world";
        }
    }

    有关微服务更多的资源和教程

    要进一步阅读有关微服务的信息以及教程,请访问以下资源:

    展开全文
  • 2018年千锋Java微服务架构最新 下载了绝对实用,跟着文档和视频、源码一起走,绝对会收货很多
  • 黑马java微服务项目乐优商城全套网盘链接。 黑马java微服务项目乐优商城全套网盘链接。 乐优商城的英文一个全品类的电商购物网站(B2C)。 用户可以在线购买商品,加入购物车,下单,商品秒杀 可以品论已社群中心...
  • 以下启动流程是一个常规的微服务启动流程,若是开发或测试功能,根据需要启动即可 GateWayApplication 网关服务,支持路由,断言,过滤等功能 AuthCenterApplication 授权中心,支持token的颁发 为避免只启动单独...
  • 通过Jenkins自动化发布java微服务脚本
  • java 微服务实践 - Spring Cloud 系列(一)云原生应用.wmv Java 微服务实践 - Spring Cloud 系列(二)配置客户端.wmv Java 微服务实践 - Spring Cloud 系列(三)配置服务器.mp4 Java 微服务实践 - Spring Cloud ...
  • Java微服务 vs Go微服务,究竟谁更强!?

    千次阅读 多人点赞 2021-01-13 08:33:00
    前言Java微服务能像Go微服务一样快吗?这是我最近一直在思索地一个问题。去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,110
精华内容 80,444
关键字:

java微服务如何启动

java 订阅