发表于: 2018-09-18 16:17:15
1 526
一、今天完成的事情:
1、任务八深度思考
1.springcloud Eureka
什么是 Eureka
Eureka,这里是 Spring Cloud Eureka 的简称,是 Spring Cloud Netflix 组件之一。Spring Cloud Netflix 中核心的组件包括了服务治理(Eureka),服务容断(Hystrix),路由(Zuul)和客户端负载均衡(Ribbon)。在系列第三篇,服务消费者讲解会涉及到 Ribbon 的使用。
回到 Spring Cloud Eureka,是基于 Netflix Eureka (Netflix 是 Java 实现的开源软件)。服务治理(Eureka)包括服务注册、服务发现和服务检测监控等,自然本文介绍下 Eureka 作为服务注册中心。
Eureka 架构
Eureka 作为服务治理,必然满足下面几点:
- 服务本身不存在单点故障,
- 支持集群,即高可用性
- 服务与服务之间通过服务注册中心找到彼此实例
作为服务端(即服务注册中心),包括
- 管理服务实例
- 提供服务注册或下线
- 提供服务发现
- 提供服务注册表至两类客户端(即服务提供者和消费者)
作为客户端(即服务提供者和消费者),包括
- 连接服务注册中心
- 向服务注册中心注册或者下线服务实例
- 向服务注册中心或服务注册缓存列表查询服务
2.部署两台Service,如何在WEB中随机访问任意一台Service?
可以使用random函数,随机生成两个数字,例如0、1,如果是0的话,那我就切换回服务1,如果是1的话,那就切换成服务器2,在这里最好能够使用try...catch捕获一下异常,避免有一台服务器宕机后,直接报错。
3.RMI的简单介绍
RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。由于JRMP是专为Java对象制定的,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
RMI的组成
一个正常工作的RMI系统由下面几个部分组成:
1.远程服务的接口定义
2.远程服务接口的具体实现
3.桩(Stub)和框架(Skeleton)文件
4.一个运行远程服务的服务器
5.一个RMI命名服务,它允许客户端去发现这个远程服务
6.类文件的提供者(一个HTTP或者FTP服务器)
7.一个需要这个远程服务的客户端程序
调用远程RMI的步骤:
1,客户调用客户端辅助对象stub上的方法
2,客户端辅助对象stub打包调用信息(变量,方法名),通过网络发送给服务端辅助对象skeleton
3,服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton
5,服务端辅助对象将结果打包,发送给客户端辅助对象stub
6,客户端辅助对象将返回值解包,返回给调用者
7,客户获得返回值
4.什么是RMI,什么是RPC,两者之间的区别是什么?
RMI和RPC之间最主要的区别在于方法是如何被调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。
5.Service和Service之间可以互相调用吗?是应该统一Controller调用Service,还是应该Service调用Service?
service和service之间不能互相调用,应该统一Controll调用service
6.Service对外暴露的接口粒度应该是怎么样的,是只提供基础的CRUD服务,还是应该将业务逻辑包含进去?
- 服务颗粒度:一个服务包含的功能大小。
- 细粒度的服务:(fine-grained)提供相对较小的功能单元,或交换少量的数据。
优点:完成复杂的业务逻辑往往需要编排大量这种细粒度的服务,灵活性强
缺点:需要通过多次的服务请求交互才能实现。
粗粒度的服务:(coarse-grained)则是在一个抽象的接口中封装了大块的业务/技术能力。
优点:减少服务请求交互的次数,减少成本
缺点:会带来服务实现的复杂性,交互大量的数据,并因此而不能灵活更改以适应需求的变化
7.Thrift,Protobuffer分别是什么,一般用于什么场景?
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
thrift由facebook出品,protobuffer由google出品;
区别
1)Thrift: 支持的语言更广泛一些c++, java, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php
protobuf 目前还是只支持c++, java, python
2)Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..)
protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。
3)Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。
protobuf只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream.
4)thrift目前不支持Windows平台
protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。
5)thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc service framework,可以很方便的直接构建服务,不需要做太多其他的工作。
相同点:
数据类型相对固定的情况下,不论是thrift还是protobuf都会比直接处理xml要方便很多。
8.什么是序列化和反序列化,在RMI中是否要实现 Serializable 接口, serialVersionUID的用处是什么?
把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
在RMI中需要实现Serializable接口
serialVersionUID的作用
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
9.Controller通过RMI调用服务是否有延迟?10条Long型的ID循环调用1000次,和本地调用之间的时间相差多少?
Controller通过RMI调用服务有延迟,相差10倍作用
2、任务九深度思考
1.什么是SOA,什么是SCA,什么是微服务?
SOA是面向服务架构,面向服务的体系结构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
SCA是服务组件框架,提供了一套可构建基于面向服务的应用系统的编程模型。它的核心概念是服务及其相关实现。服务由接口定义,而接口包含一组操作。服务实现可以引用其他服务,称为引用。服务可以有一个或多个属性,这些属性是可以在外部配置的数据值。
微服务是:单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
2.Spring RMI,Spring Cloud,Tuscany,Dubbo分别是什么,互相之间有哪些不同?
RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一。Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
SpringBoot是由Pivotal团队提供的全新框架,用来简化新Spring应用的初始搭建和开发过程。开发人员无需定义样板化配置。
SpringCloud是一系列框架的有序集合,它把好的东西集合到一起,这就是所谓的集大成者。同时它利用SpringBoot的开发便利性巧妙的简化了分布式系统基础设施的开发。
TUSCANY:开源 Apache Tuscany 项目致力于实现 SCA 规范(和一些其他的 SCA 规范,如 Service Data Objects 和 Data Access Service)。依照 Open Service-Oriented Architecture (OSOA) 和针对全球信息社会 (OASIS SCA Java) 规范的一些标准,Apache Tuscany 为 SCA 运行时提供了一个全面的基础架构。这里需要说明的是Tuscany官方已经不维护了,但是了解其设计思想对我们理解现在很流行的微服务框架是有好处的.
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
3.怎么实现WEB调用Service的负载均衡,怎么实现可以动态添加服务?
在客户端上添加random函数,随机调用service,在Nginx中配置两个服务之间的权重为1:1,就可以实现等比调用了。
4.公司内部项目里使用的Scallop是什么,和资源中心是怎么结合在一起使用实现动态增加服务的?
公司内部项目里使用的Scallop是什么是代码生成工具,后面还没有了解
3、任务九代码整理。
二、明天计划的事情:
准备复盘PPT。
三、遇到的问题:
遇到一个bug,在使用Tuscany搭建服务器的时候,一直报scm找不到,就是c标签下的一个组件没有找到,后面对比了一下Tuscany下的两个版本,后面才发现,原来是cglib版本问题,后面升为2.2就可以了。
四、收获
如上
进度:任务九
任务开始时间:2018.09.16
预计demo时间:2018.09.18
禅道地址:http://task.ptteng.com/zentao/project-task-731-unclosed.html
评论