Eureka简介
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现:
- Eureka的GitHub:https://github.com/Netflix/Eureka
- Netflix是一家在线影片租赁提供商
编写Eureka Server
1:新建Spring Boot项目Eureka,添加依赖Eureka Server
2:启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3:配置文件application.yml
server:
port: 8761
eureka:
client:
registerWithEureka: false #是否将自己注册到Eureka Server,默认为True。由于当前应用就是Eureka Server,故false
fetchRegistry: false #是否从Eureka Server获取注册信息,默认True。因为这是一个单节点的Eureka Server,不需要同步其他的Eureka Server节点,故false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认为http://localhost:8761/eureka/
4:运行测试
启动Eureka Server:Eureka
访问:http://localhost:8761/
由图可知,Eureka Server的首页展示了很多信息!
将微服务注册到Eureka Server上
1:新建Spring Boot项目Eureka1,添加依赖Eureka Client
2:启动类:
@EnableDiscoveryClient //也可使用@EnableEurekaClient注解替代@EnableDiscoveryClient
@SpringBootApplication
public class Eureka1Application {
public static void main(String[] args) {
SpringApplication.run(Eureka1Application.class, args);
}
}
3:配置文件application.yml
server:
port: 8020
spring:
application:
name: eureka1 #指定注册到Eureka Server上的应用名称
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true #将自己的IP注册到Eureka Server上,不配置或为false。则表示注册微服务所在操作系统的hostname到Eureka Server
4:新建Spring Boot项目Eureka2,添加依赖Eureka Client
5:启动类:
@EnableDiscoveryClient
@SpringBootApplication
public class Eureka2Application {
public static void main(String[] args) {
SpringApplication.run(Eureka2Application.class, args);
}
}
6:配置文件application.yml
server:
port: 8010
spring:
application:
name: eureka2
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
7:运行测试:
启动项目Eureka
启动项目Eureka1
启动项目Eureka2
可以看到Eureka1与Eureka2都已注册到Eureka Server上了;
Eureka Server的高可用
前面编写的单节点Eureka Server并不适合线上生产环境,Eureka Client会定时连接Eureka Server,获取服务注册表中的信息并缓存在本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不被更新,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用性。
Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。
1:新建Spring Boot项目Eureka3,添加依赖Eureka Server
2:启动类
@EnableEurekaServer
@SpringBootApplication
public class Eureka3Application {
public static void main(String[] args) {
SpringApplication.run(Eureka3Application.class, args);
}
}
3:配置系统的hosts(F:\Windows\System32\drivers\etc\hosts)
127.0.0.1 peer1 peer2
4:application.yml
spring:
application:
name: eureka3
---
spring:
profiles: peer1 # 指定profile=peer1
server:
port: 8761
eureka:
instance:
hostname: peer1 # 指定当profile=peer1时,主机名是peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/ # 将自己注册到peer2这个Eureka上面去
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
我们定义了peer1 和 peer2这两个Profile。当应用以peer1 这个Profile启动时,配置该主机名为peer1,并将其注册到 http://peer2:8762/eureka/;反之,当应用以peer2 这个Profile启动时,配置该主机名为peer2,并将其注册到http://peer1:8761/eureka/;
5:运行测试
以peer1 这个Profile启动
以peer2 这个Profile启动
访问:http://peer1:8761/
访问:http://peer2:8762/
将应用注册到Eureka Server集群上
1:修改项目Eureka1配置文件application.yml
server:
port: 8020
spring:
application:
name: eureka1
eureka:
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/,http://peer1:8761/eureka/
instance:
prefer-ip-address: true
2:运行测试:
由图可知,已经将微服务注册到Eureka Server集群上了。
当然,微服务即使只配置Eureka Server集群中的某个节点,也能正常注册到Eureka Server集群,因为多个Eureka Server之间的数据会相互同步:
server:
port: 8020
spring:
application:
name: eureka1
eureka:
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/
instance:
prefer-ip-address: true
运行结果与上面是一致的!
参考书籍:Spring Cloud与Docker微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!