Eureka原理、安全认证、优雅停服

一、Eureka注册中心架构图原理

架构图

    Register(服务注册):把自己的IP和端口注册给Eureka

    Renew(服务续约):发送心跳包,每30秒发送一次,告诉Eureka自己还活着

    Cancel(服务下线):当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务

    Get    Registry(获取服务注册列表):获取其他服务列表

    Replicate(集群中数据同步):eureka集群中的数据复制与同步

    Make    Remote    Call(远程调用):完成服务的远程调用

简图

二、CAP原则与两大主流服务框架ZK、Eureka的对比

    1.CAP原则:CAP原则又称CAP定理,指的是在一个分布式系统中,

        Consistency(一致性)、

        Availability(可用性)、

        Partition tolerance(分区容错性),三者不可兼得

    CAP由Eric  Brewer在2000年PODC会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的CAP定理

CAP定理

    2.分别表示的含义

        C:数据一致性(Consistency),也叫做数据原子性,系统在执行某项操作后仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读到最新的值,这样的系统被认为是具有强一致性的。等同于所有节点访问同一份最新的数据副本

        A:服务可用性(Availablity),每一个操作总是能够在一定的时间内返回结果,这里需要注意的是“一定时间内”和“返回结果”。一定时间内指的是,在可以容忍的范围内返回结果,结果可以是成功或者是失败

        P:分区容错性(Partition-torlerance),在网络分区的情况下,被分割的节点仍能对外提供服务(分布式集群,数据被分布存储在不同的服务器上,无论什么情况,服务器都能正常被访问)

    3.不同组合的含义

        CA,放弃P:如果想避免分区容错性问题的发生,一种做法是将所有的数据(与事务关的)都放在一台机器上。虽然无法100%保证系统不会出错,但不会碰到由分区带来的负面效果,当然这个选择会严重影响系统的扩展性

        CP,放弃A:相对于放弃“分区容错性”来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受影响的服务需要等待一定时间,因此在等待时间内系统无法对外提供服务

        AP,放弃C:这里所说的放弃一致性,并不是完全放弃数据一致性,而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩下一件库存的商品,如果同时接受了两个订单,那么较晚的订单将被告知商品告罄

        重要定律:任何分布式系统只可同时满足其中两点,无法三者兼顾


    4.Zookeeper与Eureka的区别

区别

三、Eureka的服务自我保护

    1.自我保护的条件:一般情况下,微服务在Eureka上注册后,每30秒会发送心跳包,Eureka通过心跳来判断服务是否健康,同时会定期删除超过90秒没有发送心跳的服务

    2.有两种情况会导致Eureka Server收不到微服务的心跳

        a.是微服务自身的原因

        b.是微服务于Eureka之间的网络故障

        通常(微服务的自身的故障关闭)只会导致个别服务出现故障,一般不会出现大面积故障,而(网络故障)通常会导致Eureka    Server在短时间内无法收到大批心跳

        考虑到这个区别,Eureka设置了一个阈(yu)值,当判断挂掉的服务的数量超过阈(yu)值时,Eureka        Server认为很大程度上出现了网络故障,将不再删除心跳过期的服务

    3.那么这个阈(yu)值是多少呢?

        15分钟之内是否低于85%;

        Eureka  Server在运行期间,会统计心跳失败的比例在15分钟内是否低于85%,这种算法叫Eureka    Server的自我保护模式

    4.为什么要启动自我保护?

        a.因为同时保留“好数据”与“坏数据”总比丢掉任何数据要更好,当网络故障恢复后,这个Eureka节点会退出“自我保护模式”。

        b.Eureka还有客户端缓存功能(也就是微服务的缓存功能)。即便Eureka集群中所有节点都宕机失效,微服务的Provider和Consumer都能正常通信

        c.微服务的负载均衡策略会自动剔除死亡的微服务节点

    5.关闭自我保护的方式

        修改application.properties/yml全局配置文件

配置文件

四、Eureka服务的优雅停服

    1.修改pom.xml配置文件,添加Eureka-Server的依赖

修改pom.xml配置文件

    2.修改application.properties/yml全局配置文件

        添加:

修改全局配置文件

    3.测试

        http://Eureka服务所在的IP+端口/shutdown,而且URL必须要使用dopost方式发送

        我们可以借助HttpClient工具类来实现

