SpringCloud-组件

服务注册中心

Eureka组件

一、Eureka概述

eureka作为Springcloud项目的服务注册与发现组件。

采用CS的设计模式,Eureka Server作为服务注册功能的服务器,是注册中心,系统中的其他微服务,作为Eureka的客户端(Eureka Client)连接到 Eureka Server 并维持心跳连接。

维护人员可以通过注册中心,查看系统中的各个微服务是否正常运行。

Eureka包含了两个组件:

  • Eureka Server:提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  • Eureka Client:一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器

在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

二、单机版Eureka

  • 1、创建Eureka注册中心模块

  • 2、引入eureka server坐标依赖

    <!-- 引入 eureka-server 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 3、编写application.yml配置文件

    server:
      port: 7001
    eureka:
      instance:
      # eureka服务端的实例名称
      	hostname: localhost
      client:
        # false表示不向注册中心注册自己
        register-with-eureka: false
        # false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
        fetch-registry: false
        service-url:
          # 与eureka服务交互的地址,查询服务和注册服务都是通过该地址进行
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
  • 4、主启动类添加@EnableEurekaServer注解

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaMain7001 {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class,args);
        }
    }
    
  • 5、启动项目,访问项目路径,能出现eureka页面,表示项目没问题。

三、微服务服务注册到Eureka Server

  • 1、引入eureka client坐标依赖

    <!--引入eureka client 依赖-->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 2、application.yml文件中添加eureka配置

    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
        	# eureka注册中心地址
        	defaultZone: http://localhost:7001/eureka
    
  • 3、主启动类添加@EnableEurekaClient注解

    @SpringBootApplication
    @EnableEurekaClient
    public class PaymentMain8001 {
    
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class,args);
        }
    }
    
  • 先启动EurekaServer模块,再启动注册的模块,查看eureka页面中是否能检索到该微服务。

四、集群版Eureka

集群版为多个Eureka服务相互注册,避免由单一注册中心引发的单点故障。

  • 1、搭建另一个端口为7002的Eureka单体版服务

  • 2、修改hosts文件,实现端口映射

    • 地址:C:\Windows\System32\drivers\etc

    • 添加内容:

      ###### springcloud ######
      127.0.0.1	eureka7001.com
      127.0.0.1	eureka7002.com
      
  • 3、修改配置,改为集群配置。

    • hostname改为唯一名称

      eureka:
        instance:
        # eureka服务端的实例名称
        # hostname: localhost
          hostname: eureka7001.com
      
    • 交互地址,改为其他eureka服务地址,多个用逗号分隔。

      将该eureka服务注册到其他eureka注册中心中去。

      eureka:
        client:
          service-url:
            # 与eureka服务交互的地址,查询服务和注册服务都是通过该地址进行
            #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
            defaultZone: http://eureka7002.com:7002/eureka/
      
  • 4、其余客户端微服务,注册到eureka集群,通过修改配置文件。

    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          #defaultZone: http://localhost:7001/eureka
          # 配置eureka集群设置
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    

五、Eureka注册服务信息补全

  • 1、自定义微服务项目显示名称

    eureka:
      instance:
        instance-id: payment8001
    
  • 2、微服务项目连接显示ip地址

    eureka:
      instance:
        prefer-ip-address: true  #访问地址支持ip显示
    

六、服务发现Discovery

对于注册进Eureka里面的微服务,可以通过服务发现来获得该服务的信息

  • 通过依赖注入的方式获取DiscoveryClient对象

    import org.springframework.cloud.client.discovery.DiscoveryClient;
    
    @Resource
    private DiscoveryClient discoveryClient;
    
  • 获取所有注册到eureka中的微服务名称

    List<String> services = discoveryClient.getServices();
    for (String service : services) {
        System.out.println("****service: " + service);
    }
    
  • 根据微服务名称获取该服务下的项目或者集群的具体信息

    List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
    for (ServiceInstance instance : instances) {
        System.out.println(instance.getServiceId()+instance.getHost()+instance.getPort()+instance.getUri());
       
    }
    
  • 在主启动类上添加服务发现客户端注解:@EnableDiscoveryClient