【SpringCloud学习】Eureka服务注册与发现、Ribbon负载平衡、CAP原则

Eureka服务注册与发现

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是基于Rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不用修改服务调用的配置文件了,类似Dubbo的注册中心,比如zookeeper.

  • Eureka包含两个组件:Eureka Server 和Eureka Client

  • Eureka Server提供服务注册服务,各个节点启动后,服务节点的信息可以再界面中直观的看到

  • Eureka Client是一个java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会想EurekaServer发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉(默认周期90秒)

  • 三大角色

    • Eureka Server:提供服务的注册与发现。 类似ZK
    • Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
    • Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。

Eureka有自我保护机制,当某个微服务不可以用了,Eureka不会马上清理,在自我保护模式中,EurekaServer会保护服务注册中的信息,不再注销任何服务实例。有个心跳检测机制(90s),当该微服务在此期间重新注册,Eureka会退出保护机制。

禁用自我保护机制(建议不要关)eureka.server.enable-self-preservation=false

套路:

1、导入pom依赖

2、添加配置

3、开启功能 Enable

注册中心是server,相对来说,服务提供者是client,到注册中心去注册服务。 服务消费者也是client,到注册中心发现服务。

一、配置Eureka 注册中心

1、导入pom.xml依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>3.0.1</version>
        </dependency>

2、添加配置

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: false #向eureka注册中心注册自己, 这里是实现注册中心,所以不用注册自己
    fetch-registry: false #false表示自己是注册中心
    service-url: #监控页面地址
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

​ defaultZone监控的其他注册中心地址,自己的地址不用写,其他注册中心会把自己注册。

3、开启功能 @EnableEurekaServer
请添加图片描述

集群环境配置
请添加图片描述
注册中心集群,一个注册中心崩了,其他注册中心仍然可以使用,消费者只需要切换下地址就行

每个注册中心 要注册到其他的注册中心,就能形成互联

服务提供者Client 则把服务注册到所有的注册中心。

消费者请求调用时,还是跟原来一样,用Rest远程调用地址,不过不是调用服务的IP地址,而是在注册中心寻找对应服务名的接口。

这里为了模拟集群,创建3个Eureka注册中心,配置即把端口号改一改,其中一个注册中心崩了,消费者还是可以从其它注册中心调用。

请添加图片描述

二、配置服务提供者

1、导入pom.xml依赖

 <!--加入Eureka依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!--actuator用于完善监控信息-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.6.4</version>
        </dependency>

2、修改配置

#eureka配置,服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: springcloud-provide-dept8001 #修改eureka上的默认描述信息

#info配置
info:
  app.name: freeze-app
  company: Tencent

​ info信息用于公司开发时,团队其他人可能需要看到服务的信息

请添加图片描述

3、开启功能@EnableEurekaClient

请添加图片描述

为了体现负载均衡机制,这里创建三个服务提供者,分别对应三个数据库,表内db_source的字段对应数据库名,其它信息相同。

请添加图片描述

三、配置服务消费者

1、配置pom.xml

 <!--Ribbon 新版本Eureka已经包含Ribbon-->
        <!--Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.0.1</version>
        </dependency>

​ 后面使用到的Ribbon的依赖在新版本的eureka client中已经包含,所有不用导入Ribbon(会500出错)

2、添加配置

#Eureka
eureka:
  client:
    register-with-eureka: false #消费者不用向Eureka注册自己,只需要去拿服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

这里要把所有注册中心的地址都加上,从每个注册中心发现服务。

3、开启功能@EnableEurekaClient 与服务提供者一样

4、Controller调用服务的地址修改,之前使用的服务提供者的ip地址直接调用(没有用注册中心),用Ribbon时,服务请求的地址应是一个变量(可以从不同的注册中心请求服务),所以通过服务名进行访问(相同服务的服务名需保持一致)

//用Ribbon时,服务请求的地址应该是一个变量,通过服务名来访问
    //private static final String REST_URL_PREFIX="http://localhost:8001";//前缀固定的
    private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";

5、RestTemplat添加一个 负载平衡的注解@LoadBalanced 默认轮询机制。可以自定义负载平衡机制

请添加图片描述

自定义Ribbon 负载均衡策略时, 这个自定义的类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化指定的目的了。

四、测试负载平衡机制

每次调用服务时,会轮流请求不同的服务提供者的接口。

Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端负载均衡的工具

负载均衡:将用户的请求平摊地分配到多个服务上,从而达到HA(高可用)

负载均衡简单分类:

  • 集中式LB
    • 即在服务的消费方和提供方之间使用独立的LB设施,如Nginx:反向代理服务器,由该设施负责把访问请求通过某种策略转发至服务的提供方
  • 进程式LB
    • 将LB逻辑集成到消费方,消费方从服务注册中心获知哪些地址可用,然后自己再从这些地址中选出一个合适的服务器
    • Ribbon就属于进程式LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

Ribbon和Eureka整合以后,客户端可以直接调用,不用关心服务提供的IP地址和端口好。原本单机的时候,是直接写死服务地址的。

请添加图片描述

CAP原则

C(Consistency) 强一致性

A(Availability) 可用性

P(Partition tolerance) 分区容错性

CAP三进二:CA CP AP 不能同时满足3个条件

分区容错性P在分布式系统中是必须要保证满足的,因此只能在A,C中权衡

Zookeeper是保证CP Eureka是保证AP

Eureka可以很好的应对网络故障导致的部分节点失去联系,而不会像zk使整个服务瘫痪

猜你喜欢

转载自blog.csdn.net/adminguojieBin/article/details/123510582