最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

3-Eureka注册中心

来源:博客园

Eureka注册中心

服务提供者与消费者

在分布式架构中,各个服务之间的数据相互会相互交流,每个服务即会向外发送数据,同样也需要请求其他服务的数据。


【资料图】

服务提供者:在一次业务中,被其他微服务调用并发送数据出来的服务。服务消费者:在一次业务中,主动调用其他微服务获取数据,完成自己的业务的服务。

在一个业务处理中,可能存在多个服务串联调用的情况,但服务消费者和服务提供者只在两个服务之间命名,所以每一个服务既可以是一个消费者,也可以是一个提供者,因为微服务业务处理过程中,各个服务之间的调用关系是网状的,并且是长链路的。

注册中心

RestTemplate方式的RPC调用时,需要硬编码服务提供者的接口路径到服务消费者中。但是通常开发项目时一个服务存在测试、发布、开发等各种环境,自然路径也是不同的,并且在进行集群部署的时候,服务也会出现多个端口或IP地址,硬编码到程序中的方式不利于灵活的操作服务提供者的地址。

也就是说,服务消费者无法准确的找到服务提供者的地址信息,并且在存在多个服务提供者的时候,服务消费者要通过某些策略来找到一个消费者,并且在进行调用的时候,还需要对服务提供者的健康状态进行监控,以避免出现无法调用但仍然不断调用的情况。

  1. 服务消费者如何找到服务提供者?
  2. 集群模式下如何采用负载均衡获取一个服务提供者?
  3. 如何进行服务提供者的健康检测?

为解决这个三个问题,注册中心就出现了。注册中心作为一个服务独立开启,称作服务端,所有开发的业务服务都称为客户端:

  1. 客户端启动时,自动将本服务的信息注册到注册中心,留存到注册中心的字典中。即使是集群部署的服务,在注册中心中也会挨个记录。
  2. 在进行服务调用的时候,服务消费方将请求注册中心获取服务提供者的地址列表,在列表中负载均衡的获取到一个服务进行调用。
  3. 为确保服务健康,每个客户端每30秒向服务端发送一次心跳,如果服务端超时没有接收到心跳则将此服务定义为不健康的服务,在服务消费者进行服务列表拉取的时候就不会获取到此服务。

搭建Eureka服务

服务端搭建

Eureka服务端需要一个SpringCloud项目来完成搭建:

  1. 创建项目,并引入Eureka Server的依赖:
org.springframework.cloudspring-cloud-starter-netflix-eureka-server

依赖名中的starter表示此依赖是一个Springboot项目,将自动装配eureka所有的配置。

  1. 创建启动类,并且添加@EnableEurekaServer注解:
@SpringBootApplication@EnableEurekaServerpublic class Application{//...}
  1. 创建applicatoin.yml文件,编写以下配置:
server:port: 8080 # 服务端口spring:application:name: eurekaserver # 微服务的名称eureka:client:service-url:defaultZone: http://127.0.0.1:8080/eureka/ # 当前服务注册到的注册中心

配置文件中的client所配置的默认空间指向eureka server的注册路径,因为当前服务也是一个服务,也需要注册到eureka服务器 中。

  1. 启动项目成功后,直接访问8080端口即可进入到eureka服务端的中控台:

其中Instances currently registered with Eureka一栏中表示已经注册到当前服务器中的服务列表,其中已经存在的一个就是注册的自己。

客户端搭建

客户端的搭建一般在业务服务中,直接引入以下依赖并做好配置就可以实现客户端的搭建:

  1. 在业务服务中加入eureka客户端依赖:
org.springframework.cloudspring-cloud-starter-netflix-eureka-client
  1. 在配置文件中加入以下配置:
spring:applicatoin:name: userserviceeureka:client:service-url:defaultZone: http://127.0.0.1:8080/eureka/

由以上配置可见,client所指向的defaultZone就表示eureka服务端注册的接口,在eureka服务端所指向的也是这个接口,表示eureka server也是作为一个服务注册到了服务端上。

  1. 进入eureka服务端管理界面,可以看到已经注册的服务名称和个数:

  2. 如果想要尝试多次启动一个服务并占用多个端口,可以在IDEA中如下操作:在同一个实例被多次启动后,就可以在eureka server中看到如下效果:其中,userservice被启动了两次。

实现服务发现

在创建每一个服务的时候,都存在一个application name,用来给当前服务起一个名字,这个名字不仅会在eureka控制台中看到,还可以进行远程调用。

  1. 修改原来通过RestTemplate方式远程调用的方式,将传入的url中的IP和端口更改成服务的名称:
String url = "http://userservice/user/all";
  1. 在RestTemplate注入的位置添加负载均衡的注解:
@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}

通过以上方式,就可以利用Eureka实现服务的拉取和注册了,具体如何通过服务名获得了url,以及如何进行的负载均衡,将在未来Ribbon中详述。

关键词: 服务提供者 负载均衡 服务列表