A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 18037039769 中级黑马   /  2020-2-12 10:36  /  1501 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

SpringCloud
分布式系统,每个系统分布在各自的机器上,下单买东西,订单系统,库存系统,仓储系统,积分系统
日活10万单块系统不合适


当一个用户下订单,调用订单系统,订单系统调用库存系统,仓储系统,积分系统,等等,电商系统,拆分为了多个子系统,一个请求需要多个子系统写作完成,每个子系统完成各自的功能,
最终这个请求处理完毕。


springCloud的核心组件


Eureka :服务注册中心,心跳和故障
            各个服务提供者去服务中心注册服务《IP:PORT》,
            多个服务去Eureka中去注册服务,服务注册表中记录服务,机器信息,当服务消费方要调用服务的时候会去Eureka中拉取服务列表,
            首先 服务消费方 先去找ReadOnly缓存,发现缓存中并没有,然后又会去ReadWrite缓存中去拉取,发现也没有,最后去服务列表中去拉取,
            去服务列表中拉取后就会立即同步到ReadWrite和ReadOnly缓存中去,获取到服务列表信息后就去调用服务去了
            
           心跳线程会定时检测服务列表中的服务是否正常存活,因为服务会定时发送心跳证明自己存活,如果一个服务死掉了,心跳线程就会把服务列表中该服务信息给去除掉。
            ReadWrite缓存就会被清空掉,ReadOlny缓存还会存在原来的服务信息,但是当消费方再去调用服务的时候,会发现某个服务调用失败了,等线程定时同步ReadWrite缓存和ReadOnly缓存全部
            清空,那么下次请求就会从服务列表中再去拉取服务信息同步到缓存中去了。完成了一次全部的更新,
            加入两个缓存是为了避免并发冲突
Eureka的优化
eureka.server.responseCacheUpdateIntervalMs = 300 (刷新缓存中服务列表的时间)


eureka.client.registryFetchIntervalSeconds = 3(去注册中心拉取服务列表时间)


eureka.client.leaseRenewalIntervalInSeconds = 3 (心跳时间)
eureka.server.evictionIntervalTimerInMs = 6000(检测服务可用性时间)
eureka.instance.leaseExpirationDurationInSeconds = 90(心跳超时时间)

Eureka的服务治理强调了CAP原则中的AP,即可用性和可靠性。它与Zookeeper这一类强调CP(一致性,可靠性)的服务治理框架最大的区别在于:Eureka为了实现更高的服务可用性,牺牲了一定的一致性,极端情况下它宁愿接收故障实例也不愿丢掉健康实例,正如我们上面所说的自我保护机制。但是,此时如果我们调用了这些不正常的服务,调用就会失败,从而导致其它服务不能正常工作!这显然不是我们愿意看到的。
feign   以http协议去调用服务 通过feign技术,通知feign底层将请求转换成网络请求,然后把http请求发送到指定机器地址上去(服务调用)
Ribbon(负责负载均衡) 一个请求过来,Ribbon通过负载均衡的算法去选择需要调用的系统服务,去告诉feign,feign 就直接发送请求到Ribbon选择的机器。(可以配置权重,随机之类的,一般默认轮询)
Zuul网关:配置一下不同的请求路径和服务的对应关系
                zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能
                身份认证与安全
                动态路由
                压力测试
                负载分配
                静态响应处理
                多区域弹性
        




网关的动态路由,在数据库中设计一个表,我们自己做一个对路由信息的增删改查的小程序,来手动去数据库中操作,网关写个定时任务去定时刷新数据库获取新的路由信息

网关怎么抗高并发访问:
            zuul部署机器8核16G,对网关路由转发的请求,每秒抗几千不成问题。
            zuul前面是Nginx
一个分布式系统是由各个服务组成的,各个服务有是独立的机器,一个服务可能有多台机器部署,我们怎么去调用这些服务呢?
比如我们的电商网站由很多独立的系统机器,一个请求进来我们怎么去调用服务,首先我们要有一个注册中心,注册中心中注册由各个机器的ip地址和端口号,
当用户调用订单系统时首先先去注册中心去拉取注册中心中的服务信息,就是机器的IP、port,然后缓存在本地,用户下单后需要调用其它的服务,比如库存系统,仓储系统,积分系统
这些系统可能由多台机器部署,但是这个请求要选择哪台机器去执行操作呢,那就要通过Riboon的负载均衡底层算法去注册列表中选择一台机器去执行操作,Riboon会将选择的机器信息
传给Feign,Feign会将请求转换成http网络请求发送到指定的机器上去调用服务接口。这样一个用户请求就执行成功了




其实每个机器都会不断去拉去注册列表,注册中心只要由新的机器和服务注册进来,每个服务都会将注册列表缓存在本地中,可以配置心跳时间,默认90s



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马