Spring cloud Eureka服务注册中心实战

news2025/3/9 22:30:25

Spring cloud Eureka服务注册中心

    • 一、注册中心
    • 二、存在意义
    • 三、角色
    • 四、运行流程
    • 五、入门案例
      • 1、创建Spring Cloud 工程
      • 2、创建 Eureka 服务
          • pom.xml
      • 3、配置 application.yml
      • 4、服务间调用
        • 方式一:RestTemplate + DiscoveryClient
        • 方式二:RestTemplate + LoadBalancerClient
        • 方式三:RestTemplate + @LoadBalanced
    • 六、Eureka 原理
    • 七、CAP原则
        • 取舍策略:
    • 八、自我保护
        • 1、Eureka收不到服务的情况:
        • 2、自我保护模式
        • 3、关闭自我保护
    • 九、优雅停服
        • 1、依赖
        • 2、配置
        • 4、停服
    • 十、认证授权
        • 1、依赖
        • 2、配置
          • 2.1 Eureka配置
          • 2.2 服务配置
          • 2.3 过滤CSRF(跨域请求伪造)
            • 方式一:使 CSRF 忽略 /eureka 的所有请求
            • 方式二: 保持密码验证的同时禁用CRSF防御机制

一、注册中心

​ 注册中心就是微服务架构中的通讯录,它记录了服务和服务地址的映射关系,在分布式架构中,服务会注册到这里,服务通过注册中心调用其他服务。

二、存在意义

​ 注册中心主要进行服务管理和服务依赖关系管理

  • 服务注册后及时发现
  • 负载均衡
  • 服务宕机后即使下线
  • 水平拓展服务
  • 服务发现后处理路由
  • 服务异常后的降级处理

三、角色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z06hxC1n-1670555809009)(img/Eureka注册中心角色.jpeg)]

  • Eureka Server :通过 Register、Get、Renew 等接口提供服务的注册和发现
  • Server Provider(Application Service): 服务提供方,把自身的服务实例注册到 Eureka Server 中
  • Server Consumer(Application Service):服务调用方,通过 Eureka Server 获取服务列表,消费服务

四、运行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDKFEadd-1670555809010)(img/Eureka注册中心运转流程.jpeg)]

0:实例化服务

1:将服务注册到注册中心

2:注册中心收录服务

3:从服务中心获取服务列表

4:基于负载均衡从地址列表中选择服务地址进行服务调用

5:定期发送心跳

6:检查没有定期发送心跳的服务,并在一定时间内剔除服务地址列表

五、入门案例

1、创建Spring Cloud 工程

2、创建 Eureka 服务

pom.xml
<?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>
   <parent>
      <groupId>com.byx</groupId>
      <artifactId>scaffold-parent</artifactId>
      <version>0.0.1</version>
      <relativePath>../parent</relativePath>
   </parent>
   <artifactId>scaffold-eureka</artifactId>
   <packaging>${packaging.type}</packaging>
    
   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      <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>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

application

package com.byx.scaffold.rcentre;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class ServiceRegistrationAndDiscoveryApplication {

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

3、配置 application.yml

spring:
  application:
    name: eureka                 # 应用名称
server:
  port: 8761                     # 端口
eureka:
  instance:
    hostname: localhost          # 主机名
    prefer-ip-address: true
  client:
    register-with-eureka: false  # 是否将自己注册到注册中心,默认 true ,集群时要为 true,相互注册
    fetch-registry: false        # 是否从注册中线获取注册信息,默认为 true
    service-url:                 # 注册中心对外暴露的注册地址
      defaultZone: http://toolKit:dily1314@localhost:8761/eureka/

4、服务间调用

方式一:RestTemplate + DiscoveryClient

启动类或配置中增加 RestTemplate Bean

//@EnableEurekaClient 如果配置了注册中心,则会默认开启,无需使用该注解
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    };

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

}

Service 中调用服务

