(二)SpringCloud——微服务注册中心Eureka

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

 

1、注册中心的主要作用

服务注册中心(下称注册中心)是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能:

1.1 服务发现:

  • 服务注册/反注册:保存服务提供者和服务调用者的信息
  • 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
  • 服务路由(可选):具有筛选整合服务提供者的能力。

1.2 服务配置:

  • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置
  • 配置下发:主动将配置推送给服务提供者和服务调用者

1.3 服务健康检测

  • 检测服务提供者的健康情况

2、常见的注册中心

2.1  Zookeeper

zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简单来说zookeeper=文件系统+监听通知机制。

2.2 Eureka

Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件

2.3 Consul

Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用Raft算法保证服务的一致性,且支持健康检查。

2.4 Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与发现。

2.5 各注册中心组件的对比

 

组件名

语言

CAP

 一致性算法

服务健康检查

对外暴露接口

Eureka

Java

AP

可配支持

 HTTP

Consul

Go

CP

 Raft

支持

HTTP/DNS

Zookeeper

Java

 CP

 Paxos

支持

 客户端

Nacos

Java

 AP

 Raft

支持

HTTP

 

3  Eureka

3.1 Eureka概述

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。

 

上图简要描述了Eureka的基本架构,由3个角色组成:

  • 1、Eureka Server:提供服务注册和发现
  • 2、Service Provider:服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
  • 3、Service Consumer:服务消费方,从Eureka获取注册服务列表,从而能够消费服务

3.2 Eureka的交互流程与原理

 

 

  • Application Service 相当于本书中的服务提供者,Application Client相当于服务消费者;
  • Make Remote Call,可以简单理解为调用RESTful API;
  • us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region;

由图可知,Eureka包含两个组件:Eureka Server 和 Eureka Client,它们的作用如下:

  • Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
  • Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
  • 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
  • 每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
  • Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。
  • 综上,Eureka通过心跳检测、健康检查和客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用

性。

 

4 使用Eureka的步骤(示例)

 

(1)搭建Eureka Server;

1.创建工程:创建子模块shop_eureka_server

2.导入坐标

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

</dependency>

3.配置application.yml

server:

port: 8001

eureka:

instance:

hostname: localhost

client:

registerWithEureka: false

fetchRegistry: false

serviceUrl:

defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

registerWithEureka: 是否将自己注册到Eureka服务中,本身就是所有无需注册

fetchRegistry : 是否从Eureka中获取注册信息

serviceUrlEureka: 客户端与Eureka服务端进行交互的地址

4.配置启动类

@SpringBootApplication

@EnableEurekaServer

public class EurekaServerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaServerApplication.class, args);

}

}

EnableEurekaServer : 激活Eureka Server端配置

5. 打开浏览器访问http://localhost8001即可进入EurekaServer内置的管理控制台,显示效果如下

 

(2)将服务提供者注册到EurekaServer上;

引入EurekaClient的坐标

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-commons</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

</dependencies>

2.修改application.yml添加EurekaServer的信息

eureka:

client:

serviceUrl: # eureka server的路径

defaultZone: http://localhost:8001/eureka/

instance:

prefer-ip-address: true #使用ip注册

3.修改启动类,添加服务发现与支持(可选)

@SpringBootApplication

//@EnableDiscoveryClient

//@EnableEurekaClient

public class UserApplication {

public static void main(String[] args) {

SpringApplication.run(UserApplication.class, args);

}

}

注:从Spring Cloud Edgware版本开始, @EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

(3)服务消费者通过注册中心获取服务列表,并调用。

在程序中可以使用DiscoveryClient 获取指定微服务的所有元数据信息:示例:

@SpringBootTest

@RunWith(SpringJUnit4ClassRunner.class)

public class RestTemplateTest {

@Autowired

private DiscoveryClient discoveryClient;

@Test

public void test() {

//根据微服务名称从注册中心获取相关的元数据信息

List<ServiceInstance> instances = discoveryClient.getInstances("shopservice-

product");

for (ServiceInstance instance : instances) {

System.out.println(instance);

}

}

}

5  Eureka中的元数据

  • Eureka的元数据有两种:标准元数据和自定义元数据。
    • 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。
    • 自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这些元数据可以在远程客户端中访问。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值