开局一张图,截取了本人学习资料中的一张图,很好地展示了Eureka的架构。
Eureka服务器
管理服务的作用。细分为服务注册,服务发现。
所有的客户端在Eureka服务器上注册服务,再从Eureka服务器获取所有注册的客户端的信息列表,包括客户端名称,主机,端口等信息的列表,缓存在本地。客户端之间的调用,则是通过查找该列表上的信息,得到服务提供端(另一个客户端)的访问地址,从而调用服务。
下面开始搭建一个Eureka服务器。
一、首先创建一个父工程
新建一个maven的工程study-spring-cloud-parent,packaging选择pom。parent选择spring-boot-starter-parent的2.3.4.RELEASE。添加spring cloud版本管理的依赖管理。如下:
<modelVersion>4.0.0</modelVersion> <groupId>com.pzz.study</groupId> <artifactId>study-spring-cloud-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <build/> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> </parent>
<dependencyManagement> <dependencies> <!-- 管理Spring Cloud 的版本使用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR8</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
二、创建Eureka服务器
在父工程study-spring-cloud-parent 中新增一个Maven的模块study-eureka-server。添加Eureka的依赖。完整的pom如下:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.pzz.study</groupId> <artifactId>study-spring-cloud-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>study-spring-cloud-eureka</artifactId> <name>study-spring-cloud-eureka</name> <url>http://maven.apache.org</url> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <finalName>study-eureka-server</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
新建一个EurekaServerApp的Java类,增加注解@EnableEurekaServer,表示该项目启动是一个Eureka服务器。增加注解@SpringBootApplication,使用SpringBoot的框架启动。在main函数中编写启动代码,具体如下:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApp { public static void main( String[] args ){ new SpringApplicationBuilder(EurekaServerApp.class).run(args); } }
在resources下新建目录config,新建属性文件application.properties文件。内容如下:
#端口号 server.port=8001 #主机名称 eureka.instance.hostname=localhost #注册中心设置为false,代表不向注册中心注册自己 eureka.client.register-with-eureka=false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http\://${eureka.instance.hostname}\:8001/eureka/
单机,如果没有 eureka.client.register-with-eureka(默认true)和eureka.client.fetch-registry(默认true),启动报错。
运行EurekaServerApp的main方法,或使用springboot启动项目,成功后,在浏览器输入http://localhost:8001/,如下图,表示Eureka服务器已经搭建完成。
Eureka 服务器集群
服务器集群,构建高可用的服务器。在其中一部分服务器宕掉后,只要还存活其他的Eureka服务器,则不影响客户端的使用。
在上边服务器的基础上,将application.properties的文件名改成application-peer1.properties,并复制粘贴成另一个新的文件application-peer2.properties的文件。分别设置端口号8001和8002,并注释掉eureka.client.register-with-eureka和eureka.client.fetch-registry两个属性。并将eureka.client.service-url.defaultZone属性设置成对方的地址,分别向对方注册自己,以实现服务清单的同步,达到高可用的效果。代码分别如下:
application-peer1.properties的配置:
#端口号 server.port=8001 #主机名称 eureka.instance.hostname=localhost #注册中心设置为false,代表不向注册中心注册自己 #eureka.client.register-with-eureka=false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false #eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http\://${eureka.instance.hostname}\:8002/eureka/
application-peer2.properties:
server.port=8002 eureka.instance.hostname=localhost #注册中心设置为false,代表不向注册中心注册自己 #eureka.client.register-with-eureka=false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false #eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http\://${eureka.instance.hostname}\:8001/eureka/
修改启动类,分别使用application-peer1.properties启动和application-peer2.properties启动。
首先使用application-peer1.properties文件启动
@EnableEurekaServer @SpringBootApplication public class EurekaServerApp { public static void main( String[] args ){ new SpringApplicationBuilder(EurekaServerApp.class).profiles("peer1").run(args); } }
启动后,控制台会输出如下错误日志:
2020-10-29 14:25:15.531 ERROR 17044 --- [ main] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8002/eureka/}
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar:1.19.1]
2020-10-29 14:26:57.825 ERROR 17044 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/windows10.microdone.cn:8001 - was unable to refresh its cache! status = Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.25.jar:1.9.25]
不用管这些错误日志,因为另一个服务器还没有启动,所以该服务器还不能作为客户端注册到另一个服务器,也不能从另一个服务器抓取客户端的列表。待按照如下代码,再启动一次就ok:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApp { public static void main( String[] args ){ new SpringApplicationBuilder(EurekaServerApp.class).profiles("peer2").run(args); } }
启动成功后,在浏览器输入http://localhost:8001/ 能看到8002已经注册到该服务器
在浏览器输入 http://localhost:8002/,可以看到8001已经注册到该服务器
再过一段时间刷新这两个Eureka服务器的地址,在服务列表会发现都已经被拷贝到自己的注册列表,见下图;
给服务命名、地址IP显示
现在服务列表中的服务(Eureka服务器集群时,自己也在服务列表中)名称如上图是“UNKNOW”。我们新建一个属性文件application.properties来存放这些公用的属性。新增spring.application.name=study-eureka-server属性,给服务命名。运行后如下:
新增eureka.instance.instance-id=${spring.cloud.client.ip-address}\:${spring.application.name}\:${server.port}属性,给列表中的status中的服务添加ip地址,运行后如下
新增eureka.instance.prefer-ip-address=true属性,当鼠标移到注册列表的服务连接上时,显示的是IP,如下图:
完整的application.properties文件内容如下:
spring.application.name=study-eureka-server #地址显示IP的形式 eureka.instance.prefer-ip-address=true #eureka注册中心服务列表的名称格式 eureka.instance.instance-id=${spring.cloud.client.ip-address}\:${spring.application.name}\:${server.port}