@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;   // 启动类 或者 Config 中 要注入bean
    @Autowired
    private DiscoveryClient discoveryClient;


    public Order getList() {
        return new Order(1, "202020202020", selectProductListWithBalancer("provider", "/product/list"));
    }


    /**
     * 跨服务调用
     * 无负载均衡
     *
     * @param service 服务名
     * @param api     接口
     * @return 结果
     */
    private List<?> selectProductList(String service, String api) {
        StringBuffer sb = new StringBuffer();

        // 获取服务方法
        List<String> services = discoveryClient.getServices();
        if (CollectionUtils.isEmpty(services))
            return null;

        // 根据服务名获取服务
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances(service);
        if (CollectionUtils.isEmpty(serviceInstances))
            return null;
        ServiceInstance si = serviceInstances.get(0);
        sb.append("http://" + si.getHost() + ":" + si.getPort() + api);

        // 返回数据
        ResponseEntity<List<?>> response = restTemplate.exchange(
                sb.toString(),
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<?>>() {
                }
        );
        return response.getBody();
    }
}

方式二:RestTemplate + LoadBalancerClient

启动类或配置中增加 RestTemplate Bean

//@EnableEurekaClient 如果配置了注册中心,则会默认开启,无需使用该注解
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    };

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

Service 中调用服务

@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;   // 启动类 或者 Config 中 要注入bean
    @Autowired
    private LoadBalancerClient loadBalancerClient;


    public Order getList() {
        return new Order(1, "202020202020", selectProductListWithBalancer("provider", "/product/list"));
    }
    /**
     * 跨服务调用
     * 有负载均衡
     *
     * @param service 服务名
     * @param api     接口
     * @return 结果
     */
    private List<?> selectProductListWithBalancer(String service, String api) {
        StringBuffer sb = new StringBuffer();

        // 根据服务名 通过负载均衡 获取服务
        ServiceInstance si = loadBalancerClient.choose(service);
        if (si == null)
            return null;
        sb.append("http://" + si.getHost() + ":" + si.getPort() + api);

        // 返回数据
        ResponseEntity<List<?>> response = restTemplate.exchange(
                sb.toString(),
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<?>>() {
                }
        );
        return response.getBody();
    }
}

方式三:RestTemplate + @LoadBalanced

启动类或配置中增加 RestTemplate Bean 加入注解 @LoadBalanced

//@EnableEurekaClient 如果配置了注册中心,则会默认开启,无需使用该注解
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    };

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

}	

六、Eureka 原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWYIZRcB-1670555809010)(img\Eureka原理图.jpeg)]

七、CAP原则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pj6Jhtj7-1670555809011)(img\CAP原则.jpeg)]

C: 一致性

A: 高可用

P: 分区容错

​ 金融: CP(大型) 、AP(互联网)

