为了解决硬编码的遗留问题,需要服务注册与发现机制来解决这些问题。

服务注册与发现机制的作用:记录每个服务提供者的网络信息,向服务消费者提供所需服务网络信息。


一、服务发现组件

服务提供者、服务消费者、服务发现组件三者之间的关系:

1、每一个为服务启动的时候都会将自己的网络信息注册到服务发现组件中,服务发现组件将这些信息进行存储;

2、服务消费者从服务发现组件中查询服务提供者的网络信息,并使用这些信息对服务提供者进行访问;

3、每个微服务与服务发现组件之间通过存在通信机制,当服务发现组件长时间无法与某微服务进行联系,服务发现组件会将该实例注销;

4、微服务的网络信息进行变更时,会重新注册到服务发现组建中,该服务的调用方无需修改提供者的信息。


服务发现组件基本功能:

1、服务注册表:这是服务发现组件的核心。用来记录各个微服务的信息,包括微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册与注销;

2、服务注册与发现:

    服务注册:微服务启动时将信息注册到服务发现组件中的过程;

    服务发现:查询可用的微服务列表及其网络信息的机制

3、服务检查:使用一定的机制检测服务的有效性,如果检测到某微服务已经挂掉会自动将该实例注销。


二、Eureka

Eureka是springcloud提供的一种服务发现组件。

1、Eureka Server 和 Eureka client

Eureka包含两个组件:Eureka Server 和 Eureka client,二者关系如下:

Eureka Server提供了服务发现与注册的机制,微服务启动时会向Eureka Server注册自己的信息,Eureka Server会将这些信息进行存储。

微服务启动后,会在指定间隔(默认30秒)向Eureka Server发送心跳,表明服务正在运行;

如果Eureka Server长时间(默认90秒)没有收到来自某微服务的心跳,Eureka Server就会注销这个实例;

Eureka client缓存了服务注册表的信息。微服务无需每次都向Eureka Server查询服务状态,减轻了Eureka Server的压力。同时,如果Eureka Server挂掉,微服务依然可以从缓存中获取到服务提供者的网络信息并完成调用。


三、编写Eureka Server

项目结构如下:

springCloud入门学习(三):服务注册与发现_第1张图片

添加pom依赖:


   org.springframework.cloud
   spring-cloud-starter-eureka-server

启动类添加注解:

@SpringBootApplication
@EnableEurekaServer  //表明自己是一个Eureka Server
public class EurakaApplication {

   public static void main(String[] args) {
      SpringApplication.run(EurakaApplication.class, args);
   }

}

yml文件中添加配置:

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false #表示是否将自己注册到Eureka Server中,默认为true。由于本项目就是一个Eureka Server,故此处设为false
    fetch-registry: false #表示是否从其他Eureka Server中获取信息,由于此处为单点Eureka Server,设为false即可
    service-url:
      default-zone:  # 设置与Eureka Server的交互地址,查询与注册服务都需要用到该地址,多个地址可以使用","分隔

此时启动项目并且访问http://localhost:8716/,得到如下页面,此时还没有任何微服务注册进来。

springCloud入门学习(三):服务注册与发现_第2张图片


四、将微服务注册到Eureka Server中

还以user项目为例:

pom依赖:


   org.springframework.cloud
   spring-cloud-starter-eureka-server

yml文件:

spring:
  application:
    name: user # 指定注册到Eureka Server中的应用名字
eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #是否将自己的IP注册到Eureka Server中,如果不配置或设置为false,会将微服务所在的操作系统的hostname注册到Eureka Server

启动类添加注解:

@SpringBootApplication
@EnableEurekaClient //声明自己是一个注册服务
public class UserApplication {

   public static void main(String[] args) {
      SpringApplication.run(UserApplication.class, args);
   }

}

此时启动项目并且再次访问:http://localhost:8716/,得到如下页面:

springCloud入门学习(三):服务注册与发现_第3张图片

此时用户微服务已经注册到Eureka Server中。