1 Spring Cloud Eureka是什么

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

Spring Cloud Eureka 是一个基于 REST 的服务,并且提供了基于 Java 的客户端组件,能够非常方便地将服务注册到 Spring Cloud Eureka 中进行统一管理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhIlCNf6-1665802569838)(7.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-15RlMTjx-1665802569839)(8.png)]

Eureka 是基于 AP 原则构建的。

CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

在分布式系统领域有个著名的 CAP 定理,即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。

1.在保证C和P的情况下
为了保证数据一致性,data1需要将数据复制给data2,即data1和data2需要进行通信。但是由于网络是不可靠的,我们系统有保证了分区容忍性,也就是说这个系统是可以容忍网络的不可靠的。这时候data2就不一定能及时的收到data1的数据复制消息,当有请求向data2访问number数据时,为了保证数据的一致性,data2只能阻塞等待数据真正同步完成后再返回,这时候就没办法保证高可用性了。

所以,在保证C和P的情况下,是无法同时保证A的。

2.在保证A和P的情况下
为了保证高可用性,data1和data2都有在有限时间内返回。同样由于网络的不可靠,在有限时间内,data2有可能还没收到data1发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问data1的数据是不一致的,也就是违法了C。

也就是说,在保证A和P的情况下,是无法同时保证C的。

3.在保证A和C的情况下
如果要保证高可用和一致性,只有在网络情况良好且可靠的情况下才能实现。这样data1才能立即将更新消息发送给data2。但是我们都知道网络是不可靠的,是会存在丢包的情况的。所以要满足即时可靠更新,只有将data1和data2放到一个区内才可以,也就丧失了P这个保证。其实这时候整个系统也不能算是一个分布式系统了。

想要保证 AP 就要用 Eureka,想要保证 CP 就要用 Zookeeper。

Dubbo 中大部分都是基于 Zookeeper 作为注册中心的。

Spring Cloud 框架中,更多考虑的服务可用性,所以首选 Eureka。

2 搭建Eureka服务层注册中心

1 导入依赖

<!-- Spring Boot -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath />
</parent>
<dependencies>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- eureka服务中心依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
</dependencies>
<!-- Spring Cloud -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2 搭建启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

@EnableEurekaServer 注解表示当前服务层是一个Eureka注册中心服务

3 配置application.properties文件

#服务名称
spring.application.name=eureka-server
#服务中心地址
eureka.instance.hostname=localhost
#服务端口号
server.port=8761
# 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
eureka.client.fetch-registry=false
#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

4 启动服务层,访问地址: http://localhost:8761,看到如下页面,服务中心搭建成功

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LChQh4J6-1665802569842)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCEae204d0a9bee3b313208cceed967cd64/608)]

Eureka控制台参数说明

Home

进入Eureka控制台首页,首先看HOME页的头部

System Status

Environment : 环境,默认为test, 该参数在实际使用过程中,可以不用更改

Data center : 数据中心,使用的是默认的是 “default”

Current time:当前的系统时间

Uptime : 已经运行了多少时间

Lease expiration enabled :是否启用租约过期 , 自我保护机制关闭时,该值默认是true, 自我保护机制开启之后为false。

Renews threshold : 每分钟最少续约数

Renews (last min) : 最后一分钟的续约数量(不含当前,1分钟更新一次)

红字提醒

系统在三种情况下会出现红色加粗的字体提示:

1.在配置上,自我保护机制关闭,且检测心跳的阈值小于指定阈值,会有如下提示

RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

2.自我保护机制开启了,检测心跳的阈值小于指定阈值,会有如下提示

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE

NOT BEING EXPIRED JUST TO BE SAFE.

3.在配置上,自我保护机制关闭了,会有如下提示

THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

DS Replicas

Eureka集群节点副本

General Info

total-avail-memory : 总共可用的内存

environment : 环境名称,默认test

num-of-cpus : CPU的个数

current-memory-usage : 当前已经使用内存的百分比

server-uptime : 服务启动时间

registered-replicas : 相邻集群复制节点

unavailable-replicas :不可用的集群复制节点,如何确定不可用? 主要是server1 向 server2和server3 发送接口查询自身的注册信息,

如果查询不到,则默认为不可用 , 也就是说如果Eureka Server自身不作为客户端注册到上面去,则相邻节点都会显示为不可用。

available-replicas :可用的相邻集群复制节点

Instance Info

ipAddr:当前实例IP地址

status:当前实例状态 .up 上线,down 下线