测试类

五、开启Eureka安全中心的安全认证

    旧版本配置方式

    1.在Eureka  Server中添加security依赖

添加依赖

    2.修改application.properties/yml全局配置文件

        开启htpp basic的安全认证

修改appication.properties,开启认证

    3.修改访问集群节点的url添加配置的用户名和密码(必然彼此之间会访问失败,集群注册失败)

修改配置的用户名和密码

    新版本(高版本)配置方式

    1.添加依赖,groupId有所差异

添加Secrity依赖

    2.修改eureka服务全局配置文件(有几个服务配置几个)

配置全局文件

    3.新建类添加@Configuration变成SpringBoot配置类,继承WebSecurityConfigurationAdapter类,重写configure方法,禁用csrf

禁用csrf

        注意,一旦开启安全认证,需要配置传递用户名和密码

        修改微服务的配置文件添加访问注册中心的用户名与密码(每个注册节点都要配置)

修改注册节点的配置文件

六、负载均衡Ribbon

    负载均衡在微服务中的作用

    1.Ribbon的概念

        a.Ribbon是一个基于Http和TCP的客户端负载均衡工具,他是语句Netflix Ribbon实现的

        b.它不像spring  cloud服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个spring cloud微服务中。包括feign提供的声明式服务调用也是基于该Ribbon实现的

        c.ribbon默认提供很多种负载均衡算法,例如轮询、随机等等,甚至包括自定义的负载均衡算法

                Ribbon解决并提供了微服务的负载均衡的问题

    2.负载均衡方案的分类

        目前业界主流的负载均衡方案可分成两类:

        第一类:集中式负载均衡,即在consumer和provider之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如nginx),由该设置负责把访问请求通过某种策略转发至provider;

        第二类:进程内负载均衡,将负载均衡逻辑集成到consumer,consuerm从服务注册中心获知由哪些地址可用,然后自己再从这些地址中选择出一个合适的provider;

两种负载均衡方式结构图

        Ribbon就属于后者,它只是一个类库,集成于consumer进程,consumer通过它来获取到provider的地址。


    3.Ribbon的负载均衡策略

        A.策略名称:轮询策略(默认)

            对应的类名: RoundRobinRule

                实现原理:轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个provider,第 1 次取第 1 个,第 2

次取第 2 个,第 3 次取第 3 个,以此类推


        B.策略名称:权重轮询策略

            对应的类名:WeightedResponseTimeRule

                实现原理:

            1.根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。

            2.原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息

足够时,给每个 provider附上一个权重,并按权重随机选择provider,高权越重的 provider会被高概率选中。


        C.策略名称:随机策略

            对应的类名:RandomRule

                实现原理:从 provider 列表中随机选择一个 provider


        D.策略名称:最少并发数策略

            对应的类名:BestAvailableRule

                实现原理:选择正在请求中的并发数最小的 provider,除非这个provider 在熔断中


        E.策略名称:在“选定的负载均 衡策略”基础上进行重 试机制

            对应的类名:RetryRule

                实现原理:

            1.“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule

            2.该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择 provider 不成功,则一直尝试采用“选定

的负载均衡策略:轮询策略”最后选择一个可用的provider


        F策略名称:可用性敏感策略

            对应的类名:AvailabilityFilteringRule

                实现原理:过滤性能差的 provider,有 2种:

            第一种:过滤掉在 eureka 中处于一直连接失败 provider

            第二种:过滤掉高并发的 provider


        G.策略名称:区域敏感性策略

            对应的类名:ZoneAvoidanceRule

                实现原理:

            1.以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider

            2.如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重。


七、Ribbon更换轮询策略

    1.创建Maven项目,添加依赖

项目结构

    2.修改启动类,在启动类中添加开启eureka客户端的注解,并编写方法创建要获取的轮询对象

修改启动类

    3.修改配置文件更换负载均衡策略

修改配置文件

八、Ribbon设置点对点连接(教学演示,不推荐使用该方式)

    1.创建项目,添加依赖,去掉Eureka相关的配置,单独添加ribbon的依赖

修改pom.xml依赖文件

    2.修改application.properties/yml全局配置文件,禁用eureka,并指定具体的服务实例清单

修改application.properties全局配置文件

    3.启动测试

测试结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容