美文网首页
2. SpringCloud之Eureka服务注册与发现

2. SpringCloud之Eureka服务注册与发现

作者: 天还下着毛毛雨 | 来源:发表于2022-03-30 22:54 被阅读0次
    image.png

    1. eureka-server

    维护最新的服务列表,通过接收心跳的方式

    如果某个服务超出30s仍未发送心跳,不会立马从服务列表中删除服务,等待90s之后才会删除

    也可以通过下面这个配置,在运行期间会去统计心跳失败比例在 15 分钟之内是否低 于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来

    eureka.server.renewal-percent-threshold=0.85
    eureka.instance.lease-expiration-duration-in-seconds=90
    

    2. eureka-client

    eureka客户端每30秒向阳eureka服务端发送心跳
    每个客户端都会在固定时间请求eureka服务端 拉取服务列表,存储在本地
    在调用其他服务时,会根据服务列表,选择状态up的去调用

    3. eureka用户认证

    连接到 eureka的时候需要带上连接的用户名和密码 ,eureka 服务端改造

    3.1 eureka 服务端改造

    3.1.1 添加启动器
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    3.1.2 代码配置,关闭csrf验证
    @EnableWebSecurity
    //这里采坑了,一定要加哦,不然会失效
    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable(); //关闭csrf
            http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); //开启认证
        }
    }
    
    3.1.3 application.properties 配置

    开启 basic校验,设置登录用户名密码

    security.basic.enabled=true
    spring.security.user.name=admin
    spring.security.user.password=admin
    

    登录eureka界面就需要登录密码了

    3.2 Eureka 客户端改造

    跟 eureka 连接的时候要带上用户名密码

    #注册到eureka-server的地址
    eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:9001/eureka/
    

    4. 服务续约保活

    当客户端启动像 eureka服务端 注册了本身服务列表后,需要隔段时间发送一次心跳给 eureka 服务端来证明自己还活着,当 eureka 收到这个心跳请求后才会知道客户端还活着,才会维护该客户端的服务列表信息。一旦因为某些原因导致客户端没有按时发送心跳给 eureka 服务端,这时候 eureka可能会认为你这个客户端已经挂了,它就有可能把该服务从服务列表中删除掉。

    有关续约保活的配置

    4.1 客户端配置

    #服务续约,心跳的时间间隔
    eureka.instance.lease-renewal-interval-in-seconds=30
    
    #表示 eureka client 间隔多久去拉取服务注册信息,默认为 30 秒
    eureka.client.registry-fetch-interval-seconds=30
    

    4.2 服务端配置

    #如果从前一次发送心跳时间起,90 秒没接受到新的心跳,讲剔除服务
    eureka.instance.lease-expiration-duration-in-seconds=90
    
    #自我保护模式,当出现出现网络分区、eureka 在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka 也不会将其删除,默认为 true
    eureka.server.enable-self-preservation=true
    
    #Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来
    eureka.server.renewal-percent-threshold=0.85
    
    #eureka server 清理无效节点的时间间隔,默认 60000 毫秒,即 60 秒
    eureka.server.eviction-interval-timer-in-ms=60000
    

    5. Eureka 健康检测(client)

    Eureka 默认的健康检测只是你校验服务连接是否是 UP 还是 DOWN 的,然后客户端只会调用状态为 UP 状态的服务,但是有的情况下,虽然服务连接是好的,但是有可能这个服务的某些接口不是正常的,可能由于需要连接 Redis,mongodb 或者 DB 有问题导致接口调用失败,所以理论上服务虽然能够正常调用,但是它不是一个健康的服务。所以我们就有必要对这种情况做自定义健康检测.

    5.1 Application.properties 配置

    #健康检测
    eureka.client.healthcheck.enabled=true
    

    5.2 自定义健康检测代码

    @Configuration
    public class MicroWebHealthIndicator implements HealthIndicator {
    
        @Override
        public Health health() {
            //这个状态就是数据库是否连接OK
            if (OrderController.canVisitDb) {
                return new Health.Builder(Status.UP).build();
            } else {
                return new Health.Builder(Status.DOWN).build();
            }
        }
    }
    

    我们可以在 health 方法里面去连接数据库,如果连接异常了则返回 DOWN,如果没异常则方法 UP,这个 health 方法是线程去掉的,隔一段时间掉一次。

    5.3 检测检测依赖的 jar 包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    image.png

    6. 服务下线

    比如有些情况是服务主机意外宕机了,也就意味着服务没办法给 eureka 心跳信息了,但是eureka 在没有接受到心跳的情况下依赖维护该服务 90s,在这 90s 之内可能会有客户端调用到该服务,这就可能会导致调用失败。所以我们必须要有一个机制能手动的立马把宕机的服务从 eureka服务列表中清除掉,避免被服务调用方调用到。

    6.1 调 用服务下线的接口:

    这个接口是调用 eureka 服务端的接口,DELETE请求

    http://localhost:9001/eureka/apps/MICRO-WEB/localhost:micro-web:9002
    
    image.png

    这样该服务就会从服务列表删除。

    7. Eureka 高可用

    Eureka 热备份的架构图如下:


    image.png

    整个微服务中存在多个 eureka 服务,每个 eureka 服务都是相互复制的,会把客户端注册进来的服务复制到 eureka 集群中的其他节点里面来。其实简单来说就是 eureka 每个节点相互复制。

    具体配置如下:

    1. 端口为 9002 的 eureka 服务端把自己注册到 9003 的 eureka 服务端

    server.port=9002
    eureka.instance.hostname=Eureka9002
    # eureka服务端单实例配置 ,不需要像eureka注册自己,不需要从eureka注册自己
    #eureka.client.register-with-eureka=false
    #eureka.client.fetchRegistry=false
    #eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
    eureka.client.registerWithEureka=true
    eureka.client.fetchRegistry=true
    # 注册自己到服务名为Eureka9003的实例上去,并指定端口
    eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9003.com:9003/eureka/
    

    2. 同样的道理,端口为 9003 的 eureka 服务端把自己注册到 9002 的 eureka 服务端

    server.port=9003
    eureka.instance.hostname=Eureka9003
    # eureka服务端单实例配置 ,不需要像eureka注册自己,不需要从eureka注册自己
    #eureka.client.register-with-eureka=false
    #eureka.client.fetchRegistry=false
    #eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
    eureka.client.registerWithEureka=true
    eureka.client.fetchRegistry=true
    # 注册自己到服务名为Eureka9002的实例上去,并指定端口
    eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9002.com:9002/eureka/
    

    3. 两个配置文件

    image.png

    4. 在/ect/hosts 文件中配置添加实例和IP地址的映射关系,不然注册的时候 根据实例名找不到对应的ip,会报错

    127.0.0.1 Eureka9002.com
    127.0.0.1 Eureka9003.com
    

    5. 启动的时候按照指定配置文件启动

    java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=9002
    java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=9003
    

    打开两个eureka服务的监控地址,发现自身都成为对方的复制品。

    image.png image.png

    6. 注册一个订单服务到这两台eureka服务端上,发现两台eureka服务端会相互复制,持有相同同的服务列表。

    客户端注册到这两台实例上

    eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9002:9002/eureka/,http://admin:admin@Eureka9003:9003/eureka/
    
    image.png image.png

    由于集群里的每个eureka服务端都维护了相同的完整的服务列表,所以当其中一台eureka服务端挂掉后, 其他的服务还能从其他存活的eureka服务端获取到服务列表, 达到了eureka集群之间的高可用。其他服务因此得以继续保持对其他服务的发现,从而达到微服务之间的高可用。

    相关文章

      网友评论

          本文标题:2. SpringCloud之Eureka服务注册与发现

          本文链接:https://www.haomeiwen.com/subject/xwxgjrtx.html