Eureka服务注册中心
服务发现是基于微服务架构中的一个重要原则。Eureka既是服务端也是客户端。Eureka服务端可以部署成为高可用,每一个服务器都会复制注册的服务状态到其他服务器。
Eureka环境搭建
Eureka的搭建使用Spring Boot框架,首先在pom.xml中引入需要的依赖。
这里SpringBoot使用的是2.0.6版本
<!-- Spring Boot 父引用,有此配置当前应用才算是Spring Boot应用,该配置会继承大量的Spring Boot插件 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Spring Cloud使用Finchley.RELEASE版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud-task.version>2.0.0.RELEASE</spring-cloud-task.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<logback-gelf.version>2.0.0</logback-gelf.version>
</properties>
spring-cloud-starter-netflix-eureka-server使用的是2.0.2.RELEASE版本。
<!-- 依赖 Spring Cloud Netflix Eureka Server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
然后再应用启动类上加上注解@EnableEurekaServer。
启动后通过服务端管理页面查看注册的基本信息http://IP:PORT(默认8761)。
单机环境搭建
application.yml配置如下
server:
port: 8761
spring:
application:
name: register-center
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 测试时关闭自我保护机制,保证不可用服务及时剔除
enable-self-preservation: false
# 剔除失效服务间隔,默认60000
eviction-interval-timer-in-ms: 3000
# registerWithEureka、fetchRegistry两个参数是禁用把自己当成Eureka客户端的。
# registerWithEureka:false.取消向注册中心注册
# fetchRegistry:false.取消向注册中心获取注册信息(服务、实例信息)
启动时直接启动即可,默认加载的是application.yml配置文件。
高可用环境搭建-同伴意识
Eureka可以运行多个实例,来保证高可靠和高可用,让他们彼此注册。这是默认的行为,所以你需要做的只是为对方添加一个有效的serviceUrl。以两个peer构成一个集群为例,有效配置如下:
创建application-eureka1.yml,配置如下:
server:
port: 8761
spring:
application:
name: register-center
profiles: eureka1
eureka:
instance:
# 配置通过主机名方式注册
hostname: eureka1
client:
service-url:
defaultZone: http://eureka2:8762/eureka/
register-with-eureka: true
fetch-registry: true
server:
# 关闭保护机制,默认true
enable-self-preservation: false
# 剔除失效服务间隔,默认60000
eviction-interval-timer-in-ms: 3000
创建application-eureka2.yml,配置如下:
server:
port: 8762
spring:
application:
name: register-center
profiles: eureka2
eureka:
instance:
# 配置通过主机名方式注册
hostname: eureka2
client:
service-url:
defaultZone: http://eureka1:8761/eureka/
register-with-eureka: true
fetch-registry: true
server:
# 关闭保护机制,默认true
enable-self-preservation: false
# 剔除失效服务间隔,默认60000
eviction-interval-timer-in-ms: 3000
建议使用域名,上述两个配置都是使用的域名,因此需要先配置hosts:
127.0.0.1 eureka1
127.0.0.1 eureka2
按照如上配置,实现两个注册中心实例相互注册,你中有我,我中有你。
启动Eureka-IDEA方式
配置启动项如下后,再启动各个实例。
启动Eureka-生产环境命令行方式
java -jar xxx.jar --spring.profiles.active=8761
java -jar xxx.jar --spring.profiles.active=8762
分别访问eureka1:8761/,eureka2:8762/,可以在registered-replicas
看到都相互注册了,available-replicas
可用分片中可以看到相应的节点,停止一个另一个还可以工作。若available-replicas没有相应节点,则是因为eureka.client.register-with-eureka/eureka.client.fetch-registry为false。
启动应用实例
从上图中也可以看到启动了服务网关实例,通过两个注册中心实例中的任意一个都能看到,说明其已经成功注册到注册中心集群中。
注意:若第一个启动的eureka实例报错,这种情况可能是正常的,因为第一个启动的找不到注册中心去注册。等待一段时间,等到他要注册的eureka实例启动了,如果他能够连接注册上去且不会继续报错就是正常的。
参考文章:
https://cloud.tencent.com/developer/article/1328027
https://cloud.tencent.com/developer/article/1081556
https://yq.aliyun.com/articles/693077
服务下线相关参考:
eureka开发时快速剔除失效服务:https://blog.csdn.net/haveqing/article/details/88406592
eureka的几种主动下线服务方式:https://blog.csdn.net/xiaobao5214/article/details/81263445
eureka如何剔除服务:https://jingyan.baidu.com/article/ca00d56c09d971e99eebcfd6.html
eureka强制下线:https://blog.csdn.net/u012394095/article/details/80996172