Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册;
- Eureka的GitHub:https://github.com/Netflix/Eureka
Eureka Server
- 服务端-没有存储,内存保持,每服务实例需要发送心跳去续约 - 客户端-在内存中缓存着eureka的注册信息,因此不必每请求到eureka查找服务 - eureka之间会做注册服务同步,从而保证状态一致,客户端只需访问一个eureka
Service Provider
- 会向Eureka Server做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作
Service Consumer
- 会向Eureka Server获取注册服务列表,并消费服务
简单实战
创建服务端
创建Spring Boot服务端,给项目命一个名字为springcloud.helloworld.eureka.server,下面是创建流程:
因为部分流程和前面的入门都一样,所以这里就把不同之处单独写出来,其他的都一样,
我们需要安装eureka所以搜索一下:
Eureka服务端创建完成,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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>springcloud.helloworld.eureka</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</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.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</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>
2、创建一个服务类EurekaServerApplication
package springcloud.helloworld.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
3、配置application.yml,如果没有安装web结构里就不会有static和templates目录,可以把application.properties文件复制了一份修改文件名,如果已经安装web可以在resoources目录下创建config目录,并在config目录下创建application.yml文件,并配置:
server: port: 8761 #表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false eureka: instance: hostname: localhost client: register-with-eureka: false #表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据 fetch-registry: false #设置Eureka的地址 service-url: defaultZone : http://${eureka.instance.hostname}:${server.port}/eureka/
4、eureka server工程结构如下:
5、启动eureka server,右键ServerApplication--run,然后访问http://localhost:8761/,页面如下,“No instances available”表示无client注册
创建客户端
和创建服务端类似,创建的时候增加的客户端插件如下:
1、创建Maven工程springcloud.helloword.eureka.client,pom.yml内容如下:
<?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.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>springcloud.helloworld.eureka</groupId> <artifactId>client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>client</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</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>
2、创建主类EurekaClientApplication,内容如下:
package springcloud.helloworld.eureka.client;
import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @EnableEurekaClient @RestController public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class,args); } @Value("${server.port}") String port; @RequestMapping("/") public String home() { return "hello world from port" + port; } }
3、eureka client的配置文件application.yml内容如下:
eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ server: port: 8762 #对该应用另起别名 spring: application: name: service-helloword
eureka client创建完成,下面看一下工程结构:
4、启动client服务,并访问http://localhost:8762/
5、再次访问服务端,可以看到Client中的application.yml中记录的name
扩展部分,资料补充:
这是因为Eureka进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;
这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。
综上所述,我们可以看出来Eureka的两个组件EurekaServer和EurekaClient的作用:
1、EurekaServer 提供服务发现的能力,各个微服务启动时,会向EurekaServer注册自己的信息(例如:ip、端口、微服务名称等),EurekaServer会存储这些信息;
2、EurekaClient是一个Java客户端,用于简化与EurekaServer的交互;
3、微服务启东后,会定期性(默认30s)的向EurekaServer发送心跳以续约自己的“租期”;
4、如果EurekaServer在一定时间内未接收某个微服务实例的心跳,EurekaServer将会注销该实例(默认90s);
5、默认情况下,EurekaServer同时也是EurekaClient。多个EurekaServer实例,互相之间通过复制的方式,来实现服务注册表中数据的同步;
6、EurekaClient也会缓存服务注册表中的信息;
综上,Eureka通过心跳检查、客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性,所以作为一个微服务架构,需要一个服务注册中心来统筹管理服务;
Eureka高可用
复制上面server项目,分别命名为: eureka-keepalived-server1,eureka-keepalived-server2;
复制上面的client项目,命名为: eureka-keepalived-client;
修改本地hosts文件:
127.0.0.1 localhost server1 server2
eureka-keepalived-server1
修改项目eureka-keepalived-server1的配置文件application.yml(application.yml文件是把application.properties文件复制过去并修改的文件名)
server: port: 8761 spring: application: name: eureka-server-1 profiles: active: server1 eureka: instance: hostname: server1 client: service-url: defaultZone: http://server2:8762/eureka
eureka-keepalived-server2
修改项目eureka-keepalived-server2的配置文件application.yml(application.yml文件是把application.properties文件复制过去并修改的文件名)
server: port: 8762 spring: application: name: eureka-server-2 profiles: active: server2 eureka: client: service-url: defaultZone: http://server1:8761/eureka
eureka-keepalived-client;
修改项目eureka-keepalived-client的配置文件application.yml(application.yml文件是把application.properties文件复制过去并修改的文件名)
server: port: 8763 spring: application: name: client-8783 eureka: client: service-url: defaultZone: http://server1:8761/eureka
分别启动两个服务server1,server2,并访问http://localhost:8761,http://localhost:8762,如下:
启动客户端,发现客户端分别在两个服务端都有相应的注册,而我们的客户端实际只指定了一个Server;
至此,Eureka高可用已经完成。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