微服务注册与发现
1 服务调用
1.1 需求场景
学生查询已下单股票列表时,需要去股票服务中获取股票详情,补全股票信息。
1.2 单体应用服务间调用
所有接口在同一容器同一应用上下文中,可能直接调用。
1.3 微服务化后服务间调用
服务相互独立,发布在不同容器中,需要通过远程调用。
1.4 微服务化带来的问题
1.服务消费者配置依赖了服务提供者的网络地址(ip和端口),当服务提供者网路地址发生变化,会导致服务消费者修改配置,重新发布。
2.消费者只能配置单点服务提供者网络地址,导致单点问题,哪怕是通过nginx代理之后,服务提供者集群节点发生变化,也需要修改nginx配置,并重新发布
2 服务注册与发现
要想解决这些问题,服务消费者需要一个强大的服务注册和发现机制,服务消费者使用这种机制获取服务提供者的网络信息,服务消费者可以动态感知到服务提供者网络变化,无需修改配置。
服务注册和发现结构大致如下:
微服务的网路地址都有服务注册中心管理,提供一下功能:
1.微服务信息存储:用来记录每个微服务的信息,列入微服务的唯一标示,网络信息(ip和端口);
2.提供服务的注册,注销和发现功能,注册和注销用于每个微服务提供者信息变化管理,发现功能用于服务消费者获取可用的微服务提供者信息;
3.服务检查机制,服务的注册和注销是由服务提供者主动发起变更请求,服务提供者正常情况下没问题,当出现宕机,网络问题导致服务提供者不能发起请求或者请求丢失,导致已注册服务信息无法,所以服务注册中心需要对已注册的服务做定时的检查机制。当某个微服务实例长时间无法访问,需要移除该实例。
spring cloud 给我们提供了多个注册中心组件的支持,例如Eureka,zk等,下面就来讲讲官方推荐的Eureka。
2.1 Eureka介绍
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。SpringCloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。
2.2 Eureka 高可用架构
官方提供的Eureka 高可用架构是基于AWS(Amazon Web Services)服务架构设计的。通常在我们这种非AWS环境下,us-east-1c、us-east-1d和us-east-1e可理解成不同的机房。
Eureka 高可用架构中:
- Application Service相当于服务提供者
- Application Client相当于服务消费者
- Application Client 通过发现Eureka中 Application Service注册的网络信息实现远程调用(make remote call)
Eureka包含两个组件:Eureka Server和Eureka Client。
- Eureka Server提供服务注册(Register)、续费(Renew)、注销(Cancel)、发现(Get Register)和同步(Replicate)的RESTful API,供Eureka Client 调用。
- Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
- 如果Eureka Server在一定时间内没有接收到某个微服务实例的续约(Renew)心跳(默认30秒),Eureka Server将会注销该实例(默认90秒)。
- 在高可用Eureka 架构中,Eureka Server同时默认也是Eureka Client,多个Eureka Server通过复制同步(Replicate)服务注册信息
- Eureka Client会缓存服务注册表中的信息。这种方式有一定的优势——首先,微服务无须每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使Eureka Server所有节点都宕掉,服务消费者
3 Eureka 实战
结合前面服务调用中学生和股票服务之间的业务场景集成Eureka,并将股票服务(服务提供者)注册到Eureka Server中
3.1 编写一个Eureka Server
1.创建一个ArtifactId是finace-training-eureka-server的Maven工程,并为项目添加以下依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
2.在配置文件application.yml中添加如下内容。
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
简要讲解一下 application.yml中的配置属性:
eureka.client.registerWithEureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而设为false。
eureka.client.fetchRegistry:表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务与注册服务都需要依赖
3.编写启动类,在启动类上添加@EnableEurekaServer注解,声明这是一个Eureka Server。
package com.myhexin.finace.training.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.</