Spring Cloud与Eureka
Spring Cloud与Eureka
- 一、使用SpringCloud注册中心Eureka
- 二、搭建与配置 Eureka服务注册中心
- 2.1 SpringCloud专栏案例采用多模块化管理,在父模块(spirngcloud-learn)中添加SpringCloud管理依赖
- 2.2 创键Eureka服务端模块(springcloud-eureka-server)
- 三、向Eureka服务注册中心注册服务
- 四、搭建高可用Eureka注册中心
- 五、Eureka示例
- 5.1 添加依赖
- 5.2 创建项目![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tcmhlbGxvd29ybGQuY29tL3Jlc291cmNlcy9hcnRpY2xlcy9zcHJpbmcvc3ByaW5nLWNsb3VkL2V1cmVrYS8xNTc4ODM2MzMyOTg5LnBuZw?x-oss-process=image/format,png)
- 配置 Eureka Server 注册中心
相关内容原文地址:
博客园:程序开发者社区:使用并认识Eureka注册中心
博客园:程序开发者社区:搭建高可用Eureka注册中心
Eureka 注册中心看这一篇就够了
一、使用SpringCloud注册中心Eureka
在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的, Spring cloud提供了多种服务注册与发现的实现方式,例如: Eureka、Consu、 Zookeeper
SringCloud支持得最好的是 Eureka,其次是 Consul,再次是 Zookeeper。
- 什么是服务治理:
在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。 - 服务注册与发现
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。
另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,让后在实现本地rpc调用远程。 - Eureka是什么
Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。
Eureka是一个基于REST的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移
Eureka采用了C-S(客户端/服务端)的设计架构,也就是Eureka由两个组件组成:Eureka服务端 和 Eureka客户端。Eureka server作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka server服务端,并维持心跳连接, Eureka客户端是一个Java客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等。
1.1 Eureka和Zookeeper对比
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)
由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡,在此 Zookeeper保证的是CP而 Eureka则是AP。
- Consistency(一致性), 数据一致更新,所有数据变动都是同步的
- Availability(可用性), 好的响应性能
- Partition tolerance(分区容忍性) 可靠性
- “C”是指一致性,即当一个Process(过程)修改了某个数据后,其他Process读取这是数据是,得到的是更新后的数据,但并不是所有系统都 可以做到这一点。例如,在一些并非严格要求一致性的系统中,后来的Process得到的数据可能还是修改之前的数据,或者需要等待一定时间后才能得到修改 之后的数据,这被成为“弱一致性”,最经典的应用就是DNS系统。当用户修改了DNS配置后,往往不会马上在全网更新,必定会有一个延迟,这个延迟被称为 “不一致窗口”,它的长度取决于系统的负载、冗余的个数等因素。但对于某些系统而言,一旦写入,后面读取的一定是修改后的数据,如银行账户信息,这被称为 “强一致性”。
- “A”是指可用性。即系统总是能够为用户提供连续的服务能力。当用户发出请求是,系统能给出响应(成功或者失败),而且是立即给出响应,而不是等待其他事情完成才响应。如果需要等待某件事情完成才响应,那么“可用性”就不存在了。
- “P”是指容错性。任何一个分布式计算系统都是由多个节点组成的。在正常情况下,节点与节点之间的通信是正常的。但是在某些情况下,节点之间的通信会 断开,这种断开成为“Partition”。在分布式计算的实现中,Partition是很常见的,因为节点不可能永远不出故障,尤其是对于跨物理地区的 海量存储系统而言,而容错性则可以保证如果只是系统中的部分节点不可用,那么相关的操作仍旧能够正常完成。
1.1.1 Zookeeper保证CP
在 ZooKeeper中,当 master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader选举,但是问题在于,选举 leader需要一定时间,且选举期间整个 ZooKeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得 ZooKeeper集群失去 master节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的。
1.1.2 Eureka保证AP
Eureka优先保证可用性, Eureka各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka的客户端在向某个 Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台 Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)
所以 Eureka在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像 zookeeper那样使整个注册服务瘫痪, Eureka优先保证了可用性。
二、搭建与配置 Eureka服务注册中心
SpringCloud要使用 Eureka注册中心非常简单和方便, SpringCloud中的Eureka服务注册中心实际上也是一个SpringBoot工程,我们只需通过引入相关依赖和注解配置就能让 SpringBoot构建的微服务应用轻松地与Eureka进行整合,他不像Zookeeper那样需要安装独立的Zookeeper服务。
2.1 SpringCloud专栏案例采用多模块化管理,在父模块(spirngcloud-learn)中添加SpringCloud管理依赖
<!--使用spring cloud要添加依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 创键Eureka服务端模块(springcloud-eureka-server)
2.2.1 添加Eureka服务端依赖
<!--eureka服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2.2 配置application.yml
spring:
application:
name: springcloud-eureka-server
server:
port: 8700
#设置该服务中心的hostname,指定ip,该实例名称不能重复
eureka:
instance:
hostname: localhost
client:
#由于我们目前创建的应用是一个服务注册中心,而不是一个普通的应用,默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
register-with-eureka: false
#表示是否从Eureka Server获取注册信息,默认为true。如果这是一个单点的 Eureka Server,不需要同步其他节点的数据,可以设为false。
fetch-registry: false
#指定服务注册中心的位置
#如果是集群,Eureka集群相互指向注册中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
server:
#自我保护模式默认是自动开启的,可以选择关闭,禁用自我保护模式,保证不可用的服务及时剔除
enable-self-preservation: true
#剔除失效服务间隔单位ms,默认1分钟
eviction-interval-timer-in-ms: 20000
#留存的服务示例低于多少比例进入保护模式,默认85%
renewal-percent-threshold: 0.5
2.2.3 在启动类上添加@EnableEurekaServer注解
2.2.4 启动Eureka服务端,访问http://localhost:8700/显示
三、向Eureka服务注册中心注册服务
3.1 修改服务提供者(springcloud-service-provider)
在服务提供者加入Eureka客户端依赖
<!--spring cloud集成eureka客户端的起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在主类上添加@EnableEurekaClient注解
修改服务提供者的application.yml配置添加Eureka注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8700/eureka
3.2 修改服务消费者(springcloud-service-consumer)
服务的发现由 eureka客户端实现,而服务的消费由 Ribbon实现也就是说服务的调用需要 eureka客户端和 Ribbon两者配合起来才能实现。
- Eureka客户端是什么
Eureka客户端是一个Java客户端,用来连接 Eureka服务端,与服务端进行交互、负载均衡,服务的故障切换等 - Ribbon是什么
Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,它会扩展 Eureka客户端的服务发现功能,实现从 Eureka注册中心中获取服务端列表,并通过Eureka客户端来确定服务端是否己经启动。
Ribbon在Eureka客户端服务发现的基础上,实现了对服务实例的选择策略从而实现对服务的负载均衡消费。
在调用服务提供者时使用 Ribbon来调用
@LoadBalanced //加入ribbon的支持,那么在调用时,即可改为使用服务名称来访问
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
加入ribbon的支持,那么在调用时,即可改为使用服务名称来访问,将ip:port改为服务名称调用就行了。
restTemplate.getForEntity("http://SPRINGCLOUD-SERVICE-PROVIDER/service/hello",String.class).getBody();
四、搭建高可用Eureka注册中心
在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性问题,不能有单点故障,由于注册中心Eureka本身也是一个服务,如果它只有一个节点,那么它有可能发生故障,这样我们就不能注册与查询服务了,所以我们需要—个高可用的服务注册中心,这就需要通过注册中心集群来解决。Eureka服务注册中心它本身也是一个服务,它也可以看做是一个提供者,又可以看做是一个消费者,我们之前通过配置eureka.client.register-with-eureka= false让注册中心不注册自己,但是我们可以向其他注册中心注册自己。
Eureka server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就会形成一组互相注册的服务注册中心,进而实现服务清单的互相同步,往注册中心A上注册的服务,可以被复制同步到注册中心B上,所以从任何一台注册中心上都能查询到已经注册的服务,从而达到高可用的效果。
4.1 Eureka注册中心高可用集群搭建
Eureka注册中心高可用集群就是各个注册中心相互注册。
复制Eureka服务端(springcloud-eureka-server)的application.yml为application-eureka8701.yml,application-eureka8702.yml,我们让8701和8702的Eureka服务相互注册。
修改application-eureka8701.yml相应的配置如下:
spring:
application:
name: springcloud-eureka-server
server:
port: 8701
#设置该服务中心的hostname,指定ip,该实例名称不能重复
eureka:
instance:
hostname: eureka8701
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka8702:8702/eureka
修改application-eureka8701.yml相应的配置如下:
spring:
application:
name: springcloud-eureka-server
server:
port: 8702
#设置该服务中心的hostname,指定ip,该实例名称不能重复
eureka:
instance:
hostname: eureka8702
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka8701:8701/eureka
五、Eureka示例
5.1 添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标地址 -->
<groupId>com.example</groupId>
<!-- 项目模块名称 -->
<artifactId>eureka-demo</artifactId>
<!-- 项目版本名称 快照版本SNAPSHOT、正式版本RELEASE -->
<version>1.0-SNAPSHOT</version>
<!-- 继承 spring-boot-starter-parent 依赖 -->
<!-- 使用继承方式,实现复用,符合继承的都可以被使用 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<!--
集中定义依赖组件版本号,但不引入,
在子工程中用到声明的依赖时,可以不加依赖的版本号,
这样可以统一管理工程中用到的依赖版本
-->
<properties>
<!-- Spring Cloud Hoxton.SR1 依赖 -->
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<!-- 项目依赖管理 父项目只是声明依赖,子项目需要写明需要的依赖(可以省略版本信息) -->
<dependencyManagement>
<dependencies>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在刚才的父工程下创建 eureka-server 注册中心的项目。
5.2 创建项目
添加依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 继承父依赖 -->
<parent>
<groupId>com.example</groupId>
<artifactId>eureka-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 项目依赖 -->
<dependencies>
<!-- netflix eureka server 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- spring boot web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring boot test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
```yml
配置文件:
application.yml
server:
port: 8761 # 端口
spring:
application:
name: eureka-server # 应用名称
配置 Eureka Server 注册中心
eureka:
instance:
hostname: localhost # 主机名,不配置的时候将根据操作系统的主机名来获取
client:
register-with-eureka: false # 是否将自己注册到注册中心,默认为 true
fetch-registry: false # 是否从注册中心获取服务注册信息,默认为 true
service-url: # 注册中心对外暴露的注册地址
defaultZone: http://eureka.instance.hostname:{eureka.instance.hostname}:eureka.instance.hostname:{server.port}/eureka/
此时如果直接启动项目是会报错的,错误信息:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect,这是因为 Eureka 默认开启了将自己注册至注册中心和从注册中心获取服务注册信息的配置,如果该应用的角色是注册中心并是单节点的话,要关闭这两个配置项。
启动类:
EurekaServerApplication.java
```java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
// 开启 EurekaServer 注解
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
访问:
访问:http://localhost:8761/
Spring Cloud与Eureka的更多相关文章
- spring cloud之eureka简介
最近线上的接口出了一些问题,有一些可能不是代码的问题,但是由于是测试和其他方面的同事爆出来的,所以感觉对接口的监控应该提上日程. 经过搜索发现,spring cloud的eureka就是专门做这方面工 ...
- Spring Cloud Security&Eureka安全认证(Greenwich版本)
Spring Cloud Security&Eureka安全认证(Greenwich版本) 一·安全 Spring Cloud支持多种安全认证方式,比如OAuth等.而默认是可以直接添加spr ...
- Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
- Spring Boot,Spring Cloud,Eureka,Actuator,Spring Boot Admin,Stream,Hystrix
Spring Boot,Spring Cloud,Eureka,Actuator,Spring Boot Admin,Stream,Hystrix 一.Spring Cloud 之 Eureka. 1 ...
- Spring Cloud 组件 —— eureka
官方文档,Spring Cloud 对其封装,Spring Cloud eureka 文档
- Spring cloud之Eureka(二)注册中心高可用
背景 在实际的生产环境中,注册中心如果只有一个,是很危险的,当这个注册中心由于各种原因不能提供正常服务或者挂掉时,整个系统都会崩溃,这是很致命的的,所以在Spring cloud 设计之初就考虑到了注 ...
- Spring Cloud 之Eureka(一)
简介 Eureka是Spring cloud 的基本套件之一,是基于Netflix 的Eureka做的二次封装,主要是负责完成微服务架构中的服务治理功能.它是微服务架构中最为核心和基础的模块,它主要是 ...
- Spring cloud Greenwich Eureka
1.父工程POM文件中: <dependencyManagement> <dependencies> <!--spring cloud--> <depende ...
- 从零开始学spring cloud(八) -------- Eureka 高可用机制
一.Eureka高可用机制介绍 Eureka服务器没有后端存储,但注册表中的服务实例都必须发送心跳以使其注册保持最新(因此可以在内存中完成). 客户端还有一个Eureka注册的内存缓存(因此,他们不必 ...
随机推荐
- 用漫画的形式展现——什么是web
Web主要经历了web1.0和web2.0的阶段.万维网的初期都是web1.0的时代:静态页面. 在不同的时代,流行的web安全问题也不太相同.在web1.0时代,web安全主要是 Web1.0:sq ...
- java混淆工具 字符串加密 程序加密 代码逻辑混淆 防止反编译
混淆工具使用文档 ht-confusion-project1.0.0 目 录 1.功能介绍... 1 2.安装说明... 3 2.1Window查询jdk版本(点击开始菜单,输入cmd, 输入java ...
- C# 串口连接的读取与发送
一.串口连接的打开与关闭 串口,即COM口,在.NET中使用 SerialPort 类进行操作.串口开启与关闭,是涉及慢速硬件的IO操作,频繁打开或关闭会影响整体处理速度,甚至导致打开或关闭串口失败. ...
- Vue2+Koa2+Typescript前后端框架教程--05Sequelize的使用(ORM)
本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize. 上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是My ...
- Redis学习之路(一)Redis简介
一.Redis简介 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求.(区别于MYSQL的二维表格的形式存储).和Memcache类似,但是很大程度上拟补 ...
- Python+MySQL随机试卷及答案生成程序
一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 下载地址:https://www.python.org/ ...
- LeetCode561 数组拆分 I
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...
- 数据库MySQL(带你零基础入门MySQL)
(一)认识数据库 redis默认端口:6379 mysql默认端口:3306 什么是数据库? 数据库的英文单词:data base,简称DB. 数据库实际上就是一个文件集合,是一个存储数据的仓库,本质 ...
- ClickHouse安装使用(单机、集群、高可用)
Clickhouse版本:20.3.6.40-2 安装包地址:https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/ 一.单机版 1.安装依赖 yum ...
- 【Oracle】下载11.2.0.4的地址
https://updates.oracle.com/download/13390677.html 这个地址就是下载Oracle 11.2.0.4版本的地址,需要有metalink账号才可以下载