什么是Eureka?

Eureka是一个服务的注册中心,有服务端和客户端。我举个栗子。

一个大型商场新建完毕,各种商家开始准备入住。需要的流程是:

  1. 商家去大型商场注册,交费,签合同
  2. 熙熙攘攘的人群在大型商场门口的导航牌看哪个店在几楼,然后去消费

在这个例子中,Eureka就是大型商场,就是一个服务中心。加了服务端注解@EnableEurekaServer之后就可以开启服务中心了,然后商家就是客户端,要加@EnableEurekaClient之后就可以去注册了。至于消费者,直接去消费

Eureka注册的三大步

第一步,引用Maven

想要使用Eureka,先引用Maven,服务端和客户端不一样

服务端:

     <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-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>

必须要加版本号,不然第三步的注解不能生效的

第二步,配置yml

我们需要配置yml文件,告诉系统,服务端的Eureka调用地址是什么,客户端的Eureka访问地址是什么

服务端:

server:
port: 7001 eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

服务器端基本就是这样写的,没什么需要改的

客户端:

eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: provider-8001 #这个是修改Eureka界面的Status名称
prefer-ip-address: true #这个是设置鼠标放在status上的时候,出现的提示,设置ip地址显示

客户端的defaultZone是Eureka的注册中心的地址,这个是在服务端写的,服务端怎么写,这里就怎么写。

instance-id这个是Eureka页面的status的名称

prefer-ip-address这个是鼠标放在status上的时候显示的内容,把ip地址显示出来。

这里的具体,在第四步,我会截图。

第三步,开启Eureka注解

开启注解,告诉我的子项目,你有权限使用Eureka注册服务了,Maven已经下载了,yml也告诉你访问路径了,去使用它吧,在子系统的主方法上加就ok

服务端:

@EnableEurekaServer

客户端:

@EnableEurekaClient

新建Eureka子项目

我们来新建一个子项目,还是一样的,我起名为Eureka-7001 。我们需要在yml里面写上面的服务端的内容。然后在项目的主方法上加上@EnableEurekaServer注解。至此,加了服务端yml和注解的Eureka-7001项目就是服务中心了。

现在可以运行了,很简单,首先我们先运行Eureka-7001这个子工程

可以看到,我们的Eureka服务中心已经跑起来了,但是目前,还没有任何一个客户端来注册啊。商家呢?快来注册交费入驻。

把provider子项目变成服务端

我们要把provider项目改为Eureka的客户端,并且注册进我们的服务中心。

  1. 先改provider项目的yml,还是上面讲的客户端yml就是,复制
  2. 主方法加@EnableEurekaClient注解

这个时候,保持Eureka-7001服务中心运行的同时,我们再启动provider项目,你会发现

由于我上面客户端的yml写的

  instance:
instance-id: provider-8001 #这个是修改Eureka界面的Status名称
prefer-ip-address: true #这个是设置鼠标放在status上的时候,出现的提示,设置ip地址显示

正是由于写了上面的这俩,所以我的图中的status就是我自己定义的,以及鼠标放上去时,左下角显示的内容,才会有ip显示出来。

最后,你点击status下面的名称试试,会出现一个info页面,不过是没啥内容的。我们希望,点击微服务的status的时候,可以显示出这个微服务的一些信息,比如版本号,公司名称。我们需要两步

  1. 在主工程加如下代码,这个作用是让resource文件可访问,而且版本号我们根据$符号来确定
    <build>
<finalName>SpringCloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
  1. 第二步,由于第一步已经设置了resource文件夹可访问了,所以我们在resource文件夹下的yml文件里添加info信息,现在在provider的yml增加如下内容
info:
app.name: provider-8001
company.name: www.vae.com
build.artifactId: $project.artifactId$
build.version: $project.version$

有了这两步之后,你可以点击那个服务的status试试,结果应该是如下图所示的

Eureka的自我保护机制

这个服务中心,你等一会再打开,你会发现会出来一行红字,这并不是报错,这个就是因为Eureka的自我保护机制。

下面一起来做个例子,来看看自我保护机制,我们在provider项目的yml里面改一下status的名称,加个Vae,如下:

instance-id: provider-8001Vae

热部署更新,可以不用重启,刷新浏览器,看看

status也变成Vae了,我们现在再把Vae删了,恢复原来的

instance-id: provider-8001