3 搭建服务提供者服务

1 导入依赖

<!-- Spring Boot -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath />
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 基于eureka服务中心的 服务提供者组件 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
</dependencies>
<!-- Spring Cloud -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2 编程启动类,添加Eureka 的客户端注解

@SpringBootApplication
@EnableEurekaClient//当前服务是一个 Eureka 的客户端。
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}
@RestController
@RequestMapping("/user")
public class UserController {@Value("${server.port}")private Integer port;@GetMapping("/hello")public String hello(String userName) {JSONObject obj = new JSONObject();obj.put("port", port);obj.put("userName", userName);return obj.toString();}
}

3 创建application.properties文件,配置信息如下:

#服务名称
spring.application.name= eureka-client-user-service
server.port=8081
#这是我们之前启动的 Eureka 服务的地址,在启动的时候需要将自身的信息注册到 Eureka 中去。
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#使用真实ip地址
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
#健康检查地址
eureka.instance.status-page-url=http://${spring.cloud.client.ip-address}:${server.port}/actuator/health

4 启动服务提供者服务,刷新 注册中心服务 地址,看到信息如下:说明 服务提供者 注册成功

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skMuJvdN-1665802569844)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCEf8172a87ecaca9393fab5baffb69f65a/635)]

4 搭建消费者服务

1 导入依赖。依赖和服务提供者服务一样,这里就不贴了

2 编写启动类。启动类也和服务提供者服务一样,这里不贴了

3 配置application.properties文件,代码如下:

spring.application.name= eureka-client-xiaofei-service
server.port=8082
#这是我们之前启动的 Eureka 服务的地址,在启动的时候需要将自身的信息注册到 Eureka 中去。
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

4 配置RestTemplate ,RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。我们通过配置 RestTemplate 来调用接口。

@LoadBalanced 注解,这个注解会自动构造 LoadBalancerClient 接口的实现类并注册到 Spring 容器中。这是负载均衡的注解

代码如下所示

@Configuration
public class RestBean {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

5 定义消费 ‘服务提供者服务’ 的控制器,代码如下:

@RestController
@RequestMapping("/xiaofei")
public class UserXiaofeiController {//注入restTemplate@Autowiredprivate RestTemplate restTemplate;@GetMapping("/hello")public String hello(String userName) {//        return restTemplate.getForObject("http://localhost:8801/user/hello?userName=" + userName, String.class);Map<String, Object> map = new HashMap<>();map.put("userName", userName);//url中的ip和端口换成服务提供者的服务名称,实现负载均衡return restTemplate.getForObject("http://eureka-client-user-productor/user/hello?userName={userName}", String.class, map);}
}

6 刷新注册中心地址,查看消费者服务 是否注册成功。如图所示

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGmeVoSH-1665802569846)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE39e9d2c0180fd19051dd0f9563b962fc/666)]

7 输入 消费者服务的控制器方法地址: http://localhost:8082/xiaofei/callHello ,查看结果

是否获取到 ‘服务提供者服务’ 提供的数据,如图所示:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXYURY0p-1665802569847)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE86c75e920db8cd988e1430c2c07f08e6/672)]

5 Eureka注册中心开启密码认证

​ Eureka 自带了一个 Web 的管理页面,方便我们查询注册到上面的实例信息,但是有一个问题:如果在实际使用中,注册中心地址有公网 IP 的话,必然能直接访问到,这样是不安全的。所以我们需要对 Eureka 进行改造,加上权限认证来保证安全性。

1 重构我们的注册中心服务,添加依赖

<!--用密码验证登录注册中心所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

2 配置安全管理类

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {// 关闭csrfhttp.csrf().disable();// 支持httpBasichttp.authorizeRequests().anyRequest().authenticated().and().httpBasic();}
}

​3 在application.propertis 配置文件,添加用户名和密码配置

#用户名
spring.security.user.name=rock
#密码
spring.security.user.password=123456

4 修改客户端的注册中心地址:服务提供者服务和消费者服务注册中心地址添加 用户名和密码信息

#这是我们之前启动的 Eureka 服务的地址,在启动的时候需要将自身的信息注册到 Eureka 中去。
eureka.client.serviceUrl.defaultZone=http://rock:123456@localhost:8761/eureka/

5 搭建完毕,这是访问注册中心服务,需要输入用户名和密码才能访问。

6 Spring Cloud使用Eureka集群搭建实现高可用服务注册中心