取舍策略:

  • CA: 如果不要求 P(不允许分区),则 C(强一致性)和 A(高可用性)是可以保证的.放弃P意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计初衷的。

  • CP:如果不要求 A(不要求高可用),则 C 相当于每个请求都需要在服务之间保持强一致性,而 P (分区容错)会导致同步时间无线延长(也就是等待数据同步才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致后再让用户访问系统。设计成 CP 的系统其实不少,最典型的就是分布式数据库,如:redis,对于分布式数据库来说,数据的一致性时最基本的要求。

  • AP:要求高可用并允许分区容错,则放弃一致性,一旦分区发生,节点之间可能失去联系,为了高可用,每个节点都只能使用本地数据提供服务,而这会导致全局数据不一致,典型应用就是抢购商品的场景,可能浏览的页面还显示有商品,但是下单的时候发现商品已经售完,这其实就是在A(高可用)方面保证可以正常服务,在数据一直性方面做了牺牲。

八、自我保护

一般情况,服务在 Eureka 注册后 每30s 发送一次心跳,Eureka 通过心跳包来判断服务是否健康,同时会定期删除超过 90s 没有发送心跳的服务。

在服务不可以时,不会立即释放服务信息,而是保存一段时间后再删除。

1、Eureka收不到服务的情况:

  • 微服务自身原因
  • 微服务与 Eureka 之间的网络故障

2、自我保护模式

在运行期间,Eureka 会统计心跳失败比例,如果 15 分钟内的低于 85%,Eureka 会将这些实例保护起来,让这些实例不会过期,同时提醒一个警告

3、关闭自我保护

eureka:
  server:
    enable-self-preservation: false # true 开启自我保护, false 关闭自我保护
    eviction-interval-timer-in-ms: 60000 # 清除隔离(单位:毫秒) 默认 60 * 1000

九、优雅停服

配置优雅停服后,无需配置关闭自我保护,这里用actuator实现

1、依赖

<!--        优雅停服-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置

# 度量指标监控与健康检查
management:
  endpoints:
    web:
      exposure:
        include: shutdown   # 开启 shutdown 端点访问
  endpoint:
    shutdown:
      enabled: true # 开启 shutdown 实现优雅停服

4、停服

向需要停服的服务地址发送 shutdown 请求

服务地址:172.10.16:8080

停服请求:Post方式 172.10.16:8080/actuator/shutdown

十、认证授权

1、依赖

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

2、配置

2.1 Eureka配置
spring:
  # 安全认证
  security:
    user:
      name: root       # 用户名
      password: 123456 # 密码
2.2 服务配置
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
    # 前面加用户名:密码
      defaultZone: http://root:123456@localhost:8761/eureka/
2.3 过滤CSRF(跨域请求伪造)
方式一:使 CSRF 忽略 /eureka 的所有请求
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        supper.configure(http)  // 访问eureka 的控制台和/actuator 是可以做安全控制
        http.csrf().ignoringAntMatchers("/eureka/**"); //忽略eureka/**的所有请求
    }
}
方式二: 保持密码验证的同时禁用CRSF防御机制
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http // 直接disable 会把安全验证也禁用,
            .csrf().disable().authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic();
    }
}

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

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

相关文章

【Golang】关于slice调用append函数后分配新数组的问题(slice的底层实现)

问题描述 今天在写代码的时候遇到一个很奇怪的现象&#xff0c;先看下面两段代码 func push(a []int, v int) {a[1] 2a append(a, v) } func main() {a : []int{0, 1, 2}push(a, 3)fmt.Println(a) }结果&#xff1a;[0 2 2] func push(a []int, v int) {a append(a, v)a[…

如何看股票l2接口的最佳买卖价位委托明细?

股票l2接口的买卖价位委托明细即买一卖一位置的挂挡情况&#xff0c;挂单可以让用户及时了解交易队列&#xff0c;从而了解完整的开盘情况。用户可以通过观察挂单来判断档位是否有主力资金介入&#xff0c;从而判断开盘时的主力动态&#xff0c;进而把握投资机会。 1.股票l2接…

数据库之insert的使用讲解

1单独插入一条数据&#xff1a; INSERT INTO t1(col1,col2) VALUE(v01,v02); 2插入多条数据 INSERT INTO t1(col1,col2) VALUE(v01,v02)&#xff0c;(v03,v04)&#xff0c;(v05,v06)...; 3插入查询的数据&#xff08;查询N条数据插入N条数据&#xff0c;广泛应用&#xf…

微信小程序|使用小程序制作一个足球拼图小游戏

世界杯的意义永远不止是冠军&#xff0c;它是每个精彩的瞬间&#xff0c;是呐喊&#xff0c;是青春。此文用小程序制作一个足球的拼图小游戏&#xff0c;一起为世界杯疯狂吧&#xff01; 开发步骤一、工具安装二、功能实现1 . 提示图展示2 . 绘制画布内容3 . 打乱方块顺序4 . 移…

模型和视图框架(概念)

MVC&#xff08;Model-View-Controller&#xff09;是一种设计模式。 Model(模型)是应用对象&#xff0c;用来显示模型View (视图)是用户界面&#xff0c;用来显示数据Controller(控制)定义用户界面对用户输出的反映方式模型/视图类可以分为上述三组&#xff1a;模型、视图和委…

CPU100%,怎么快速定位?

一台机器&#xff0c;CPU100%&#xff0c;如何找到相关服务&#xff0c;如何定位问题代码&#xff0c;今天简单分享下思路。假设&#xff0c;服务器上部署了若干Java站点服务&#xff0c;以及若干Java微服务&#xff0c;突然收到运维的CPU异常告警。如何定位是哪个服务进程导致…

