Fork me on GitHub

SpringCloud Eureka---服务注册与发现

1 创建服务注册中心

在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,Eureka 是一个服务注册和发现模块。

1.1 创建maven工程

1

2

这样工程就创建完成了。

1.2 启动服务注册中心

在启动程序出加上@EnableEurekaServer注解即可

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}

}

这时候启动程序会报错

3

这是因为eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server既是一个server也是一个eureka client ,对于一个client来说必须要指定一个 server。

配置application.yml文件,把自己注册到自己上就可以(应用刚启动可能注册不上,注册的过程是一个发送心跳的过程,隔一段时间就会进行注册,这时候就会注册成功)

再启动还是有错误的,因为在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。使用

register-with-eureka: false

fetch-registry: false禁止掉即可

4

1
2
3
4
5
6
7
8
9
10
11
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: false
fetch-registry: false
spring:
application:
name: eureka
server:
port: 8761

1.3 创建服务提供者–eureka client

创建工程的过程与上面类似,选择Cloud Discovery—>Eureka Discovery即可

加@EnableDiscoveryClient注解声明这是一个client

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaclientApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaclientApplication.class, args);
}

}

application.yml中的配置

1
2
3
4
5
6
7
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #这是你的server的地址
spring:
application:
name: client

启动服务(确保你上面的配置的server是启动中的,要不然找不到注册服务的服务中心),发现服务启动完成立即终止,也不会去向服务端注册

6

需要添加如下的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

再启动服务,发现在server端已经注册完成了

7

当你频繁启动的时候,会发现包如下的提示:

5

这是因为client与server端使用的是心跳机制,server端会不断的去检测client是否存活,会统计一个上线率,当低于某个值时就会出现上面的提示。开发环境下可以把他关掉,但是生产环境下务必保持开启。

在server端的yml添加如下配置:

1
2
server:
enable-self-preservation: false

1.4 Eureka的高可用

其实上面的配置是单体的,就是一个client向一个server注册,当这个server崩溃时服务补救挂掉了吗。怎么解决?可以多建立几台服务器,部署多个Eureka,然后向多个Eureka server之间互相注册。

配置两个服务,然后设置不同的端口。

8

然后启动的时候把server-port注释掉,启动EurekaApplication1,EurekaApplication1的配置如下:

1
2
3
4
5
6
7
8
9
10
11
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/ #这里就是把Eureka1注册到Eureka2上
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
spring:
application:
name: eureka

启动EurekaApplication2,EurekaApplication2的配置如下:

1
2
3
4
5
6
7
8
9
10
11
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #这里就是把Eureka2注册到Eureka1上
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
spring:
application:
name: eureka

启动客户端,客户端的注册地址只有 http://localhost:8761/eureka/,但是分别打开 http://localhost:8761和 http://localhost:8762我们发现client在两个server端都注册了,这是因为两个Eureka的server互相注册,当client注册到Eureka-server1时会同时同步到Eureka-server2上。这个时候Eureka-server1挂掉也是没关系的。

但是Eureka-server1挂掉之后,在重新注册client是注册不上的,因为一开始的时候注册地址只有Eureka-server1,所以要想Eureka-server1挂掉之后,重新注册client,只要注册地址多加一个Eureka-server2的地址即可。

1
2
3
4
5
6
7
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
application:
name: client

要是有更多个server时,server之间两两注册即可。

本文标题:SpringCloud Eureka---服务注册与发现

文章作者:WilsonSong

发布时间:2019年01月16日 - 11:01

最后更新:2019年03月10日 - 22:03

原始链接:https://songwell1024.github.io/2019/01/16/SpringCloudEureka/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------