Spring Cloud(三)Eureka

Eureka简介

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud 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微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/81162192