spring cloud(3)注册中心

注册中心


什么是注册中心:

       理解注册中心:服务管理,核心是有个服务注册表,心跳机制动态维护

       服务提供者provider: 启动的时候向注册中心上报自己的网络信息                    

       服务消费者consumer: 启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息

为什么要用:

       微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题

主流的注册中心:

              zookeeper、Eureka、consul、etcd 等


CAP理论知识


CAP定理: 三选二

       指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得。 

       一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(所有节点在同一时间的数据完全一致,越多节点,数据同步越耗时) 

用户下单之后同步到多个从库中去,写时可能是主库再用PC登录时读到的是从库。主从数据要一致

       可用性(A):负载过大后,集群整体是否还能响应客户端的读写请求。(服务一直可用,而且是正常响应时间)

       分区容错性(P):分区容错性,就是高可用性,一个节点崩了,并不影响其它的节点(100个节点,挂了几个,不影响服务,越多机器越好)

       CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡


CAP原理常见面试题和注册中心选择


C A 满足的情况下,P不能满足的原因:(机器不能多)

              数据同步(C)需要时间,也要正常的时间内响应(A),那么机器数量就要少,所以P就不满足

             

CP 满足的情况下,A不能满足的原因:(规定时间不能响应)

              数据同步(C)需要时间, 机器数量也多(P),但是同步数据需要时间,所以不能再正常时间内响应,所以A就不满足

AP 满足的情况下,C不能满足的原因:(复制不完)

              机器数量也多(P),正常的时间内响应(A),那么数据就不能及时同步到其他节点,所以C不满足


注册中心选择:

              Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举行的leader,或者半数以上节点不可用,则无法提供服务,因此可用性没法满足


              Eureka:AP原则,无主从节点,一个节点挂了,自动切换其他节点可以使用,去中心化

     


结论:分布式系统中P,肯定要满足,所以只能在CA中二选一

              没有最好的选择,最好的选择是根据业务场景来进行架构设计

              如果要求一致性,则选择zookeeper,如金融行业(某些也要可用)

              如果要去可用性,则Eureka,如电商系统(某些也要一致)

 


Eureka介绍


版本问题

最好按官网上推荐的来,否则会有小的差别出现版本不兼容的情况发生

https://spring.io/projects/spring-cloud#overview


Eureka  1.x

2.x闭源

参考  :  https://www.jianshu.com/p/d32ae141f680

               https://blog.csdn.net/zjcjava/article/details/78608892


每一个可以当成一个boot应用


Eureka Server搭建

IDEA搭建Eureka服务中心Server端并启动,项目基本骨架介绍

 

官方文档:

http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#spring-cloud-eureka-server

第一步:创建项目    

第二步: 添加注解 @EnableEurekaServer 

第三步:增加配置application.yml

              server:

                port: 8761

              eureka:

                    instance:

                         hostname: localhost

                       client:

                       #声明自己是个服务端

                         registerWithEureka: false

                         fetchRegistry: false     //获得注册

                         serviceUrl:

                           defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

       第四步:访问注册中心页面

       maven地址: https://www.cnblogs.com/sword-successful/p/6408281.html


Eureka-client

搭建用商品服务,并将服务注册到注册中心

       1、创建一个SpirngBoot应用,增加服务注册和发现依赖    

       2、模拟商品信息,存储在内存中

       3、开发商品列表接口,商品详情接口

       4、配置文件加入注册中心地址

       使用eureka客户端 官方文档:

http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#netflix-eureka-client-starter


相关的代码和配置

@Service
public class ProductServiceImpl implements ProductService {
    /**
     *
     * 功能描述: 通过一个hashMap来模拟dao
     *
     * @param:
     * @return:
     * @auther: 
     * @date: 2019/6/14 15:18
     */
    private static final Map<Integer,Product> daoMap =new HashMap<>();
    static {
        Product p1=new Product(1,"iphonrx",9999,10);
        Product p2=new Product(2,"冰箱",998,10);
        Product p3=new Product(3,"耳机",999,110);
        Product p4=new Product(4,"ThinkPad",19999,100);
        Product p5=new Product(5,"手表",99999,20);
        Product p6=new Product(6,"打印机",299,1000);
        Product p7=new Product(7,"电视",29999,200);
        daoMap.put(p1.getId(),p1);
        daoMap.put(p2.getId(),p2);
        daoMap.put(p3.getId(),p3);
        daoMap.put(p4.getId(),p4);
        daoMap.put(p5.getId(),p5);
        daoMap.put(p6.getId(),p6);
        daoMap.put(p7.getId(),p7);
    }

    @Override
    public List<Product> listProduct() {
        Collection<Product> collection=daoMap.values();
        List<Product> list=new ArrayList<>(collection);

        return list;
    }

    @Override
    public Product findById(int id) {
        return daoMap.get(id);
    }
}

controller和接口 和商品类省略

相关的配置

server:
  port: 8771

  #---------------------------------------------eureka----------------------------------
  #指定注册中心的地址
  eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  #服务的名称
spring:
  application:
    name: product-service

eureka localhost:8761 下可以看刚才写的Product-service


接下来再开启一个product-service的client端

此时就会看到两个服务在注册中心中


Eureka服务注册中心配置控制台问题处理


eureka管理后台出现一串红色字体:是警告,说明有服务上线率低

       EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

       关闭检查方法:eureka服务端配置文件加入

       server:

           enable-self-preservation: false

    注意:生产环境自我保护模式禁止关闭,默认是开启状态true

当注册端挂掉,启动的服务应用会报错

       问题二:为什么只加一个注册中心地址,就可以注册


猜你喜欢

转载自blog.csdn.net/qq_29235677/article/details/91871338
今日推荐