是时候给钉钉和腾讯会议算算账了

杨净 萧箫 发自 凹非寺量子位 | 公众号 QbitAI这几天&#xff0c;工作和上课等事情开始有回归线下的迹象&#xff0c;腾讯会议、钉钉似乎也可以松口气了。毕竟云会议的这两大APP&#xff0c;前段时间一直在被网友找平替。一来&#xff0c;它们要收费了&#xff1b;二来&#xf…

【有营养的算法笔记】整数二分和浮点二分的全面分析

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 文章目录一、铺垫二、整数二分模板分析三、模板应用 —— 数的范围四、浮点二分模板分析…

简单引入JQuery

简单引入JQuery前言环境配置下载官网的JQuery到本机引入JQuery到Html文件中前言 作为一个兢兢业业的后端程序猿&#xff0c;这里为了方便自己搭建的项目更加合理&#xff0c;使自己写的接口对前端也更加友好。所以我决定&#xff0c;从头开始学习下前端知识。 环境配置 下载…

[附源码]JAVA毕业设计翔隆生鲜超市进货管理系统(系统+LW)

[附源码]JAVA毕业设计翔隆生鲜超市进货管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

聚宽量化入门量化策略是什么?

聚宽量化入门量化策略JoinQuant聚宽API文档&#xff1a;MetaTradeAPI (metatradeapi) - Gitee.com 获取要操作的股票或指数成分股 1、# 导入函数库&#xff1b; 2、import jqdata&#xff1b; 3、# 初始化函数&#xff0c;设定基准 def initialize(context)&#xff1a; …

每日一题 —— LC. 1687 从仓库到码头运输箱子(难度很大,但值得好好消化的一道题)

1687. 从仓库到码头运输箱子 你有一辆货运卡车&#xff0c;你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你一个箱子数组 boxes和三个整数 portsCount, maxBoxes 和 maxWeight &#xff0c;其中 boxes[i][portsi,we…

web前端期末大作业:基于HTML+CSS+JavaScript制作鲜花礼品在线购物网站设计(19页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

代码随想录刷题Day59 | 503. 下一个更大元素 II | 42. 接雨水

代码随想录刷题Day59 | 503. 下一个更大元素 II | 42. 接雨水 503. 下一个更大元素 II 题目&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的…

云与开源,共植数字世界的根

摘要&#xff1a;本文整理自阿里巴巴集团副总裁、阿里巴巴开源技术委员会负责人贾扬清&#xff0c;在 Flink Forward Asia 2022 主会场的开场致辞。Tips&#xff1a;点击「阅读原文」获取演讲 ppt&#xff5e;云和开源&#xff0c;共生、共长、共植数字世界的根。从在云上使用开…

SAP PS 第17节 项目产成品产出

SAP PS 第17节 项目产成品产出及差异处理1 模拟场景说明1.1 拖拽负库存1.2 发料原材料及报工1.3 执行副产品入库migo发预留1.4 CNS0交货1.5 后面开票产生收入按照项目结算即可项目上有一类比较另类的玩法&#xff0c;就是舍弃PP&#xff0c;依靠网络活动的负库存&#xff0c;实…

Web前端大作业—个人网页(html+css+javascript)我的家乡新密 (15页)含课程设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

2030年销售额突破200亿美元!瑞萨电子揭秘智能汽车版图

汽车正在成为继手机之后的下一个智能终端&#xff0c;并且已经成为全球各大芯片头部厂商的必争之地。 过去&#xff0c;汽车芯片市场主要由恩智浦、瑞萨电子、TI等传统汽车芯片巨头垄断&#xff0c;外来者鲜有机会可以入局。但近几年&#xff0c;包括高通、英特尔等全球各大芯…

【无人机】基于Fast行军树(FMT)求解无人机故障路径规划问题附matlab代码和论文

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

ElementPlus弹窗之后让外部区域可编辑

原始的el-dialog弹出以后外部区域是不可编辑的。 为最外层的父元素添加样式 同时给dialog本身添加样式