微服务的发现与注册--Eureka
服务提供者、服务消费者、服务发现组件三者之间的关系
1)各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息
2)服务消费者可以从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口
3)各个微服务与服务发现组件使用一定机制(例如心跳)通信。服务发现组件如长时间无法与某微服务实例通信,就会注销该实例。
4)微服务网络地址发生变更(如实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。
Eureka 简介
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。
Spring Clound将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。
Eureka的Github地址:https://github.com/Netflix/Eureka
Eureka Server
提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP,端口,微服务名称等),Eureka Server会存储这些信息
Eureka Client
Eureka Client是一个java客户端,用于简化与Eureka Server的交互。微服务启动后,会周期性(默认30秒)地向Eureka Server发送心跳以续约自己的“租期”。
如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)
编写Eureka Server
1)创建一个ArtifacId是Maven工程,添加以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
2)编写启动类,在启动类上添加@EnableEurekaServer注解,声明这是一个Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3)在配置文件application.yml中添加以下内容
server:
port: 9999
eureka:
instance:
hostname: 127.0.0.1
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
说明:
registerWithEureka:表示是否将自己注册到Eureka Server,默认为true.
fetchRegistry:表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server的数据,故设为false.
defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。多个地址可用,分隔。
这样一个Eureka Server就编写完成了。
将微服务注册到Eureka Server
1)在微服务项目里pom.xml添加以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2)配置文件aplication.yml中添加以下配置
spring:
application:
name: microservice-provider-user # 应用名
eureka:
client:
service-url:
defaultZone: http://localhost:9999/eureka
instance:
prefer-ip-address: true
3)编写启动类,添加@EnableDiscoveryClient注解声明这是一个Eureka Client.
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(LicenseApplication.class, args);
}
}