SpringCloud之一注册中心(Eureka)

news2024/9/22 9:44:04

一、Eureka概述

Eureka是Netflix公司开源的一个服务注册与发现的中间组件。
在微服务架构系统之中,我们经常提三个角色:注册中心 (Register)、服务提供者(Provider)、服务消费者(Consumer)。
1.注册中心:服务提供者可以将服务发布到注册中心,服务消费者从注册中心获取可以进行访问的服务列表;注册中心支持集群部署,集群中的机器,数据会进行同步复制更新(replicate),保证注册中心数据最终一致性。
2.服务提供者: 即下游相关的平台或者是提供服务的应用,对于自己的应用服务(Application Service),做下面的操作:

  1.服务注册:将自己的服务接口方法以及服务发布的地址等,注册到Eureka Server注册中心中;
  2.服务更新:对已经发布到注册中心的服务通知进行更新操作;
  3.服务删除:通过相关操作(如停止应用操作)通知注册中心,将应用服务从注册中心删除(移除);
  4.服务发布者通过Eureka这个注册中心,每30秒发送一次心跳更新注册中心的数据;

服务消费者: 在应用启动的时候,根据自己订阅的服务,会去注册中心(Eureka Server)拉取所有的服务清单列表,会缓存到应用本地缓存。

二、创建注册中心

下面就使用spring-cloud-starter-netflix-eureka来创建一个服务注册中心
1.创建一个spring boot项目,添加以下依赖:
主要是引入下面这个:

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

有的项目引入的是:

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

pom.xml原始内容:

    <properties>
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <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>

注:Spring boot版本要和spring-cloud版本相对应
注:spring-cloud-starter-eureka-server 是在1.5版本中使用的,在2.0版本中废弃,建议使用spring-cloud-starter-netflix-eureka-server

2.配置application.properties

#eureka服务端口号
server.port=8000
#eureka的服务名称
spring.application.name=eureka-server 
#表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false。
eureka.client.registerWithEureka=false
#表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
eureka.client.fetchRegistry=false
#eureka的地址信息
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/:${server.port}/eureka/

3.在启动类上添加@EnableEurekaServer注解,就可以将该项目作为SpringCloud中的注册中心了。

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudDemoApplication.class, args);
    }

}

4.启动注册中心
启动项目,这里设置了端口号为8000(根据自己的端口号来访问),访问http://localhost:8000,看到下面的页面,说明注册中心搭建完成:
在这里插入图片描述
Eureka注册中心UI界面参数:

Environment: 环境,默认为test,该参数在实际使用过程中,可以不用更改
Data center: 数据中心,使用的是默认的是 “default”
Current time:当前的系统时间
Uptime:已经运行了多少时间
Lease expiration enabled:是否启用租约过期 ,自我保护机制关闭时,该值默认是true, 自我保护机制开启之后为false。
Renews threshold: 每分钟最少续约数,Eureka Server 期望每分钟收到客户端实例续约的总数。
Renews (last min): 最后一分钟的续约数量(不含当前,1分钟更新一次),Eureka Server 最后 1 分钟收到客户端实例续约的总数。

DS Replicas(注册到Eureka的实例信息)
Instances currently registered with Eureka:表示当前在Eureka注册的实例,因为现在还没有实例注册到eureka,所以显示为No instances available(没有可用的实例)

Instances currently registered with Eureka下的选项:

  • Application:实例名称,即spring.application.name或者eureka.instance.appname配置的名称,同时配置时,eureka.instance.appname优先级更高。
    如果没有配置eureka.instance.appname,则使用spring.application.name的值,如果连spring.application.name都没有配置,则取unknown。
  • AMIs:n/a (1),字符串n/a+实例的数量
  • Availability Zones:实例的数量
  • Status:实例的状态加id,up为正常。id为eureka.instance.instance-id设置的值,如果没有设置eureka.instance.instance-id,那么显示的值将是一个由Eureka自动生成的编号

实例的状态分为UP、DOWN、STARTING、OUT_OF_SERVICE、UNKNOWN.

  • UP: 服务正常运行,特殊情况当进入自我保护模式,所有的服务依然是UP状态,所以需要做好熔断重试等容错机制应对灾难性网络出错情况
  • OUT_OF_SERVICE : 不再提供服务,其他的Eureka Client将调用不到该服务,一般有人为的调用接口设置的,如:强制下线。
  • UNKNOWN: 未知状态
  • STARTING : 表示服务正在启动中
  • DOWN: 表示服务已经宕机,无法继续提供服务
    自我保护模式
    当微服务客户端启动后,会把自身信息注册到Eureka注册中心,以供其他微服务进行调用。一般情况下,当某个服务不可用时(一段时间内没有检测到心跳或者连接超时等),那么Eureka注册中心就会将该服务从可用服务列表中剔除,但是在微服务架构中,因为服务数量众多,可能存在跨机房或者跨区域的情况,因此当某个服务心跳探测失败并不能完全说明其无法正常提供服务而将其剔除,并且服务一旦剔除后,再重新注册将会重新进行负载均衡等等一系列的操作,考虑到性能问题,eureka会将不可用的服务暂时断开,并期望能够在接下来一段时间内接收到心跳信号,而不是直接剔除,同时,新来的请求将不会分发给暂停服务的实例,这就是eureka的保护机制,它保护了因网络等问题造成的短暂的服务不可用的实例,避免频繁注册服务对整个系统造成影响。
    我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,所以单机状态下不建议开启。们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。

