SpringCloud之 Eureka注册中心

news2024/11/15 10:23:32

文章目录

  • Eureka注册中心
    • 一、服务注册与发现
      • 1.1 依赖导入
        • ①父工程 SpringCloud 版本管理
        • ②Eureka 服务端依赖
        • ③Eureka 客户端依赖
      • 1.2 服务注册
        • ①创建 Eureka 服务端的主类
        • ②设置 Eureka 服务端的配置文件
        • ③设置 Eureka 客户端的配置文件
        • ④关闭自我保护机制
      • 1.3 服务发现
        • ①远程调用
        • ②负载均衡
    • 二、注册中心高可用: 搭建 Eureka 集群
      • ①服务端创建两个配置文件
      • ②修改本地 hosts
      • ③开启两个 EurekaServer 实例
      • ④修改Eureka客户端的配置文件


提示:以下是本篇文章正文内容,SpringCloud 系列学习将会持续更新

在这里插入图片描述

Eureka注册中心

官方文档:https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/

前面我们了解了如何对单体应用进行拆分,并且也学习了如何进行服务之间的相互调用,但是存在一个问题,就是虽然服务拆分完成,但是没有一个比较合理的管理机制,如果单纯只是这样编写,在部署和维护起来,肯定是很麻烦的。
可以想象一下,如果某一天这些微服务的端口或是地址大规模地发生改变,我们就不得不将服务之间的调用路径大规模的同步进行修改,这是多么可怕的事情。我们需要削弱这种服务之间的强关联性,因此我们需要一个集中管理微服务的平台,这时就要借助我们这一部分的主角了。

Eureka 能够自动注册并发现微服务,然后对服务的状态、信息进行集中管理,这样当我们需要获取其他服务的信息时,我们只需要向 Eureka 进行查询就可以了。
在这里插入图片描述
像这样的话,服务之间的强关联性就会被进一步削弱。

一、服务注册与发现

1.1 依赖导入

①父工程 SpringCloud 版本管理

我们先在父工程中添加一下 SpringCloud 的依赖 进行版本管理,这里选用 2021.0.1 版本。
官网查看:https://spring.io/projects/spring-cloud#learn

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>2021.0.1</version>
			<type>pom</type>
			<scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

②Eureka 服务端依赖

