在微服务架构中,服务的发现和注册至关重要。服务提供者、服务消费者、服务发现组件的关系大致如下:
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含server和client两部分。可以用它来实现微服务的注册与发现。
2.2.2.RELEASE
,springcloud版本为Hoxton.SR1
创建一个springboot项目
添加Eureka Server的起步依赖。
在启动类上加入@EnableEurekaServer
注解,声明这是一个Eureka Server 服务。
将application.properties改成application.yml,然后写入以下配置
server:
port: 8000
eureka:
client:
register-with-eureka: false #表示是否将自己注册到Eureka Server。
fetch-registry: false #表示是否从Eureka Server 拉取信息。默认为true,因为这是一个单节点的Eureka Server,所以不需要。
service-url:
defaultZone: http://localhost:8000/eureka/ #表示与Eureka Server 交互的地址。查询服务和注册服务都需要用到这个地址。多个地址可用逗号分隔。
这样一个Eureka Server 已经编写完成了,是不是很简单呢。然后启动项目,访问http://localhost:8000/
新建一个项目,或者将Server的项目拷贝过来。在启动类上添加@EnableDiscoveryClient
注解。pom文件不用变。
也可以用@EnableEurekaClient
注解,@EnableDiscoveryClient
注解为各种服务发现组件都提供了支持,而@EnableEurekaClient
只能用于Eureka,所以如果服务发现组件是Eureka的时候,两者没有区别。
在配置文件中配置
server:
port: 8001
spring:
application:
name: Eureka-Client1 #是指定client注册的服务名称。
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/ #指定要注册到哪去
然后启动项目。之前的server项目也要启动。再访问localhost:8000
,就能看到注册的实例了。
单机模式的Eureka Server显然不适合平常生产环境,虽然Eureka Server宕机之后,Eureka Client会通过缓存进行调用,但如果缓存不更新,就可能会影响到微服务的调用,甚至某些微服务不可用。这显然是不被允许的,因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。
Eureka Server 可以通过运行多个实例并相互注册。节点之间的相互注册时Eureka的默认行为。
下面来构建一个双节点的Eureka Server 集群。
方法一:两个项目不同端口
将前面的eureka-server的配置文件做些修改
去掉register-with-eureka: false
和 fetch-registry: false
添加一个注册的服务名称。如下
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://localhost:8002/eureka/ #注册到8002端口的server
spring:
application:
name: eureka-server1
将eureka-server复制一份。修改配置文件。
spring:
application:
name: eureka-server2
server:
port: 8002
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
首先修改hosts文件,后面加上server1,server2
127.0.0.1 localhost server1 server2
然后修改eureka-server的配置文件。
spring:
application:
name: eureka-servers
---
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://server2:8002/eureka/ # 注册到server2
instance:
hostname: server1
spring:
profiles: server1 # 环境是server1
---
server:
port: 8002
eureka:
client:
service-url:
defaultZone: http://server1:8000/eureka/
instance:
hostname: server2
spring:
profiles: server2
配置idea项目的运行环境。
添加一个启动配置。
一个配上serve1 一个配置server2。然后都启动。就可以看到结果。
修改eureka-client的配置文件。
server:
port: 8001
spring:
application:
name: Eureka-Client1
eureka:
client:
service-url:
defaultZone: http://server1:8000/eureka/,http://server2:8002/eureka/ #这里加了个server
然后运行。
其实这里,不配置也是一样的,只需要配置一个server就行,因为server集群间会相互注册,同步消息,数据会同步的。但是为了严谨,还是建议加上。
有的时候不希望别人(项目之外)能看到Eureka Server。就可以配置一下访问Eureka Server需要账号密码了。
在eureka-server项目的pom文件中添加security
的配置,在spring下。
spring:
application:
name: eureka-servers
security:
user:
name: user
password: 123456
输入账号密码登陆。但是要注意的一点是,配置了账号密码登陆之后,注册到这个Eureka Server的服务也需要加上账号密码。
登陆进去会发现一个注册的服务都没有,这是因为Spring Cloud 2.0 以上的security默认启用了csrf检验,必须要在eureka-server添加一个配置类,默认的关掉csrf认证。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}
这就是进入了自我保护模式的表现。
默认情况下,如果Eureka Server 在一定时间(90s)内没有接收到某个微服务的心跳,它就会注销该实例。但是当网络出现故障时,微服务与Eureka Server之间无法正常通信,这样就不应该注销这个微服务。所以Eureka Server 通过自我保护模式来解决这个问题。当Eureka Server 在短时间内丢失多个客户端的时候,那么节点就会进入自我保护模式。一旦节点进入自我保护模式,Eureka Server 就会保护服务注册表中的信息,不再删除注册表的数据,也就是不会注销该节点。当故障恢复后(能正常通信了),Eureka Server的节点就会自动退出自我保护模式。
如果为了系统项目的要求,需要禁止自我保护模式,可以在配置文件中配置。
eureka:
server:
enable-self-preservation: false
Status栏目显示的UP表示应用程序正常。但是这个也不能完全的反应应用程序的状态。如果应用程序与Eureka Server之间心跳正常,但是应用程序本身出了问题,但是没挂。这样显示就不是很准确。那就需要把微服务的健康状态传到Eureka Server。在client里配置
eureka:
client:
healthcheck:
enabled: true
这样就不会仅仅依靠心跳机制来判断是否UP了。