5.eureka-server启动后,开始服务注册(将user-service服务注册到EurekaServer)
(1)在user-service(服务提供者)项目引入spring-cloud-starter-netflix-eureka-client依赖

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

(2)在原有application.properties添加如下配置:

# eureka服务的地址信息
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 该配置非必须,状态页面的URL,即在eureka UI界面点击某个服务的状态跳转的链接,相对路径,默认使用 HTTP 访问,如需使用 HTTPS则要使用绝对路径配置,缺省:/info,下面配置的是user-service项目swagger-ui页面
eureka.instance.status-page-url-path = http://localhost:${server.port}/userservice/swagger-ui.html

启动user-service项目,可以在eureka UI界面看到服务已经注册
6.将order-service注册到注册中心
order-service(服务消费者)注册到注册中心的方法同上。
服务消费者通常使用Feign调用服务提供者提供的服务,使用Feign的步骤如下:
(1)引入依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)在order-service的启动类添加注解开启Feign功能:

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

(3)编写Feign客户端:

/**
 * feign实现远程调用声明的bean
 */
@FeignClient("user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

主要是基于SpringMVC的注解来声明远程调用信息,比如:

服务名称:user-service
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
(4)则OrderService或OrderServiceImpl中方法改写为:

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        //1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        //3.封装user到Order
        order.setUser(user);
        //4.返回
        return order;
    }
}

@FeignClient注解参数说明

  • name/value:指定FeignClient的名称(调用的服务的名称),如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • contextId:用于指定为当前 Feign 客户端创建的 ApplicationContext 的唯一标识。当一个微服务中存在多个FeignClient接口调用同一个服务提供者时,就需要使用到contextId属性。这种情况常常出现在一个微服务需要调用另一个微服务提供的多个不同接口时。通过给每个FeignClient指定唯一的contextId,可以确保它们在运行时能够正确地识别和区分彼此,避免出现冲突和混淆。
  • url: url一般用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • path: 定义当前FeignClient的统一前缀,定义之后FeignClien的@RequestMapping中就不用写前缀了

上面的UserClient也可改为

/**
 * feign实现远程调用声明的bean
 */
