💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## **1. 为什么要用注册中心** 1. 微服务数量众多,要进行远程调用就需要知道服务端的ip地址和端口,注册中心帮助我们管理这些服务 的ip和端口。 2. 微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列 表,客户端获取到可用的服务进行调用。 ## 2. **Eureka简介** 1. Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能。 2. Spring Cloud Eureka 提供 **Eureka Server 服务端**与 **Eureka Client 客户端** ,服务端即是Eureka服务注册中心,客户端完成微服务向**Eureka服务的注册与发现。** 下图显示了 Eureka Server 与 Eureka Client 的关系 ![](https://img.kancloud.cn/f6/f6/f6f6ca86a31d4f2c20a04a6e9b17d316_945x460.png) 如图所示, 1. 对于web应用程序来说,server和client都是Eureka client。 2. **web应用服务端**向Eureka server注册自己的服务信息(ip和端口号) 3. **web应用客户端**向Eureka server查询服务端的信息,然后进行访问 ## **3. 搭建单机版 Eureka Server 服务注册中心** ### 3.1 创建Eureka 服务端工程 1. ide创建Eureka server工程,maven模块 ![](https://img.kancloud.cn/00/bd/00bda647b5512fdcc6851b544a5f645e_774x521.png) ![](https://img.kancloud.cn/74/0a/740aa4725cb21170ed9e218aef1f16c4_734x552.png) ![](https://img.kancloud.cn/5a/36/5a36dfd9e55e495781339bb9ed5fc4b2_734x552.png) ![](https://img.kancloud.cn/ff/d6/ffd638d5ddc8ad7c163b6665fcdbfe1d_320x255.png) **2. 修改pom,导入Eureka server依赖启动器** ~~~ ... <dependencies> <!--导入Eureka 服务端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project> ~~~ **3. 配置 application.yml 文件** ~~~ server: port: 6001 # 服务端口 eureka: instance: hostname: eureka6001.com # eureka服务端的实例名称 client: registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中 fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息 serviceUrl: # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口) defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ server: enable-self-preservation: false # 禁用自我保护机制 ~~~ **4. 创建启动类** 在启动类上用`@EnableEurekaServer`注解标识Eureka注册中心 ~~~ package com.tuna.springcloud.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer //标识一个Eureka Server 服务注册中心 @SpringBootApplication public class EurekaServer_6001 { public static void main(String[] args) { SpringApplication.run(EurekaServer_6001.class, args); } } ~~~ ### 3.2 启动Eureka工程并测试 [http://localhost:6001/](http://localhost:6001/) 或者[http://eureka6001.com:6001/](http://eureka6001.com:6001/) ![](https://img.kancloud.cn/71/70/7170a12b09339c6678d5d8b753c7b379_823x609.png) 上图还没有Eureka客户端进行注册 ## **4. 服务注册到 Eureka Server 服务注册中心** **将web应用程序服务端注册到Eureka Server** ![](https://img.kancloud.cn/e4/4a/e44a08b32acfc27abee50afea4cab9aa_1010x297.png) **1. 修改web服务端pom,引入eureka-client 启动器** ``` <!-- 导入Eureka客户端的依赖,将 微服务提供者 注册进 Eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` **2. 配置 application.yml 文件,向Eureka server注册自己的服务信息** ~~~ eureka: client: registerWithEureka: true # 服务注册开关 fetchRegistry: false #服务发现开关 serviceUrl: # 注册到哪一个Eureka Server服务注册中心,多个中间用逗号分隔 defaultZone: http://localhost:6001/eureka instance: instanceId: ${spring.application.name}:${server.port} # 等价于microservice-product:8001 # prefer-ip-address: true #访问路径就会显示成IP地址 ~~~ **3. 启动类上加`@EnableEurekaClient` 注解,本服务启动后会自动注册进Eureka中心** ~~~ package com.tuna.springcloud.server; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @MapperScan("com.tuna.springcloud.server.mapper") @SpringBootApplication public class ProductProvider_8001 { public static void main(String[] args) { SpringApplication.run(ProductProvider_8001.class, args); } } ~~~ **4. 启动服务** 有图看到,web server已经注册到Eureka ![](https://img.kancloud.cn/d9/3b/d93b47ceba02155f1f79686748ce8b3e_1123x476.png) ### 解决访问路径显示ip 鼠标放在Eureka client上边时,不显示ip ![](https://img.kancloud.cn/ec/01/ec01c9ef66dd8587874dd681f41efae1_1184x493.png) 客户端yml配置prefer-ip-address: true ~~~ prefer-ip-address: true #客户端yml访问路径就会显示成IP地址 ~~~ ![](https://img.kancloud.cn/eb/4b/eb4b5680cf86a302a88b72c5defad44d_918x340.png) 再次访问 ![](https://img.kancloud.cn/df/f8/dff87a11c001b764a54d9457254c6c07_1216x437.png) ## 5. Eureka Server自我保护机制 ### **5.1 自我保护模式介绍** 1. 当Eureka Server 在一定时间内(默认90秒)没有接收到某个微服务的心跳,Eureka Server会从服务列表将此服务实例注销。但是如果出现网络异常情况(微服务本身是正常的),微服务与Eureka Server之间无法正常通信! **以上行为可能变得非常危险了——因为微服务本身其实是正常的,此时本不应该注销这个微服务。** 2. Eureka Server有一种 **“自我保护模式”** 来解决这个问题——**当Eureka Server在短时间内丢失过多客户端时(可能发 生了网络故障),此时Eureka Server会进入自保护模式,一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server会自动退出自我保护模式。** 3. ***自我保护模式是一种应对网络异常的安全保护措施。*** 它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。 ### 5.2 开启自我保护机制 ~~~ server: enable-self-preservation: true # 禁用自我保护机制 ~~~ ## **6. 集群版 Eureka Server** ### 6.1 集群模式简介 1. 为了保证Eureka的高可用性,spring提供了Eureka server的集群模式。 2. 集群模式下各个Eureka server之间互相注册。 3. 微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。 4. 微服务会定时向Eureka Server发送心跳,报告自己的状态。 5. 微服务从注册中心获取服务地址以RESTful方式发起远程调用。 ![](https://img.kancloud.cn/dc/61/dc6122ffeb7a3d9f736b63c403ccfbe2_994x515.png) ### 6.2 集群模式搭建 **1. 按照单机版Eureka server,再次新建一个Eureka02** ![](https://img.kancloud.cn/7c/80/7c80cc7813bb8bb39e446c6374181e7e_345x275.png) **2. 参考Eureka单机版修改pom,启动类** **3. 修改yml文件** 修改配置 6002端口的指向6001端口,**多个用逗号分隔,**即要向集群中的其他Eureka 节点注册自己的信息 ~~~ serviceUrl: defaultZone: http://eureka6001.com:6001/eureka/ # 集群版,指向其他Eureka server节点 ~~~ 完整 ~~~ server: port: 6002 # 服务端口 eureka: instance: hostname: eureka6002.com # eureka服务端的实例名称 client: registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中 fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息 serviceUrl: defaultZone: http://eureka6001.com:6001/eureka/ # 集群版,指向其他Eureka server节点 # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口) server: enable-self-preservation: true # 禁用自我保护机制 ~~~ **4. 配置域名,区分两个Eureka server** `C:\Windows\System32\drivers\etc\hosts `文件 ``` 127.0.0.1 eureka6001.com 127.0.0.1 eureka6002.com ``` ![](https://img.kancloud.cn/38/c2/38c25720f03d840633ffea50d3d4eba7_615x226.png) ![](https://img.kancloud.cn/15/d4/15d48167552013833b84319833556812_736x259.png) ## 7. Eureka 集群模式 client如何配置 yml文件中,将所有节点连接加入即可 ``` serviceUrl: # 注册到哪一个Eureka Server服务注册中心,多个中间用逗号分隔 #defaultZone: http://localhost:6001/eureka defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka ``` 完整 ``` eureka: client: registerWithEureka: true # 服务注册开关 fetchRegistry: true # 服务发现开关 serviceUrl: # 注册到哪一个Eureka Server服务注册中心,多个中间用逗号分隔 #defaultZone: http://localhost:6001/eureka defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka instance: instanceId: ${spring.application.name}:${server.port} # 等价于microservice-product:8001 prefer-ip-address: true #访问路径就会显示成IP地址 ``` 应用在两个集群节点都进行了注册 ![](https://img.kancloud.cn/5d/0b/5d0b1a487b80d193b1a9be18a24fd751_914x419.png) ![](https://img.kancloud.cn/0c/10/0c107fdd678d7e9cc90c63869b70efbf_905x231.png)