一、什么是Spring Cloud Eureka
Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,基于Netflix Eureka进行二次封装,主要完成微服务架构中的服务治理功能。
二、服务治理
实现微服务实例的自动化注册与发现。
- 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机端口号、版本号、通信协议等信息告知注册中心,当进程启动并向注册中心注册了自己的服务后,注册中心就会按服务名分类组织服务清单,如下:
服务名 | 位置 |
---|---|
服务1 | 127.0.0.1:8080、127.0.0.1:8081 |
服务2 | 127.0.0.1:8082、127.0.0.1:8083 |
另外注册中心还要以心跳的方式去检测清单的服务是否可用,不可用的需要从清单总剔除,达到排除故障服务的效果。
- 服务发现:服务调用方在调用服务提供方接口的时候,并不知道具体的服务实例位置,需要向服务注册中心咨询服务,获取所有服务的实例清单。比如要调用服务1,需要向服务注册中心发起咨询服务请求,服务注册中心会将服务1的位置清单返回给请求,获得两个可用位置,当要发起调用的时候,便会从清单中已某种轮询策略取一个位置进行服务调用(负载均衡)。
三、Eureka服务端与客户端
- Eureka服务端:即服务注册中心,支持高可用配置,依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
- Eureka客户端:主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式嵌入在客户端应用程序代码中,在程序运行时,向服务注册中心注册自身提供的服务并周期性发送心跳来更新它的服务,同时,也能从服务端查询当前注册的服务并把它们缓存到本地并周期性更新。
四、搭建Eureka服务注册中心:
在idea中新建SpringBoot项目,选择依赖时勾选Cloud Discovery下的Eureka Server
打开pom.xml可以发现Eureka的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在启动类上添加注释@EnableEurekaServer,启动程序即可。
在默认设置下,服务注册中心也会将自己作为客户端来尝试注册到他自己,需要我们禁用它的客户端注册行为,修改application.yml:
server:
port: 18761 #程序端口
eureka:
instance:
hostname: localhost
non-secure-port: ${server.port}
client:
register-with-eureka: false #不向注册中心注册
fetch-registry: false #注册中心的职责是维护服务,所以不需要检索服务
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
如果不设置register-with-eureka为false那么必须提供serviceUrl
启动程序,访问http://localhost:18761:
五、注册服务提供者
在idea中新建SpringBoot项目,选择依赖时勾选Cloud Discovery下的Eureka Discovery
打开pom.xml可以发现Eureka Provider的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>eureka-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
与服务注册中心不同的是客户端的依赖是spring-cloud-starter-netflix-eureka-client
在启动类添加@EnableDiscoveryClient
(Eureka服务注册中心也可以使用@EnableEurekaClient
)
修改application.yml:
server:
port: 18091 #服务端口
spring:
application:
name: eureka-provider #服务名
eureka:
client:
serviceUrl:
defaultZone: http://localhost:18761/eureka/ #服务注册中心地址
启动程序(确保服务注册中心已启动),在注册中心控制台打印如下日志说明成功:
再次访问http://localhost:18761:
EUREKA-PROVIDER已经注册成功,至此,简单的Eureka服务注册已完成。