Eureka 简介:
Eureka是Netflix 开源的服务发现组件, Spring Cloud 将其集成在 Spring Cloud Netflix 中,实现服务的注册和发现。Eureka 主要包含两个组件: Eureka Server 和 Eureka Client。 两者的作用如下:
Eureka Server 提供服务发现的功能, 各个微服务会将自己的信息注册到Eureka Server。
Eureka Client 即服务提供者,将其信息注册到Eureka Server上面。
微服务会周期性(默认30秒)地向Eureka Server 发送心跳以维持自己的注册状态,如果Eureka Server 在一定时间(默认90秒)没有接受到某个微服务实例的心跳,Eureka Server 将会注销该实例。
默认情况下,Eureka Server 同时也是 Client, 多个Eureka Server 实例之间可以通过复制的方法, 来实现服务注册表数据的同步。
Eureka Client 会缓存服务注册表中的信息,所以 Eureka Client 无须每次调用微服务都要先查询Eureka Server,能有效地缓解Eureka Server的压力,而且即使所有的Eureka Server节点都宕掉,Client 依然可以根据缓存中信息找到服务提供者。
一、版本介绍:
SpringCloud版本 | SpringBoot版本 |
---|---|
Finchley.RELEASE | 2.0.3.RELEASE |
二、创建服务注册中心
1. 首先创建一个maven主工程
在pom文件引入依赖
spring Boot版本为2.0.3.RELEASE
Spring Cloud版本为Finchley.RELEASE
这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom
<?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.0.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gblfy</groupId><artifactId>sc-f-chapter1</artifactId><version>0.0.1-SNAPSHOT</version><name>sc-f-chapter1</name><description>Demo project for Spring Boot</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RELEASE</spring-cloud.version></properties><dependencies><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>
2. 创建2个子项目model工程:
一个子项目model工程作为服务注册中心,即Eureka Server
另一个子项目作为客户端Eureka Client
下面以创建server为例子,详细说明创建过程:
- 右键工程->选择创建 model-> 选择 spring initialir
- 下一步->选择 cloud discovery->eureka server ,然后一直下一步就行了(声明我们需要的Eureka的支持 )
- 创建完后的工程,其pom.xml继承了父pom文件,并引入 spring-cloud-starter-netflix-eureka-server的依赖,代码如下:
<?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>com.gblfy</groupId><artifactId>sc-f-chapter1</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.gblfy</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>eureka-server</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
</project>
3. 启动一个服务注册中心,只需要一个注解 @EnableEurekaServer ,这个注解需要在springboot工程的启动application类上加:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}
4. eureka是一个高可用的组件,它没有后端缓存
每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server(指注册中心,eureka本身是一个server同时也是一个client,也就是可以自己注册自己,浏览器上就会显示本身应用)。
eureka server的配置文件 appication.yml:
server:port: 8761eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/spring:application:name: eurka-server
通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server
5. eureka server 是有界面的
启动工程,打开浏览器访问:
http://localhost:8761
三、创建一个服务提供者 (eureka client)
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
- 创建过程同server类似,创建完pom.xml如下:
<?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>com.gblfy</groupId><artifactId>sc-f-chapter1</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.gblfy</groupId><artifactId>service-hi</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>service-hi</name><description>Demo project for Spring Boot</description><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></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
- 通过注解
@EnableEurekaClient表明自己是一个eureka-client
@EnableDiscoveryClient 服务发现
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class ServiceHiApplication {public static void main(String[] args) {SpringApplication.run(ServiceHiApplication.class, args);}}
- 仅仅@EnableEurekaClient是不够的,还需要在配置文件中注明自己的服务注册中心的地址,application.yml配置文件如下:
server:port: 8762spring:application:name: service-hieureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
四、新建一个web类HiController发布服务
@RestController
public class HiController {@Value("${server.port}")private String port;@GetMapping("/hi")public String home(@RequestParam(value = "name", defaultValue = "gblfy") String name) {return "hi," + name + ",i am from port" + port;}
}
五、启动工程,浏览器访问:
http://localhost:8761 即eureka server 的网址
你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为8762
这时打开 http://localhost:8762/hi?myName=gb ,你会在浏览器上看到 :
hello,gblfy,我的应用名称是:service-hi,端口是:8762
本文源码下载:
dev分支(最新企业实战版本):
https://github.com/gb-heima/springcloud-practical-column/tree/dev/sc-f-chapter1
master分支(入门版本):
https://github.com/gb-heima/springcloud-practical-column/tree/master/sc-f-chapter1