Eureka服务注册与发现(一)

导读:本篇文章讲解 Eureka服务注册与发现(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Eureka服务注册与发现(一)

参考:《Srping Cloud与Docker微服务架构实战 周立著》

硬编码的缺陷

在上一节一个简单的微服务中实现的简单的微服务中,实现了两个简单的微服务,电影微服务和用户微服务。但是,在电影微服务中调用用户微服务中,ip+端口实在代码中写死的。这样为后期维护带来很大的不便。由此带来很多问题:

  • 修改困难:对于一些应用来说,如果想要修改地址就需要停止服务,修改IP或端口。有的更需要重新打包,很不方便
  • 无法动态伸缩:如果需要增加多个实例,那服务的调用者也要同时修改,无法动态伸缩。

为解决这样的问题,便有了服务注册与发现。

服务发现简介

在这里插入图片描述

  • 各个微服务启动时,将自己的网络信息注册到服务发现组件中,服务发现组件存储这些信息。
  • 消费者从服务发现组件查询服务提供者的网络信息,并调用接口
  • 微服务与服务发现组件之间通过心跳机制确认服务的存活状态
  • 服务地址变更会重新注册到服务发现组件中

服务发现组件有很多,如:Eureka,Consul,Zookeeper。先介绍Eureka,后面会介绍其他。

Eureka简介

  • 官方地址:链接
  • Github:链接
  • Eureka原理:链接
    Eureka官方架构图如下:
    在这里插入图片描述
    图中提到的角色有Application Server、Application Client、Eureka Server等。各部分作用如下:
  • Application Service : 应用系统中的服务提供者
  • Application Client : 应用系统中的服务消费者
  • Make Remote Call :服务调用
  • Eureka Server : 提供服务发现能力,各个服务启动时会像Eureka Server注册服务信息,如果服务的IP、端口等,Eureka会存储这些信息。Eureka Server在一定时间内没有接收到某个微服务的心跳,Eureka Server就会注销整个服务实例。多个Eureka Server之间通过复制的方式,实现数据同步
  • Eureka Client : Eureka客户端,用于与Eureka Server交互,如应用客户端需要从Eureka Server获取可用的服务提供者。Eureka Client会缓存服务注册表中的信息,这样即使所有的Eureka Server都宕机,消费者仍然可以正常访问服务提供者。

根据对上述架构图的理解,先实现一个Eureka Server

编写单节点的Eureka Server

  • 创建一个Spring Boot项目micro-eureka-server-master
  • 添加依赖
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-server', version: '2.1.2.RELEASE'
  • 在启动类添加@EnableEurekaServer注解,声明这是一个Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class MicroEurekaServerMasterApplication {

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

}
  • application.yml中添加以下内容:
server:
  port: 8761
# 服务注册
eureka:
  instance:
    hostname: localhost
  client:
    #是否将自己注册到Eureka Server,默认为true。由于当前就是Eureka Server,所以设成false
    registerWithEureka: false
    #是否从Eureka Server获取注册信息,默认为true。因为这是单节点的Eureka Server,不需要从其他节点同步Eureka Server节点的数据,所以设成false
    fetchRegistry: false
    serviceUrl:
    # 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:9761/eureka。多个服务可以使用,隔开
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 启动,后访问http://localhost:8761/显示如下:
    在这里插入图片描述

注册微服务

使用之前创建的用户微服务:micro-user-service,将其注册到Eureka Server上

  • 添加依赖
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client', version: '2.1.2.RELEASE'
  • 修改配置文件
spring:
  # 指定注册到Eureka Server上的应用名
  application:
    name: micro-user-service
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    #表示将自己的IP注册到Eureka Server上,如果不配置或者值为false,则表示注册微服务所在的操作系统的hostname到Eureka Server
    prefer-ip-address: true
  • 在启动类上添加@EnableDiscoveryClient注解,声明这是一个Eureka Client
@SpringBootApplication
@EnableDiscoveryClient
public class MicroUserServiceApplication {

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

}

也可以使用@EnableEurekaClient代替@EnableDiscoveryClient。区别是,如果使用了@EnableDiscoveryClient注解,同样可以对Zookeeper、Consul等提供支持。@EnableEurekaClient只默认是Eureka Client。

  • 在Eureka Server启动的情况下,启动用户微服务。
  • 访问Eureka Server,http://localhost:8761/
    在这里插入图片描述
    图中的红字部分是说进入了Eureka的自我保护模式,这部分稍后介绍
  • 按照之前的流程,也将电影微服务注册到Eureka Server上,启动后再访问:
    在这里插入图片描述

Eureka服务的高可用(集群)

生产环境中,如果只有单节点的Eureka Server会有很大的风险。虽然Eureka Client会缓存注册表信息,但是如果一旦有服务的端口,IP等发生变更,或者有新服务需要注册到Eureka Server上就会失败,从而导致系统的可用性低。因此部署一个Eureka Server集群是必要的。

  • 配置系统的hosts,C:\Windows\System32\drivers\etc目录下。
127.0.0.1 peer1 peer2
  • 修改配置文件:
spring:
  application:
    name: micro-eureka-server
---
spring:
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/

---
spring:
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

连接字符(—)将该application.yml分成三段,第二段和第三段分别为spring.properties制定了一个值,该值表示它的所在的那段内容应用在哪个profile里。第一段是对所有的profile都生效。
在IDEA中分别启动两个Eureka Server实例,可配置启动参数,如下图所示:

  • Eureka Server1
    在这里插入图片描述
  • Eureka Server2
    [外链图片转存失败(img-AhyDbiPd-1563034902911)(picture2/server2.png)]
    两者的不同同,在于启动参数不一样。这样就可以分别为实例指定profile
  • 访问http://peer1:8761会发现registered-replicas中有peer2节点。同理访问http://peer2:8762/中有peer1节点
    在这里插入图片描述

将应用注册到集群上

以用户微服务为例

  • 修改配置文件
eureka:
  client:
    serviceUrl:
      #这里如果只配置一个也是可以的,因为集群有复制功能,但是建议配置多个
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
  instance:
    prefer-ip-address: true
  • 启动用户微服务
  • 访问两个Eureka Server会发现服务已经注册到了Eureka Server,并且两个Server都能看到服务信息。
    在这里插入图片描述

Github地址

Github链接点这里

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13159.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!