再热更新一下,刷新浏览器,你会发现,provider-8001Vae和provider-8001都有,都存在。

我的不知道为什么没有出来两个,我修改之后还是恢复为8001了

这就是Eureka的自我保护机制:

服务不会立即删除,Eureka会认为是网络延迟或者堵塞,反正就是不会立马删除服务,默认90秒之后如果还是没有心跳也就是回应,那才注销。默认自我保护机制是开启的,90s时间。

Eureka的发现

服务的注册很容易理解,服务的发现我不懂,据说是给消费者看看这个服务的作用用处的

首先,把provider提供者的Controller加一个方法

    @Autowired
private DiscoveryClient client;
@GetMapping(value = "/dept/discovery")
public Object discovery()
{
List<String> list = client.getServices();
System.out.println("**********" + list); List<ServiceInstance> srvList = client.getInstances("PROVIDER-DEPT");
for (ServiceInstance element : srvList) {
System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.client;
}

然后主方法加个服务发现的注解@EnableDiscoveryClient

现在启动Eureka7001服务中心,再启动provider8001项目,输入http://localhost:8001/dept/discovery

消费者项目的Controller加个代码

    // 测试@EnableDiscoveryClient,消费端可以调用服务发现
@RequestMapping(value = "/consumer/dept/discovery")
public Object discovery()
{
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);
}

然后启动项目,输入http://localhost/consumer/dept/discovery

Eureka集群

什么是集群?

所谓的集群,就是在不同的服务器上部署相同的服务。举个例子,淘宝,这么大的应用,不可能只有一个服务器,一个淘宝背后可能有上百台服务器支撑。

同样的,我们的Eureka,也不能只有一台服务器,万一这台服务器挂了怎么办?

新建Eureka集群

新建两个Eureka服务中心,一个是Eureka7002,一个是Eureka7003,新建和上面一样就不讲了,新建完成如下图

还记得我们Eureka服务中心的yml里面写的是localhost吧,现在有三个服务中心了,都写localhost就不合适了,但是我又没有多台电脑供我测试,只能修改host文件滥竽充数了。打开C:\Windows\System32\drivers\etc,找到host文件,添加下面三行

127.0.0.1 eureka7001.com

127.0.0.1 eureka7002.com

127.0.0.1 eureka7003.com

现在,开始修改我们的三个服务中心的yml吧

server:
port: 7001 eureka:
instance:
hostname: eureka7001.com #因为我修改了host文件,所以这里相当于还是localhost
# hostname: localhost #eureka服务端的实例名称 client:
register-with-eureka: false #false\u8868\u793A\u4E0D\u5411\u6CE8\u518C\u4E2D\u5FC3\u6CE8\u518C\u81EA\u5DF1\u3002
fetch-registry: false #false\u8868\u793A\u81EA\u5DF1\u7AEF\u5C31\u662F\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u6211\u7684\u804C\u8D23\u5C31\u662F\u7EF4\u62A4\u670D\u52A1\u5B9E\u4F8B\uFF0C\u5E76\u4E0D\u9700\u8981\u53BB\u68C0\u7D22\u670D\u52A1
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #\u8BBE\u
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #因为我的Eureka建立了集群,所以这里写上其他集群的地址
server:
port: 7002 eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称,我在host文件里面修改了
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
server:
port: 7003 eureka:
instance:
hostname: eureka7003.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

三个服务中心的yml完成了,别忘了7001里面的Maven的pom文件,复制到7002和7003里面去,其实就一个eureka-server这个需要引用而已。

现在修改一下provider的yml

server:
port: 8001 mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径
type-aliases-package: com.vae.springcloud.entity #所有Entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件 spring:
application:
name: provider-dept
datasource:
# type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/shuyunquan?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间 eureka:
client: #客户端注册进eureka服务列表内
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: provider-8001 #这个是修改Eureka界面的Status名称
prefer-ip-address: true #这个是设置鼠标放在status上的时候,出现的提示,设置ip地址显示 info:
app.name: provider-8001
company.name: www.vae.com
build.artifactId: $project.artifactId$
build.version: $project.version$

就改了一个defaultZone,改成集群了。

我有一点还不明白,集群,服务中心的yml的defaultZone写的其他集群的地址,这要是有100个集群,我写100个?而且provider注册者的defaultZone也是写的所有集群的地址,也写100个?这里肯定有更好的方法,我还不知

