Eureka服务注册中心
最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样。要想很短时间内掌握Spring Cloud是不可能的,小编就学习一块就在这里分享一块,有什么不对的地方,大家一起指正。
一、简介
服务发现是基于微服务架构中的一个重要原则。Eureka既是服务端也是客户端。Eureka服务端可以部署成为高可用,每一个服务器都会复制注册的服务状态到其他服务器。
二、搭建Eureka Server
搭建项目我们使用Spring Boot。在pom.xml中引入spring-cloud-starter-netflix-eureka-server。如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后在启动类中加上注解
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class, args);
}
}
服务端有一个管理主页,如图:
三、高可用、区域和地区
Eureka server没有后端的存储,但是注册表里的每一个服务实例都发送心跳保持注册表里的服务是最新的(这些都是在内存中做的)。Eureka client也有一份在内存中的Eureka注册缓存(每一个请求不必每次都去注册表里找服务)。默认的,每一个Eureka server也是一个Eureka client,并且需要一个服务的url定位对等体。如果不提供这个服务url,服务仍然可以运行和工作,但是你的日志中会有大量的对等体不能注册的log。
四、单机模式
客户端与服务端和心跳使得单独的Eureka server对故障有容错性。在单机模式下,你可能更喜欢关闭客户端行为,因此不会继续尝试注册其对等体。
application.properties的示例如下:
server:
port: 8761 eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
serviceUrl指向了相同的主机。
五、同伴意识
Eureka可以运行多个实例,来保证高可靠和高可用,让他们彼此注册。这是默认的行为,所以你需要做的只是为对方添加一个有效的serviceUrl。例如:
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2/eureka/ ---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1/eureka/
上面的例子中,我们可以把一段代码运行到两个实例上,可以通过spring.profiles.active来区分不同的配置。你也可以在一个系统中添加多个同伴(peer),只要他们彼此之间至少有一个边彼此连接,他们之前就能同步注册中心。如果同伴间放在不同的数据中心,有可能出现脑裂现象。
说实话,多个实例到底怎么彼此连接,小编也没有看懂,官网上只给出了两个实例的例子,多实例还要下去实验。
六、更喜欢ip地址
Eureka 更喜欢ip地址的服务,而不是主机名(hostname)。可以设置eureka.instance.preferIpAddress=true,当应用用Eureka注册时,它将使用ip地址。
小编只做了一个单机模式的例子,GitHub地址为:https://github.com/bigbugliu/spring-cloud-eureka-server。多实例的配置,大家一起做实验吧。