​ 前面我们搭建的注册中心只适合本地开发使用,在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单:每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。

3 注册中心集群案例演示

下面我们以 2 个节点为例来说明搭建方式。假设我们有 one 和 two两台机器,需要做的就是:

  • 将 one 注册到 two 上面。
  • 将two 注册到 one 上面。

说明:这里我就用在一个电脑上,用2个相同项目,端口不一样,来代替one机器和two机器

1 创建一个新的 注册服务中心 项目 springcloud-demo-eureka-server-one,导入依赖,依赖不变,这里就不贴了

2 添加新的配置文件application-one.properties

server.port=8761
#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://rock:123456@localhost:8762/eureka/

3 添加新的配置文件application-two.properties

server.port=8762
#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://rock:123456@localhost:8761/eureka/

4 配置application.properties, 配置 spring.profiles.active=one ,这里的one是指向 application-one.properties 配置文件

#服务名称
spring.application.name=eureka-server-one
#服务中心地址
eureka.instance.hostname=localhost# 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
eureka.client.fetch-registry=false#用户名
spring.security.user.name=rock
#密码
spring.security.user.password=123456
# 指定不同的环境
spring.profiles.active=one

5 配置启动类 和 安全管理配置类,这里也和前面一样,这里就不贴了

6 创建第二个注册服务中心 项目springcloud-demo-eureka-server-two,步骤1,2,3 都一样,这里不重复贴了

7 配置springcloud-demo-eureka-server-two 的application.properties, 配置 spring.profiles.active=two ,这里的one是指向 application-two.properties 配置文件

#服务名称
spring.application.name=eureka-server-two
#服务中心地址
eureka.instance.hostname=localhost# 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
eureka.client.fetch-registry=false#用户名
spring.security.user.name=rock
#密码
spring.security.user.password=123456# 指定不同的环境
spring.profiles.active=two

8 在客户端中我们通过配置 eureka.client.serviceUrl.defaultZone 来指定对应的注册中心,当我们的注册中心有多个节点后,就需要修改 eureka.client.serviceUrl.defaultZone 的配置为多个节点的地址,多个地址用英文逗号隔开即可:

把所有客户端的注册中心地址改成如下:

#这是我们之前启动的 Eureka 服务的地址,在启动的时候需要将自身的信息注册到 Eureka 中去。
eureka.client.serviceUrl.defaultZone=http://rock:123456@localhost:8761/eureka/,http://rock:123456@localhost:8762/eureka/

9 先启动这两个注册中心项目,然后启动其他客户端项目:在地址 http://localhost:8761/ 和 http://localhost:8762/,都能看到客户端注册的服务,如下图

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcqwE7Ui-1665802569848)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE9712be7e6575befb95e9fc91239ffc37/775)]

10 然后我们关闭其中任意一个 注册中心服务,我们访问 消费者服务的地址 http://localhost:8082/xiaofei/callHello,都可以接收到

服务提供者服务 提供的数据。说明集群搭建成功

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQDo4R9R-1665802569849)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE5dda11cd94a8b9c09fceeef1dd636b60/783)]

11 结论:无论那个注册中心服务出现问题,客户端应用都能继续使用存活的注册中心。

4 Eureka自我保护模式和InstanceID的配置

关闭自我保护

​ 保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式,Eureka Server 将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 Eureka Server 节点会自动退出保护模式。如果在 Eureka 的 Web 控制台看到下图 所示的内容,就证明 Eureka Server 进入保护模式了。

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaRd6T65-1665802569850)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE1e9508719c75e5bd8a651205f6560959/801)]

关闭自我保护模式的步骤

1 在注册中心服务 配置文件中,加入下面配置

#关闭自我保护模式
eureka.server.enable-self-preservation=false

