开局一张图,截取了本人学习资料中的一张图,很好地展示了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}

Spring Cloud 学习笔记 (一)-- Eureka 服务器的更多相关文章

  1. Spring Cloud学习笔记【九】配置中心Spring Cloud Config

    Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端 ...

  2. Spring Cloud学习笔记-002

    搭建Spring Cloud注册中心:Eureka 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号.版本号.通信协议等一些附加信息告诉注 ...

  3. Spring Cloud学习笔记-010

    分布式配置中心:Spring Cloud Config Spring Cloud Config是Spring Cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外 ...

  4. spring cloud 学习(二)关于 Eureka 的学习笔记

    关于 Eureka 的学习笔记 个人博客地址 : https://zggdczfr.cn/ ,欢迎光临~ 前言 Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Sprin ...

  5. Spring Cloud学习笔记【一】Eureka服务注册与发现

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  6. Spring Cloud 学习笔记(一)——入门、特征、配置

    [TOC] 0 放在前面 0.1 参考文档 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc ...

  7. spring cloud 学习笔记(1)

    SpringCloud + Eureka / Nacos git:https://github.com/huanmsf/springCloudLearn.git 项目目录: 父pom: <?xm ...

  8. Spring Cloud学习笔记-012

    分布式服务跟踪:Spring Cloud Sleuth 随着业务的发展,系统规模也会变得越来越大,各微服务间的调用关系也变得越来越错综复杂.通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务 ...

  9. Spring Cloud学习笔记--Spring Boot初次搭建

    1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...

随机推荐

  1. 空间向量变换,以及OpenGL的glm库简单应用

    测试项目请查看GitHub库 GLBIproject2/GLBIProject2_2

  2. Vue学习笔记使用系列一【表单】

    脚手架的搭建,请查看另外一篇日记:https://www.cnblogs.com/Fengge518/p/11837078.html 1:直接代码了 1 <!DOCTYPE html> 2 ...

  3. Python 3 入门,看这篇就够了(超全整理)

    史上最全Python资料汇总(长期更新).隔壁小孩都馋哭了 --- 点击领取 今天和大家分享的内容是Python入门干货,文章很长. 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面 ...

  4. PageRank算法(网页排名)

    Google用它来体现网页的相关性和重要性

  5. Python练习题 020:累积累加

    [Python练习题 020] 求1+2!+3!+...+20!的和 -------------------------------------------------- 据说这题是"累积累 ...

  6. 玩转Libmodbus(一) 搭建开发环境

    这篇文章是转载的,我主要是参考了其搭建环境的部分. 转载自: https://blog.csdn.net/qq_40452910/article/details/88560310 一.源码下载 1.l ...

  7. Layman 使用ffmpeg-php扩展库实现视频截图(默认图)

    这几天做项目,其中一个需求是用户上传视频文件到服务器,然后服务器自动截取该视频的一帧作为该视频对应的缩略图,服务器端语言采用php编写,找了半天资料,发现ffmpeg-php可以满足该需求,所以下面简 ...

  8. C++(VS2015)模板显式特化之template语法深入理解

    首先说下遇到的情况: 这里在vc++6.0上建立了一个自定义模板类,再去覆盖这个类,分别使用部分覆盖,整体覆盖 但在vs2015上去整体覆盖类会报错. 错误如下: 错误原因:个人感觉是新版本的vs更接 ...

  9. 《VC++ 深入详解》 第3版 这是盗版书么~。。。

    <VC++ 深入详解> 第3版 www.broadview.com.cn 书读到一小半,发现书重复了一部分,缺失一部分.... 难受~ 比较难继续下去了 有一样的小伙伴么~ <VC+ ...

  10. Java安全之Commons Collections1分析(一)

    Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...