SpringCloud--Eureka注册中心

 Spring Cloud 微服务架构学习记录与示例

SpringCloud中文官网

----------------------目录------------------------------

一、主流服务器中心对比

二、Eureka服务

  1、单例Eureka Server服务注册中心

  2、高可用集群服务注册中心

三、Eureka客户端注册服务提供者

四、Eureka客户端消费(调用)服务

五、Eureka配置优化

----------------------目录------------------------------ 

一、主流服务中⼼对⽐

 1、Zookeeper

  Zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。简单来说zookeeper本质=存储+监听通知

  Zookeeper ⽤来做服务注册中⼼,主要是因为它具有节点变更通知功能,只要客户端监听相关服务节点,服务节点的所有变更,都能及时的通知到监听客户端,这样作为调⽤⽅只要使⽤Zookeeper 的客户端就能实现服务节点的订阅和变更通知功能了,⾮常⽅便。另外,Zookeeper可⽤性也可以,因为只要半数以上的选举节点存活,整个集群就是可⽤的。

2、Eureka

  由Netflflix开源,并被Pivatal集成到SpringCloud体系中,它是基于 RestfulAPI ⻛格开发的服务注册与发现组件。

3、Consul

  Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采⽤Raft算法保证服务的⼀致性,且⽀持健康检查。

4、Nacos

  Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos就是注册中⼼ + 配置中⼼的组合,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。Nacos 是 Spring Cloud Alibaba 核⼼组件之⼀,负责服务注册与发现,
C(数据⼀致性)A(⾼可⽤)P(分区容错性)不可能同时满⾜三个,要么是AP,要么是C二、Eureka服务

  Eureka 包含两个组件:Eureka Server 和 Eureka Client,Eureka Client是⼀个Java客户端,⽤于简化与Eureka Server的交互;Eureka Server提供服务发现的能⼒,各个微服务启动时,会通过Eureka Client向Eureka Server 进⾏注册⾃⼰的信息(例如⽹络信息),Eureka Server会存储该服务的信息;

  1)图中us-east-1c、us-east-1d,us-east-1e代表不同的区也就是不同的机房
  2)图中每⼀个Eureka Server都是⼀个集群。
  3)图中Application Service作为服务提供者向Eureka Server中注册服务,Eureka Server接受到注册事件会在集群和分区中进⾏数据同步,Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信息,进⾏服务调⽤。
  4)微服务启动后,会周期性地向Eureka Server发送⼼跳(默认周期为30秒)以续约⾃⼰的信息
  5)Eureka Server在⼀定时间内没有接收到某个微服务节点的⼼跳,Eureka Server将会注销该微服务节点(默认90秒
  6)每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的⽅式完成服务注册列表的同步
  7)Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使⽤缓存中的信息找到服务提供者Eureka通过⼼跳检测、健康检查和客户端缓存等机制,提⾼系统的灵活性、可伸缩性和可⽤性。

 1、单例Eureka Server服务注册中心

  第一步、创建父项目,在项目中引入一下依赖,目的是统一Springboot的版本管理,子项目引用不需要指定版本号,注意官方的springcloud与springboot版本的关系。
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

  第二步、检测Jdk版本,jdk9版本以后需要在父项目pom中引入jaxb的依赖jar,原因是jdk9以后默认不加载jaxb模块,EurekaServer启动使用到该依赖,否则报错

 <!--引⼊Jaxb,开始-->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--引⼊Jaxb,结束-->
View Code

  第三步、在EurekaServer项目中配置依赖

    <dependencies>
        <!--Eureka server依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

  第四步、配置application.yml或者application.properties配置文件,以下为yml版本配置

#Eureka server服务端⼝
server:
  port: 8761
spring:
  application:
    #应⽤名称,会在Eureka中作为服务的id标识(serviceId)
    name: lagou-cloud-eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    #客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
    service-url:
        defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    # ⾃⼰就是服务不需要注册⾃⼰
    register-with-eureka: false
    #⾃⼰就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
    fetch-registry: false

  第五步、启动代码中添加@EnableEurekaServer注解

package city.albert;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author niunafei
 * @function
 * @email niunafei0315@163.com
 * @date 2020/9/3  4:42 PM
 * <b></>
 * @EnableEurekaServer 声明本项⽬是⼀个Eureka服务
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

  第六步、启动项目访问http://127.0.0.1:8761

 注意:

 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.

   如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;

eureka:
  server:
     enable-self-preservation: false # 关闭⾃我保护模式(缺省为打开),生产环境建议开启

 2、高可用集群服务注册中心

   高可用集群服务中Eureka相对来说比较简单,仅仅需要修改配置文件即可,注意配置如下:
#Eureka server服务端⼝
server:
  port: 8761
spring:
  application:
    #应⽤名称,会在Eureka中作为服务的id标识)集群中需要保持相同
    name: lagou-cloud-eureka-server
eureka:
  instance:
  #在集群模式中hostname要保持唯一
hostname: 唯一服务名 client: #客户端与EurekaServer交互的地址,集群模式下,也需要写其它 http://Server其他服务地址:其他服务端口/eureka,如果多个服务需要使用逗号分隔 service-url: defaultZone: http://其他服务ip或域名:其他服务端口/eureka/,http://其他服务ip或域名:其他服务端口/eureka/
     # 集群模式下需要向euraka进行注册,应为true 
   register
-with-eureka: true
   #集群模式下需要从服务器获取注册服务的信息,应该为true
   fetch
-registry: true

三、Eureka客户端注册服务提供者

第一步:在父pom中引入下面依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>

第二步:在服务提供者中添加eureka客户端依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

第三步:配置服务提供者配置文件

eureka:
  client:
    #eureka server的路径
    serviceUrl:
      #注册单实例只需要写一台服务器即可
      #集群模式下,也需要写其它 http://Server其他服务地址:其他服务端口/eureka,如果多个服务需要使用逗号分隔
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    #使⽤ip注册,否则会使⽤主机名注册了(此处考虑到对⽼版本的兼容,新版本经过实验都是ip)
    prefer-ip-address: true
    #⾃定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@

第四步:在启动类上添加服务注解

注意以下注解可以不添加,也可以同时添加,推荐添加@EnableDiscoveryClient注解即可
@EnableDiscoveryClient (推荐)//开启注册中心客户端
@EnableEurekaClient //开启eureka客户端,eureka独有客户端

第五步:启动观察注册成功

四、Eureka客户端消费(调用)服务

  前四步与“三、Eureka客户端注册服务提供者”中的相同,  

 第五步是注入DiscoveryClient客户端对象,然后进行操作获取客户端调取方式极客

其中ServiceInstance对象中的元数据为一下信息

五、Eureka配置优化

1、Eureka的元数据

Eureka的元数据有两种:标准元数据和⾃定义元数据。上面配图为标准的元数据,下面自定义元数据为Key-Value形式(在服务提供端进行配置

ServiceInstance对象中的metadata中展现形式如下

 2、心跳修改,同步数据修改

原文地址:https://www.cnblogs.com/niunafei/p/13603328.html