2 再次访问注册中心,如果下图所示,说明配置关闭成功

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3rYi1YT-1665802569851)(https://note.youdao.com/yws/public/resource/d64ed1b894660deb7447249f26dc1020/xmlnote/WEBRESOURCE01c5174c51be61cc815a53472833423b/796)]

自定义 Eureka 的 InstanceID

​ 客户端在注册时,服务的 Instance ID 的默认值的格式如下:

spring.cloud.client.hostname:{spring.cloud.client.hostname}:spring.cloud.client.hostname:{spring.application.name}

Eureka注册中心相关推荐

  1. Eureka 注册中心/服务发现框架

    Eureka 注册中心/服务发现框架 Eureka注册中心/服务发现框架 如何使用构建 Eureka Server ? 加入依赖(此处以Maven为例) 创建Eureka Server 主运行类 单机 ...

  2. Fescar 发布 0.3.0 版本, 支持 Eureka 注册中心

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Fescar 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务. 本次更新内容如下: 特性 [#510] 新增 Eure ...

  3. (转)微服务_创建一个简单的Eureka注册中心

    原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...

  4. 改造微服务注册到eureka注册中心

    注册到Eureka 注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中. 修改itcast-service-provider工程 在pom.xm ...

  5. 搭建eureka注册中心

    有没有问题? 简单回顾一下,刚才我们写了什么: service-provider:一个提供根据id查询用户的微服务. service-consumer:一个服务调用者,通过RestTemplate远程 ...

  6. 创建集群版的Eureka注册中心

    我们搭建了一个Eureka服务注册中心,就是Eureka Server,他提供了服务的注册和发现,那么其实对于Eureka服务注册中心来讲,我们整个微服务开发当中,它是一个非常重要的环节,我们所有的服 ...

  7. 什么是Eureka注册中心

    我们来看一下什么是Eureka注册中心,Eureka是Netflix开发的服务发现组件,这个Netflix我们以前见到过,这里我们就不说了,他本身是一个基于Rest的服务,注册中心指的是服务注册中心, ...

  8. 高可用Eureka注册中心配置说明(双机部署)

    目  录 1. 高可用EureKa注册中心示意图 2. Eureka实例相互注册配置 3. 微服务注册到Eureka配置 4. 启动步骤及配置成功检查 5. 说明事项 1. 高可用EureKa注册中心 ...

  9. 【公益】开放一台Eureka注册中心给各位Spring Cloud爱好者

    这是一篇博客福利! 相信很多关注Spring Cloud的爱好者们,不论是读我的系列文章和书籍还是看其他朋友们写的博客佳文,都不可避免的启动多个项目来体验Spring Cloud带来的整套微服务架构方 ...

  10. eureka注册中心HA集群搭建

    今天我们讲一下高可用的eureka注册中心(eureka server cluster) SpringCloud支持Eureka.Zookeeper.Consul作为注册中心,这里我们选择Eureka ...

最新文章

  1. 解决“ORA-01036: 非法的变量名/编号“错误
  2. 每天拖地好麻烦?用这几招,地板每天光亮如新!
  3. Xamarin图表开发基础教程(7)OxyPlot框架
  4. Nmcli 网络管理命令行工具基础
  5. 国产化达梦数据库数据迁移文档:oracle11g数据库转达梦8数据库实例演示
  6. 你懂change buffer吗
  7. 谁说PCB布线不能走直角。。。
  8. 电视视频直播在线播放网站PHP源码V1.2
  9. Codeforces Round #363 (Div. 2) B. One Bomb (水题)
  10. 48 款数据可视化分析工具大集合!
  11. 【绝对干货】kafka偏移量设置
  12. Web服务器群集--Nginx网站服务(运行控制,访问状态统计,基于授权和客户端的访问控制,基于域名,端口,IP的虚拟web主机访问)
  13. vim保存分享录制宏
  14. MWORKS.Syslab 使用攻略 | 信号处理工具箱实践-基于时差定位法的声源定位
  15. Hadoop/Spark集群搭建图文全攻略
  16. 《神经网络与深度学习》邱希鹏 学习笔记 (1)
  17. 计算机类sci中接受综述么,SCI期刊接受的5大类型文章
  18. 康永,给残酷社会的善意短信
  19. CelebA数据集下载|HTTPSConnectionPool(host=‘drive.google.com‘, port=443)|RuntimeError:Dataset not found
  20. 解决Spring 鸡(J)四(s)屁(p)文件夹下面有(J)(S)(P)文件但访问404的问题

热门文章

  1. 用Google浏览器下载网页视频(包括优酷,土豆等网站视频)
  2. 一个故事谈谷歌与百度
  3. 抄360一个关键的洁净实现(一)
  4. 走进绚烂多彩的属性动画-Property Animation之TimeInterpolator和TypeEvaluator(下篇)
  5. win32:超时Timeout和延时Delay的区别
  6. 双十一频繁弹窗,一招解决
  7. Spring事务7种传播行为速记方法
  8. 我所理解的“读书百遍,其义自现”
  9. 谁发明了计算机科学bug,为什么计算机故障被称为“bug”
  10. python做excel宏_利用Python 开发 Excel 宏脚本的神器!