@FeignClient(name ="user-service",path="/user",contextId = "userService1")
public interface UserClient {
    @GetMapping("/{id}")
    User findById(@PathVariable("id") Long id);

此时通过order-service调用user-service就实现了远程调用,因为Feifn内部自带Ribbon,因此也同时实现了负载均衡。

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

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

相关文章

<数据集>考场行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2192张 标注数量(xml文件个数)&#xff1a;2192 标注数量(txt文件个数)&#xff1a;2192 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cheating, good] 序号类别名称图片数框数1cheating128214412good1067…

边界dp注意重叠边界

前言&#xff1a;这个题目感觉不是简单的背包问题&#xff0c;因为我们这个是有限制的 想到了之前写的边界的dp&#xff0c;本来想定义二维dp&#xff0c;发现没必要二维dp&#xff0c;一维dp就够了&#xff0c;dp[i] 表示填充 1 - i 需要的最少的数量&#xff0c;符合子问题的…

Redis内存淘汰

Redis内存淘汰 Redis可以存储多少数据 maxmemory配置&#xff0c;默认是注释掉的。 #maxmemory <bytes>我们可以主动配置maxmemory&#xff0c;maxmemory支持各种单位&#xff0c;默认是字节 maxmemory 1024 maxmemory 1024KB maxmemory 1024MB maxmemory 1024GB当Re…

三大低速总线之一:UART

三大低速总线之一&#xff1a;UART 文章目录 三大低速总线之一&#xff1a;UART前言一、UART协议二、设计1.整体说明2.rx波形设计 三 程序实现 前言 三大低速总线&#xff1a;UART、IIC、SPI&#xff0c;其中IIC和SPI是同步通讯&#xff0c;UART是异步的。 优点&#xff1a; …

CSS\JS实现页面背景气泡logo上浮效果

效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Bubble Logo…

Linux_at任务调度

目录 at定时任务 基本介绍 at命令格式 at命令选项 at时间定义 at任务调度实例 at定时任务 基本介绍 at是一次性的定时计划任务&#xff0c;默认atd守护进程每60秒检测作业队列&#xff0c;检查作业运行时间&#xff0c;时间与当前时间匹配则执行。 ps-ef指令检测当前在运…

如何使用ssm实现农家乐信息平台的设计与实现+vue

TOC ssm066农家乐信息平台的设计与实现vue 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各…

话费api充值接口对接

全网话费折扣API接口的对接合作流程确实涉及几个关键步骤&#xff0c;确保了应用程序能够顺利集成话费充值服务。以下是该流程的概述以及一些补充的考虑因素&#xff1a; 1.申请API接口&#xff1a; 开发者联系第三方话费充值服务提供商&#xff0c;提交API接口使用申请。获得…

基于FreeRTOS的STM32多功能手表

前言 项目背景 项目演示 使用到的硬件 项目原理图 目前版本实现的功能 设计到的freertos知识 实现思路 代码讲解 初始化GPIO引脚、配置时钟 蜂鸣器初始化以及软件定时器创建 系统默认创建的defaultTaskHandle 创建七个Task&#xff0c;代表七个功能 ShowTimeTask …

代码随想录算法训练营 | 动态规划 part08

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最…

轻松入门大模型:150页精炼指南,简化你的学习之路

如果问个问题&#xff1a;有哪些产品曾经创造了伟大的奇迹&#xff1f;ChatGPT 应该会当之无愧入选。仅仅发布 5 天&#xff0c;ChatGPT 就吸引了 100 万用户——当然&#xff0c;数据不是关键&#xff0c;关键是其背后的技术开启了新的 AI 狂潮&#xff0c;成为技术变革的点火…

ctfshow-web入门-sql注入(web231-web236)update 注入

目录 1、web231 2、web232 3、web233 4、web234 5、web235 6、web236 1、web231 拼接的是 update 语句 //分页查询$sql "update ctfshow_user set pass {$password} where username {$username};"; password 和 username 可控&#xff0c;注入地方还是在 …

laravel发送邮件的使用方法?有哪些技巧?

laravel发送邮件怎么实现&#xff1f;如何使用Laravel发送邮件&#xff1f; Laravel&#xff0c;作为一个流行的PHP框架&#xff0c;提供了强大且灵活的邮件发送功能&#xff0c;使得开发者可以轻松地集成邮件服务到他们的应用中。AokSend将详细介绍如何在Laravel中使用larave…

conda虚拟环境中安装cuda和cudnn

目录 一、cuda安装步骤 1&#xff09;cuda的安装 1、查看conda支持的cuda版本 2、下载cuda并安装cuda 2&#xff09;cudnn的安装 1、查看cuda对应的cudnn版本 2、下载cudnn并安装 二、torch的安装和tensorflow的安装 1&#xff09;安装tensorflow 1、确定安装版本并安…

Java入门:06.Java中的方法--进阶02.03

2 可变参数 方法调用时&#xff0c; 传递的实参数量&#xff0c;是由被调用方法的参数列表数列决定的。 一般来讲&#xff0c;传递的实参数量必须与形参变量数量相同&#xff0c;但是也有一种特殊的参数&#xff0c;允许调用时传递的实参数量是可变&#xff0c;这种参数就称为…

《黑神话·悟空》游戏开发教程来了,全部开源。。。

黑神话悟空游戏&#xff0c;官网说明使用UE5引擎开发. 这篇文章发一个UE5游戏开发的系统教程。 1 开发悟空游戏的UE5 UE5&#xff0c;即 Unreal Engine 5&#xff0c;是由 Epic Games 开发的一款高度先进的游戏引擎。 UE5 是 Unreal Engine 系列的最新版本&#xff0c;它提供…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组&#xff1a;[ ]开始和结束对象&#x…

应用商场的搭建

前言&#xff1a; 使用mysql做主从设置&#xff0c;redis数据库做热门访问数据库。mycat读写分离&#xff0c;zookeeperkafka做数据收集&#xff0c;使用三台虚拟机 关掉防火墙和selinux,做时间同步 192.168.121.11 node1 mycat.example.com 192.168.121.21 node2 …

提高LabVIEW电机控制速度

在LabVIEW中执行绝对位移命令时&#xff0c;其运行时间主要与以下电机参数有关&#xff1a; 电机加速度和减速度&#xff1a; 加速度和减速度参数决定了电机从静止到达到目标速度&#xff0c;以及从高速到停止的时间。这些参数直接影响电机响应的迅速程度。如果加速度和减速度设…

如何使用ssm实现基于bs模式的医院在线挂号预约系统的设计与实现

TOC ssm072基于bs模式的医院在线挂号预约系统的设计与实现jsp 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人…