[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)
- springcloud
- springcloud的作用
- springboot服务提供者和消费者
- Eureka
- ribbon
- Feign
- feign在微服务中的使用
- feign充当http请求工具
- Hystrix 熔断器
- Zuul 路由网关
- Spring Cloud Config 分布式配置中心
- config介绍与配置
- Spring Cloud Config 配置实战
- Spring Cloud Bus
- gateway
- 概念讲解
- 实例
- GateWay
- 统一日志追踪
- 分布式锁
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安装
- 1.2 特性
- 1.3 实例
- 1. 整合nacos服务发现
- 2. 整合nacos配置功能
- 1.4 生产部署方案
- 环境隔离
- 原理讲解
- 1. 服务发现
- 2. sentinel
- 3. Seata事务
- CAP理论
- 3.1 安装
- 分布式协议
- 4.熔断和降级
- springcloud与alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服务框架付费
- SkyWalking
- 介绍与相关资料
- APM系统简单对比(zipkin,pinpoint和skywalking)
- server安装部署
- agent安装
- 日志清理
- 统一日志中心
- docker安装部署
- 安装部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定时清理数据
- index Lifecycle Management
- 没数据排查思路
- ELK自身组件监控
- 多租户方案
- 慢查询sql
- 日志审计
- 开发
- 登录认证
- 链路追踪
- elk
- Filebeat
- Filebeat基础
- Filebeat安装部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安装
- rpm安装
- docker安装Logstash
- grok调试
- Grok语法调试
- Grok常用表达式
- 配置中常见判断
- filter提取器
- elasticsearch
- 安装
- rpm安装
- docker安装es
- 使用
- 概念
- 基础
- 中文分词
- 统计
- 排序
- 倒排与正排索引
- 自定义dynamic
- 练习
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- kibana
- 安装
- docker安装
- rpm安装
- 整合
- 收集日志
- 慢sql
- 日志审计s
- 云
- 分布式架构
- 分布式锁
- Redis实现
- redisson
- 熔断和降级