springCloud之eureka

一、介绍

  • Spring-Cloud Euraka介绍

    Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。

    在项目中使用Spring Cloud Euraka的原因是它可以利用Spring Cloud Netfilix中其他的组件,如zull等,因为Euraka是属于Netfilix的。

  • Euraka介绍

    Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。

  • Eureka Server 提供服务注册和发现 Service Provider
  • 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到 Service
  • Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
  • Eureka与Zookeeper比较

    首先介绍下cap原理,可以参考:http://www.ruanyifeng.com/blog/2018/07/cap.html。

    P:Partition tolerance,网络分区容错。类似多机房部署,保证服务稳定性。
    A: Availability,可用性。
    C:Consistency ,一致性。
    CAP定理:CAP三个属性对于分布式系统不同同时做到。如AP/CP/AC。再来看Zookeepr区别:

    (1)Zookeeper是CP,分布式协同服务,突出一致性。对ZooKeeper的的每次请求都能得到一致的数据结果,但是无法保证每次访问服务可用性。如请求到来时,zookeer正在做leader选举,此时不能提供服务,即不满足A可用性。

    (2)Euere是AP,高可用与可伸缩的Service发现服务,突出可用性。相对于Zookeeper而言,可能返回数据没有一致性,但是保证能够返回数据,服务是可用的。

    这里有篇文章介绍为什么服务发现使用Eureka,而不是Zookeeper。http://dockone.io/article/78

二、部署Eureka Server

  • 新建项目,选择Eurek Server组件
    在这里插入图片描述

  • 启动类

    通过@EnableEurekaSwerver来标识该服务为Eureka Server。

    @SpringBootApplication
    @EnableEurekaServer
    public class CloudEurekaApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(CloudEurekaApplication.class, args);
    	}
    
    }
    
  • 配置application.yml

    server:
      port: 7900
    spring:
      application:
        name: eureka
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          defaultZone: http://localhost:7900/eureka/
    
  • admin页面属性
    启动,访问http://localhost:7900
    在这里插入图片描述

三、部署Eureka Client

  • Eureka Client包括两个服务模块:Service Provider(服务提供方)和Service
    Consumer(服务消费方)。

  • Eureka Client和Eureka Server目录类似, 不同点在于:

    启动类,使用@EnableDiscoveryClient 标识该服务为Euraka Client 配置文件,需要指定Euraka
    Server地址和当前服务注册时的名称。

  • 问题:关于Servie Customer是否需要在Euraka Server中进行注册呢?
    不一定。Service Customer只是从Eureka Serve中获取注册服务的地址信息,如果Service Customer 本身也是一个Service Porvider,那么此时就需要注册服务了。
    在这里插入图片描述

四、eureka的一些优化

  • 修改配置
server:
	# 自我保护,默认为开启,在服务少时可优化为关闭。。服务多时请勿关闭(避免发生那些因为网络问题而被剔除出去的服务器本身是很”健康“)
	enable-self-preservation: false
	# 自我保护阈值
	renewal-percent-threshold: 0.85
	# 剔除服务时间间隔
	eviction-interval-timer-in-ms: 1000
	# 关闭从readOnly读注册表缓存
	use-read-only-response-cache: false
	# readwrite 和 readOnly 同步时间间隔
	response-cache-update-interval-ms: 1000

五、Eureka操作

  1. 查看服务实例信息。格式如下

    /eureka/apps/{appName}
    

    举例如下:

    方法 GET
    接口 http://localhost:7900/eureka/apps/API-PASSENGER
    

    结果为

    <application>
        <name>API-PASSENGER</name>
        <instance>
            <instanceId>DESKTOP-5A72R4E:api-passenger:8080</instanceId>
            <hostName>DESKTOP-5A72R4E</hostName>
            <app>API-PASSENGER</app>
            <ipAddr>192.168.1.5</ipAddr>
            <status>UP</status>
            <overriddenstatus>UNKNOWN</overriddenstatus>
            <port enabled="true">8080</port>
            <securePort enabled="false">443</securePort>
            <countryId>1</countryId>
            <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <leaseInfo>
                <renewalIntervalInSecs>30</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1621049122335</registrationTimestamp>
                <lastRenewalTimestamp>1621049242067</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1621049121731</serviceUpTimestamp>
            </leaseInfo>
            <metadata>
                <management.port>8080</management.port>
            </metadata>
            <homePageUrl>http://DESKTOP-5A72R4E:8080/</homePageUrl>
            <statusPageUrl>http://DESKTOP-5A72R4E:8080/actuator/info</statusPageUrl>
            <healthCheckUrl>http://DESKTOP-5A72R4E:8080/actuator/health</healthCheckUrl>
            <vipAddress>api-passenger</vipAddress>
            <secureVipAddress>api-passenger</secureVipAddress>
            <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
            <lastUpdatedTimestamp>1621049122335</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1621049121523</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
        </instance>
    </application>
    
  2. 下线操作

    2.1. 客户端直接停止服务

    下线
    	这种方式没有办法立刻让注册中心感知到,需要注册中心等待某一时间没有收到心跳之后,才将这个服务从注册列表中移除。
    恢复上线
    	此种方式下对应上线操作,就是重新部署。
    

    2.2 客户端通知Eureka下线

    下线
    	使用actuator由客户端(记住是客户端发起,不是服务端发起)发起下线。调用客户端actuator提供的/shutdown/接口。执行完此操作之后,不仅停止了服务,还从eureka下线了。
    (1)在项目中引用actuator:
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-actuator</artifactId>
    		</dependency>
    (2)配置文件中添加
    		#启用shutdown
    		endpoints.shutdown.enabled=true
    		#不进行密码验证(线上环境应该设置为true)
    		management.security.enabled=false
    (3)通过POST方式执行实例的http://localhost:8080/shutdown。在postman执行结果如下:
    

    2.3 Eureka的delete操作

    下线
    	delete格式为:
    	方法:DELETE
    	接口:/eureka/apps/{appName}/{instanceID}
    例如:
    	http://localhost:7900/eureka/apps/API-PASSENGER/DESKTOP-5A72R4E:api-passenger:8080
    
    	注意:Eureka客户端每隔一段时间(默认30秒)会发送一次心跳到注册中心。在通过delte方式下线一个服务时,如果没有停掉的该服务,那么该服务很快就又会注册到Eureka。所以在使用这种方式时,可以先kill掉服务,然后再执行delete操作,从注册中心移除改服务。
    

    2.4 设置Eureka的服务实例状态
    有时候我们下线服务实例之后,需要在不重新部署服务实例的情况下,重新上线服务实例。此时就使用这种方式。

    下线
    	接口方式如下
    	方法:PUT
    	接口:/eureka/apps/{appName}/{instanceId}/status?value=OUT_OF_SERVICE
    

    执行结果如下图,改实例状态变为OUT_OF_SERVICE 在这里插入图片描述

    恢复上线
    	接口方式如下:
    	方法: DELETE
    	接口: /eureka/apps/{appName}/{instanceId}/status?value=UP
    

    执行后的结果为,服务实例重新上线,状态为”UP”
    在这里插入图片描述

六、eureka的集群部署

	官方给的有例子
	https://docs.spring.io/spring-cloud-netflix/docs/3.0.2/reference/html/#spring-cloud-eureka-server-peer-awareness
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值