启动eureka集群,也就是启动三个eureka项目,如图:

SpringCloud笔记三:Eureka服务注册与发现的更多相关文章

  1. SpringCloud 进阶之Eureka(服务注册和发现)

    1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...

  2. springcloud(二):Eureka服务注册与发现

    Spring Cloud Netflix  该项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix ...

  3. F版本SpringCloud 3—大白话Eureka服务注册与发现

    引用:服务注册与发现,就像是租房子一样 前言 今天洛阳下雨了,唉,没有想到有裹上了羽绒服,不穿冷穿了热的尴尬温度.上学工作这么多年都在外面,家里竟然没有一件春天的外套. 日常闲聊之后,开始今天的芝士环 ...

  4. SpringCloud学习系列-Eureka服务注册与发现(1)

    1.Eureka的基本架构 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...

  5. SpringCloud学习系列-Eureka服务注册与发现(2)

    构建 microservicecloud-eureka-7001 eureka服务注册中心Module 1.新建microservicecloud-eureka-7001 2.pom <proj ...

  6. 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...

  7. SpringCloud学习系列-Eureka服务注册与发现(3)

    修改microservicecloud-provider-dept-8001 1.修改pom 增加内容 <!-- 将微服务provider侧注册进eureka --> <depend ...

  8. SpringCloud学习系列-Eureka服务注册与发现(4)

    actuator与注册微服务信息完善 1.主机名称:服务名称修改 当前问题 含有主机名称 修改修改microservicecloud-provider-dept-8001 的yml文件 修改内容 eu ...

  9. SpringCloud(3)---Eureka服务注册与发现

    Eureka服务注册与发现 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务 ...

  10. SpringCloud(二)- 服务注册与发现Eureka

    离上一篇微服务的基本概念已经过去了几个月,在写那篇博客之前,自己还并未真正的使用微服务架构,很多理解还存在概念上.后面换了公司,新公司既用了SpringCloud也用了Dubbo+Zookeeper, ...

随机推荐

  1. eos 创建两对的公钥和私钥, 钱包,交易所转账到主网,主网到交易所

    在ubuntu18.04上安装EOS的目的: 在ubuntu中,进行eos源码编译和安装 在不联网的安全环境下,用eos官方的命令行工具,创建自己的公钥和私钥 用eos官方的命令行工具,创建钱包,执行 ...

  2. XCopy 小技巧

    使用XCOPY Copy 一个文件时,如果目标地址没有对应的文件, 系统会提示选择是文件,还是目录,如下图所示. 有时我们不想出现这个提示,这是只需要修改目标文件的写法.如下 将 "D:\t ...

  3. LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

    这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...

  4. HTML5存储技术Storage

    前端存储技术localStorage是永久存储sessionStorage是一次会话存储 localStorage只支持string类型的存储 存进去的所有类型, 取出来之后都变成了string. 一 ...

  5. top后台执行显示:top: failed tty get 错误

    通过其他程序或脚本在非交互式模式下调用top命令,经常会出现:   top: failed tty get 错误 解决办法:加个-b 选项皆可 -b : Batch mode operation   ...

  6. dede 5.7 任意用户重置密码前台

    返回了重置的链接,还要把&amp删除了,就可以重置密码了 结果只能改test的密码,进去过后,这个居然是admin的密码,有点头大,感觉这样就没有意思了 我是直接上传的一句话,用菜刀连才有乐趣 ...

  7. HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法

    深蓝前几篇博客讲了Fabric的环境搭建,在环境搭建好后,我们就可以进行Fabric的开发工作了.Fabric的开发主要分成2部分,ChainCode链上代码开发和基于SDK的Application开 ...

  8. HBase原理分析

    宏观架构 HBase从宏观上看只有HMaster.RegionServer和zookeeper三个组件. Master: 负责启动的时候分配Region到具体的RegionServer,执行各种管理操 ...

  9. 点击button自动刷新页面的奇葩错误

    以前在写练习的时候遇到过这样一个问题,自己在html中写了一个button <button>test1</button> 在没有给其附上onclick事件时是点击是不会有任何反 ...

  10. 小小知识点(五)——MATLAB对复数的操作

    MATLAB程序 a=3+4*i %复数 real(a) %求复数的实部 imag(a) %求复数的虚部 abs(a) %求复数的模 angle(a) %求复数的相位 conj(a) %求复数的复共轭 ...