发表于: 2020-09-26 23:01:21
1 1434
今天完成的事:
1.springCloud重写项目
2.任务九深度思考
把注册中心,springbootadmin,生产者部署在腾讯云上。
消费者在本地的wsl中
消费者用nginx进行负载均衡,生产者的feign自带Ribbon负载均衡。
腾讯云
本地wsl
关掉一台消费者
重新访问无问题
关掉一台8002端口的生产者
正常访问。
springboot-admin界面
管理平台拿不到消费者的健康数据是因为消费者部署在本地上,本地的ip不是公网ip。
深度思考:
1.Dubbo提供了哪几种注册中心的方式?Redis和Zookeeper应该用哪一种?
查看了Dubbo官方文档,Dubbo目前支持5种注册中心,(multicast,zookeeper,redis,simple,Nacos)
然后
在分布式领域有一个很著名的CAP定理:C:数据一致性。A:服务可用性。P:分区容错性(服务对网络分区故障的容错性)。
zookeeper采用的是cp方案,当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用,也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30s~120s且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪,在云部署的环境下,因为网络问题使得zk集群失去master节点是大概率会发生的事情,虽然服务能最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。
dubbo用redis做注册中心,可以看作是一个简单的扩展实现。其核心是基于redis的 pub/sub 能力。
但和zk比起来,redis功能实现会相对困难些(如其redis集群策略需要自行从外部保证同步,这恐怕不会是件容易的事,现有的主从,集群方案都完全无法cover其场景。既要保证任意写,又要保证全同步(数据一致性))。它需要单独去维护一些心跳、过期类的事务。过多的服务会导致这类工作更加繁重。
所以应该选择zookeeper。
2.微服务里,什么是注册中心,注册中心最常见的有Zookeeper,Eureka,还有我们自己的Scallop,他们之间的区别是什么?
微服务系统中由很多个单一职责的服务单元组成,每个微服务又有众多实例。由于系统的服务粒度较小,服务数量众多,服务之间的相互依赖成网状,所以系统需要注册中心来统一管理微服务实例,方便查看每一个微服务实例的健康状态。
Zookeeper是遵循c(数据一致性)p(分区容错)的原则来设计的。它不能保证每次服务请求的可用性。从实际情况来分析,在使用Zookeeper获取服务列表时,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。
Eureka是遵守的就是A(服务可用性)P原则。Eureka Server也可以运行多个实例来构建集群,解决单点问题,但不同于ZooKeeper的选举leader的过程,Eureka Server采用的是Peer to Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。
如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。
一个新的Eureka Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式
scallop是在web和service之间协助远程调用的一个application,也可以把它看做是单独的一个项目,因为它可以独立配置.而不具体依赖于某个项目,在scallop中维护这一张resource表,这张表里就是service的相关接口.当某个service挂掉的时候,可以用scallop来轻松挂起,而不用改web项目里的配置,松耦合,降低整体运行风险,增强项目的健壮性.
3.Dubbo和Spring Cloud的区别是什么?如果让你来做架构选型,你会选择哪一个微服务体系,原因是什么?
dubbo由于是二进制的传输,占用带宽会更少
springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
dubbo的注册中心可以选择zk,redis等多种,springcloud的注册中心只能用eureka或者自研
但如果我选,我会用springcloud。
从公司整体规划:我不会选择很久没人维护的dubbo,重启之后也未必是原班人马
从程序员招聘难度:招springcloud的程序员会更好招,因为更新更炫
从系统结构简易程序:springcloud的系统结构更简单、“注册+springmvc=springcloud”,而dubbo各种复杂的Url,protocol,register,invocation,dubbofilter,dubboSPI,dubbo序列化..........炫技的成分更多一些
从性能:dubbo的网络消耗小于springcloud,但是在国内95%的公司内,网络消耗不是什么太大问题,如果真的成了问题,通过压缩、二进制、高速缓存、分段降级等方法,很容易解
从开发难易度:dubbo的神坑是jar包依赖,开发阶段难度极大,springcloud比较自由,但带来的问题是无法“强力约束接口规范”。
从后续改进:dubbo的改进是通过dubbofilter,很多东西没有,需要自己继承,如监控,如日志,如限流,如追踪。springcloud自己带了很多监控、限流措施,但是功能可能和欧美习惯相同,国内需要进行适当改造,但更简单,就是ServletFilter而已,但是总归比dubbo多一些东西是好的
4.什么是微服务,微服务有哪几种实现方案,包含哪几个模块,Spring Cloud分别是怎么实现的?
微服务是一种架构风格,就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级机制进行通信,通常是HTTP RESTFUL API.这些服务围绕业务能力来划分构建的,并通过完全的自动化部署机制来独立部署。这些服务可以使用不同的变成语言,以及不同的数据库存储技术,以保证最低限度的集中式管理。
实现方案:
springboot+springcloud Netflix
spirngboot+dubbo+zookeeper
springboot+springcloud Alibaba
spring+tuscany
微服务主要包含以下模块:
服务注册发现(Eureka、zookeeper)
负载均衡(ribbon)
容错(Hystrix)
网关(zuul)
配置统一管理(Spring Cloud Config、Spring Cloud Bus)
链路追踪(Spring Cloud Sleuth、zipkin)
实时日志
springcloud集成了上面的模块,搭配springboot实现微服务。
5.什么是SOA,什么是SCA,什么是微服务?
SOA:Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
SCA
服务组件体系结构 (SCA) 是一个规范,它描述用于使用 SOA 构建应用程序和系统的模型。它可简化使用 SOA 进行的应用程序开发和实现工作。
动机
SCA 可简化使用 SOA 构建的业务应用程序的创建和集成。SCA 提供了构建粗粒度组件的机制,这些粗粒度组件由细粒度组件组装而成。
SCA 将传统中间件编程从业务逻辑分离出来,从而使程序员免受其复杂性的困扰。它允许开发人员集中精力编写业务逻辑,而不必将大量的时间花费在更为底层的技术实现上。
SCA 方法的优势包括:
a.简化业务组件开发
b.简化作为服务网络构建的业务解决方案的组装和部署
c.提高可移植性、可重用性和灵活性
d.通过屏蔽底层技术变更来保护业务逻辑资产
e.提高可测试性
6.Spring RMI,Spring Cloud,Tuscany,Dubbo分别是什么,互相之间有哪些不同?
spring RMI:是spring对RMI(远程方法调用的封装).
springCloud:提供了一整套微服务架构的解决方案。
Tucsany :是 SCA 规范的实现,它解除了应用程序对底层技术的依赖与耦合,应用程序不用再去关心数据的传输和对方的实现使用的什么语言。
Dubbo:是一个开源的RPC(远程过程调用协议)框架.
7.怎么实现WEB调用Service的负载均衡,怎么实现可以动态添加服务?
配置好生产者中的配置文件,打开生产者后,注册中心会动态添加生产者提供的服务到服务列表中。在springcloud中通常用Ribbon实现web调用生产者提供的服务来进行负载均衡。
8.公司内部项目里使用的Scallop是什么,和资源中心是怎么结合在一起使用实现动态增加服务的?
这个找不到资料,暂时不清楚。
遇到的问题:
1.启动服务的时候覆盖ip地址的语句没打对,消费者调用生产者的服务失败。
2.springboot -admin监测不到消费者的健康情况,是因为我把消费者部署在本地window上,没有公网ip。
明天的计划:
任务回顾:
任务一mysql的数据类型,联系比较复杂的sql语句。
复习spring的几个特性。
收获:
学会了搭建一个简易的spirngCloud项目,并完成这个项目打包上服务器上运行。
评论