现在我们就来搭建一个 Eureka 服务器,只需要创建一个新的 Maven 项目即可(eureka-server
接着我们为Eureka服务端添加 Eureka 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

③Eureka 客户端依赖

我们的三个微服务客户端,首先还是需要导入 Eureka 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

回到目录…

1.2 服务注册

①创建 Eureka 服务端的主类

需要使用@EnableEurekaServer注解:

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

②设置 Eureka 服务端的配置文件

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

好了,现在差不多可以启动了,启动完成后,直接localhost:8888即可访问 Eureka 的管理后台:
在这里插入图片描述

③设置 Eureka 客户端的配置文件

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8888/eureka

OK,无需在启动类添加注解,直接启动就可以了,然后打开 Eureka 的服务管理页面,可以看到我们刚刚开启的服务:
在这里插入图片描述
当我们的服务启动之后,会每隔一段时间跟 Eureka 发送一次心跳包,这样 Eureka 就能够感知到我们的服务是否处于正常运行状态。


④关闭自我保护机制

 Eureka 的自我保护机制指的是,当网络发生问题导致服务访问失败时,eureka 注册中心不会马上把应用剔除,继续保留一段时间。但这样对我们实际开发来说,需要频繁重启应用的时候,不方便测试,需要将自我保护机制关闭。

Ⅰ 修改 eureka 服务端:

eureka:
  server:
    # 关闭自我保护机制,保证不可用服务被及时剔除
    enable-self-preservation: false
    # 心跳检测时间,设置成2秒
    eviction-interval-timer-in-ms: 2000

Ⅱ 修改 eureka 客户端:

eureka:
  instance:
    # eureka客户端向服务端发送心跳的时间间隔,单位是秒(默认30秒)
    lease-renewal-interval-in-seconds: 1
    # eureka服务端在收到最后一次心跳后等待时间的上限,单位为秒(默认90秒),超时将会剔除服务
    lease-expiration-duration-in-seconds: 2

配置完成之后,经测试可体验到在服务关闭后非常快速地剔除应用。

回到目录…

1.3 服务发现

①远程调用

那么,现在我们怎么实现服务发现呢?
原本的微服务远程调用,那么就必须要知道其他服务的地址:

RestTemplate template = new RestTemplate();
User user = template.getForObject("http://localhost:8082/user/"+uid, User.class);

修改后的微服务远程调用:

a. 我们手动将 RestTemplate 声明为一个 Bean 注册到 Ioc 容器中,然后添加@LoadBalanced注解,这样 Eureka 就会对服务的调用进行自动发现,并提供负载均衡:

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced // 负载均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

b. 而现在有了 Eureka 之后,我们只需要用服务名称对其查询:

@Service
public class BorrowServiceImpl implements BorrowService {
    @Resource
    private BorrowMapper borrowMapper;
    @Resource
    // RestTemplate 支持多种方式的远程调用
    private RestTemplate template;

    @Override
    public UserBorrowView getBorrowViewByUid(int uid) {
        // 现在拿到借阅关联信息了,怎么调用其他服务获取信息呢?
        List<Borrow> borrowList = borrowMapper.getBorrowsByUid(uid);

        // 这里不用再写IP,直接写服务名称 userservice
        User user = this.template.getForObject("http://userservice/user/"+uid, User.class);
        // 这里通过调用 getForObject 来请求其他服务,并将结果自动进行封装
        List<Book> bookList = borrowList
                .stream()
                .map(b -> template.getForObject("http://bookservice/book/"+b.getBid(), Book.class))
                .collect(Collectors.toList());
        return new UserBorrowView(user, bookList);
    }
}

现在我们就可以正常调用了:
在这里插入图片描述

回到目录…

②负载均衡

🐳同一个服务器多开实例,设置不同的端口:

a. Edit Configuration… -> 选中 UserApplication -> 新建目录 Move into new folder -> 在该目录下新建 Spring Boot -> 进行如下配置
在这里插入图片描述
b. 启动所有实例:
在这里插入图片描述
c. 此时,我们在 Eureka 后台也可以看到新增的实例:
在这里插入图片描述


🐳如何观察 Eureka 对我们多实例的负载均衡:

a. 我们有2个 UserApplication 的实例,可以在控制层的某个服务调用代码中添加日志打印:当前实例的IP:PORT

@RestController
@Slf4j
public class UserController {
    @Resource
    private UserService userService;
    @Resource
    Environment environment; // org.springframework.core.env.Environment

    @GetMapping("/user/{uid}")
    public User findUserById(@PathVariable("uid") int uid) throws UnknownHostException {
        String hostIp = InetAddress.getLocalHost().getHostAddress();
        String port = environment.getProperty("server.port");
        log.info(hostIp + ":" + port + " 的findUserById()被访问了!");
        return userService.getUserById(uid);
    }
}

b. 然后重新启动。我们多次访问http://localhost:8082/borrow/3,其中 BorrowService 就会进行远程调用 UserService,这时我们通过查看 UserApplication-1 和 UserApplication-2 的控制台日志,就可以发现它们是被轮循调用的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样,服务自动发现以及简单的负载均衡就实现完成了,并且,如果某个微服务挂掉了,只要存在其他同样的微服务实例在运行,那么就不会导致整个微服务不可用,极大地保证了安全性。

回到目录…

二、注册中心高可用: 搭建 Eureka 集群

各位可否想过这样的一个问题?虽然Eureka能够实现服务注册和发现,但是如果Eureka服务器崩溃了,岂不是所有需要用到服务发现的微服务就GG了?

为了避免,这种问题,我们也可以像上面那样,搭建Eureka集群,存在多个Eureka服务器,这样就算挂掉其中一个,其他的也还在正常运行,就不会使得服务注册与发现不可用。当然,要是物理黑客直接炸了整个机房,那还是算了吧。
在这里插入图片描述
我们来看看如何搭建Eureka集群,这里由于机器配置不高,就搭建两个Eureka服务器组成集群。

①服务端创建两个配置文件

application-1.yml

server:
  port: 8801
spring:
  application:
    name: eurekaserver  # 所有eureak的这个值要设置为同一个
eureka:
  instance:
    # 由于不支持多个localhost的Eureka服务器,但是又只有本地测试环境,所以就只能自定义主机名称了
    # 如果报错主机名称改为 eureka01
    hostname: eureka01
  client:
    # false表示自己就是注册中心
    fetch-registry: false
    service-url:
      # 注意这里填写其他 Eureka 服务器的地址,不用写自己的
      defaultZone: http://eureka02:8802/eureka

application-2.yml

server:
  port: 8802
spring:
  application:
    name: eurekaserver
eureka:
  instance:
    hostname: eureka02
  client:
    fetch-registry: false
    service-url:
      defaultZone: http://eureka01:8801/eureka

②修改本地 hosts

这里由于我们修改成自定义的地址,需要在 hosts 文件中将其解析到 127.0.0.1 才能回到 localhost。
Linux 下文件路径为 /etc/hosts
Windows 下文件路径为 C:\Windows\system32\drivers\etc\hosts,需要获取权限比较麻烦,可以利用火绒安全软件直接修改
在这里插入图片描述
Windows系统修改hosts后需要刷新DNS缓存使之生效,在cmd命令行中执行命令:ipconfig/flushdns

回到目录…

③开启两个 EurekaServer 实例

对创建的两个配置文件分别添加启动配置,直接使用-Dspring.profiles.active指定启用的配置文件即可:
在这里插入图片描述

接着启动这两个注册中心,这两个 Eureka 管理页面都可以被访问,我们访问其中一个:
在这里插入图片描述
可以看到下方replicas中已经包含了另一个Eureka服务器的地址,并且是可用状态

回到目录…

④修改Eureka客户端的配置文件

eureka:
  client:
    service-url:
      # 将两个Eureka的地址都加入,这样就算有一个Eureka挂掉,也能完成注册
      defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka

可以看到,服务全部成功注册,并且两个 Eureka 服务端都显示为已注册:
在这里插入图片描述

接着我们模拟一下,将其中一个Eureka服务器关闭掉,可以看到它会直接变成不可用状态:
在这里插入图片描述
当然,如果这个时候我们重启刚刚关闭的Eureka服务器,会自动同步其他Eureka服务器的数据。

回到目录…


总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,学习了它的组件Eureka注册中心,包括服务的注册与发现,高可用(Eureka集群的搭建)。之后的学习内容将持续更新!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉废钢堆提取问题

计算机视觉废钢堆提取问题 背景介绍 在钢铁炼制中&#xff0c;废钢是非常重要的原料&#xff0c;不同等级废钢对于钢成品影响很大&#xff0c;因此需要对废钢进行正确分类。某废钢料场中&#xff0c;卸料区域布置了多个摄像头&#xff0c;用于拍摄卸料场中废钢堆&#xff0c;…

python 连接数据库

文章目录同步操作同步连Mysql同步连redis同步连mongodb异步操作异步连mysql异步连redis异步连mongodb同步操作 同步连Mysql python 连接mysql可以使用pymysql、mysqlclient等。 安装&#xff1a; # win pip install pymysql 连接mysql: # __author__ "laufing"…

Java各种锁

目录 一、读写锁(ReentrantReadWriteLock) 二、非公平锁(synchronized/ReentrantLock) 三、可重入锁/递归锁(synchronized/ReentrantLock) 四、自旋锁(spinlock) 五、乐观锁/悲观锁 六、死锁 1、死锁代码 2、死锁的检测(jps -l 与 jstack 进程号) 本文通过学习&#xff…

Spring——Spring介绍和IOC相关概念

Spring是以Spring Framework为核心&#xff0c;其余的例如Spring MVC&#xff0c; Spring Cloud&#xff0c;Spring Data&#xff0c;Spring Security SpringBoot的基础都是Spring Framework。 Spring Boot可以在简化开发的基础上加速开发。 Spring Cloud分布式开发 Spring有…

SAP MM学习笔记6-SAP要怎么学

SAP还是很复杂的&#xff0c;学习之前&#xff0c;了解学习技巧很重要。 根据前辈经验&#xff0c;SAP学习技巧大致总结为如下三个&#xff0c;供大家参考。 1&#xff0c;忘了自己技术者的身份&#xff0c;控制追求技术细节的冲动 软件行业经常听到一句话&#xff0c;什么都…

Python进阶-----面对对象6.0(绑定方法[类方法、静态方法]与内置方法)

目录 前言&#xff1a; 1.绑定方法 &#xff08;1&#xff09;实例方法 &#xff08;2&#xff09;类方法 &#xff08;3&#xff09;静态方法 2.类型检测 &#xff08;1&#xff09;issubclass() 函数 &#xff08;2&#xff09;isinstance() 函数 3.内置方法&#xf…

【Verilog】——赋值语句、结构语句、块语句

目录 1.常用语句 2.块语句 1.顺序块 2.并行块 ​ 3.结构语句 1.always 2.initial 4.赋值语句 1.非阻塞赋值 2.阻塞赋值 3.非阻塞赋值和阻塞赋值的区别 4.深入理解阻塞赋值和非阻塞赋值 声明信号的时候统一大数在高位&#xff0c;小数在低位 比如&#xff1a;reg [3:…

多线程篇之8锁问题、字节码看Synchronized

八锁问题 ①. 标准访问有ab两个线程,请问先打印邮件还是短信 ②. sendEmail方法暂停3秒钟,请问先打印邮件还是短信 ③. 新增一个普通的hello方法,请问先打印邮件还是hello ④. 有两部手机,请问先打印邮件还是短信 ⑤. 两个静态同步方法,同1部手机,请问先打印邮件还是短信 ⑥. …

【数据库系列】MQSQL历史数据分区

互联网行业企业都倾向于mysql数据库&#xff0c;虽说mysql单表能支持亿级别的数据量&#xff0c;加上索引优化下查询速度&#xff0c;勉强能使用&#xff0c;但是对于追求性能和效率的互联网企业&#xff0c;这是远远不够的。Mysql数据库单表数据量到达500万左右&#xff0c;达…

第四讲:如何将本地代码与服务器代码保持实时同步

一、前言 在我们进行 Ambari 二次开发时,通常会先在服务器上部署一套可以使用的 Ambari 环境。 二次开发,就肯定是要改动代码的,我们不能老是在服务器上用vim编辑文件,那样效率太低,始终不是长久之计。 所以我们需要在本地打开我们的Ambari源码项目,比如用idea工具,可…

【电子学会】2022年12月图形化二级 -- 绘制风车

绘制风车 1. 准备工作 &#xff08;1&#xff09;隐藏默认的小猫角色&#xff1b; &#xff08;2&#xff09;选择背景&#xff1a;“Xy-grid”。 2. 功能实现 &#xff08;1&#xff09;小猫角色的初始位置为(x:0,y:0)&#xff1b; &#xff08;2&#xff09;线条粗细为…

实验4 设计模式实验3

实验内容: 1. 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通 过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全 部拷贝到移动存储介质(例如MMC 卡或SD 卡)中。在实现过程中需要与多个 已有的类进行交互,例如通讯录管理类、短信…

黑马Spring学习笔记(四)——面向切面编程AOP

目录 一、AOP简介 二、AOP核心概念 三、AOP入门案例 四、AOP配置管理 4.1 AOP切入点表达式 4.1.1 语法格式 4.2.2 通配符 4.2.3 书写技巧 4.2 AOP通知类型 4.2.1 前置、后置、返回后、抛出异常后获取参数 4.2.2 环绕通知 一、AOP简介 AOP(Aspect Oriented Pro…

【IoT】创业成功不可或缺的两个因素:能力和趋势

今天就来谈谈能力和趋势究竟哪个更重要的问题。 在谈成功的十大要素时&#xff0c;我曾经讲到&#xff1a; 一命、二运、三风水&#xff0c;这三个要素几乎不涉及任何个人的努力。 而趋势跟这三个要素又是息息相关的&#xff0c;这也类似雷军所说的飞猪理论。 只要风足够大&…

Centos7(阿里云)_安装Mysql8.0

1.安装MySQL 新人可以试用一个月的阿里云&#xff0c;centos7的 一开始可能确实会自带mariadb&#xff0c;所以可以在网上随便找个教程开始尝试安装MySQL&#xff0c;当然大概率出错&#xff0c;然后此时你的rpm下面已经有了一个版本的mysql安装包。 以我为例&#xff0c;随便…

Windows下jdk安装与卸载-超详细的图文教程

jdk安装 下载jdk 由于现在主流就是jdk1.8&#xff0c;所以这里就下载jdk1.8进行演示。官方下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows。 官方下载需要注册oracle账号&#xff0c;国内下载有可能速度慢&#xff0c;若不想注册账…

【Linux】P5 实用快捷键 以及 下载安装指令

Linux实用快捷键与下载安装实用快捷键强制停止退出账户 / 环境查看历史命令光标移动快捷键清屏下载安装命令CentOS - yumUbunto - apt实用快捷键 强制停止 CTRL C当程序陷入死循环或者执行错误&#xff0c;可通过该命令强制停止 当程序输入很长但是发现错误&#xff0c;不想…

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG&#xff0c;多种格式输出&#xff0c;超精准识别率。 1. 产品功能 通用的识别接口&#xff0c; 支持标准 PDF 文件解析&#xff1b;多种格式输出&#xff0c;支持 TEXT HTML XML TAG&#xff1b;HTML 包含完美排…

蒙特卡洛树搜索(MTCS)

一、目标 一种启发式的搜索算法&#xff0c;在搜索空间巨大的场景下比较有效 算法完成后得到一棵树&#xff0c;这棵树可以实现&#xff1a;给定一个游戏状态&#xff0c;直接选择最佳的下一步 二、算法四阶段 1、选择&#xff08;Selection&#xff09; 父节点选择UCB值最…

【ONE·C || 文件操作】

总言 C语言&#xff1a;文件操作。    文章目录总言1、文件是什么&#xff1f;为什么需要文件&#xff1f;1.1、为什么需要文件&#xff1f;1.2、文件是什么&#xff1f;2、文件的打开与关闭2.1、文件指针2.2、文件打开和关闭&#xff1a;fopen、fclose2.3、文件使用方式3、文…